Вы видите копию треда, сохраненную 18 ноября 2019 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
• https://github.com/sosachbot/cppthreadhat/wiki
Ответы на вопросы:
• https://en.cppreference.com/w/
• https://www.cplusplus.com/reference/
Прошлый >>1492442 (OP)
Вонюче пукнул SEGFAULТ в тредик.
Плюсач, кроме самого языка который хуй выучишь от корки до корки, ну да ладно что необходимо знать, чтобы приняли на работу разрабом? Джуном пока офк (учусь пока в институте). Нужно обязательно знать буст? Слышал, что в индустрии кресты без буста не юзают почти, хз правда ли
С точным направлением пока не определился, но подумываю о сетевом направлении (распределенные системы, разработка протоколов, прокси и т.п.)
Вчера студентик собирался писать низкоуровневый сниффер с перехватом и модификацией пакетов. Мне бы такие амбиции.
>Сипипи ван лав
Скоро передумаешь.
>Слышал, что в индустрии кресты без буста не юзают почти, хз правда ли
Да нет, почти у всех свои велосипеды (по крайней мере в больших компаниях), лол. Разве что говеный asio почему-то популярен и всякие костыли для старых плюсов вроде плейсхолдеров.
>Нужно обязательно знать буст?
В вакансиях смотри, у всех своё легасиговно, это же не джава где есть спринг и всё.
> Скоро передумаешь.
Ну хз, уже почти год (был перерыв посередине, но все же) учу плюсы, писал уже вещи посложнее хэллоуворлда, но и пока не ебейший софт офк. Мне норм. Джаву пробовал учить - не зашла, говно какое-то из-под коня, имхо.
> Почему говеный?
А сам на чем пишешь? Просто есть тенденция доебываться до всех языков, но на практике в итоге самые обсераемые языки и юзают. Тот же пример джавы и макакаскрипта, лол.
>Потому что а) его апи неудобное и переусложнённое говно; б) сосёт хуй по производительности у всего, чего можно.
А какой сетевой API тогда юзать на плюсах? Qt Network? Poco? Я удивлен, кстати, почему Qt менее популярен, чем буст. Как по мне, фреймворк пиздец какой сильный, и документирован гораздо лучше буста хотя мб я просто нихуя не понимаю и вообще долбоеб
Собстно главная проблема qt в том, что это фреймворк. А буст - лишь набор библиотек. Если тебе нужна только сеть - то тащить QT это пиздец.
Привязывать функциональность к гую моветон.
Самый главный вопрос в том а нахуя тебе вообще сеть и с++. Для задач с++ как правило синхронного апи достаточно.
мимо
Один из проектов - простой мессенджер с прикрученной OpenSSL либой, чтобы совсем уже ламерским не был. Не хотелось бы его писать без гуи, хз.
Есть еще другой проект, его буду делать без гуи
>но на практике в итоге самые обсераемые языки и юзают.
Я же говорю — попишешь на них пару лет и тоже будешь считать говном, очевидно что я на них пишу. Но по фатку — они ебать говно. Просто все умудряются делать альтернативы еще хуже, лол.
>Как по мне, фреймворк пиздец какой сильный
Потому и не юзают — придется тащить такую кучу говна в проект что ты ахуеешь.
А еще он под лгпл растпространяется, и это рак.
>А какой сетевой API тогда юзать на плюсах?
https://github.com/microsoft/cpprestsdk
https://github.com/facebook/wangle
Да хоть свою обвязку над какой нибудь libuv напиши, даже это лучше будет.
Потрясно. В моих краях много вакансий на плюсы, но яхз что учить чтобы быть хоть минимально востребованным джуном. В описаниях вакансий расплывчато мямлят, часто требования к скиллам в мультитрединге, но больше никаких подробностей.
Это нормальная ситуация в мастере, для того релизы и лежат отдельно.
>но яхз что учить чтобы быть хоть минимально востребованным джуном
Если это ебеня — то можешь смело C++Builder 98 учить, лол.
Если это мааасква или просто предприятия делают что-то про графику/какие нибудь вычисления хуйнии — то там нужно знать что нибудь про математику и иметь какую-то базу в плюсах.
Короче, пока не сходишь на собеседование — не узнаешь. Первые пару раз энивэй обосрёшься.
У меня на 7.0 и 7.2 иде не хочет работать. У кого также?
Я не живу в стране СНГ. Здесь плюсы и для блокчейнов юзают, например. Ну и для автономных машин, всякого йоба-имбэддэда, распределенных систем и т.п.
Я вообще не очень люблю qt, потому-что это диалект, и, когда пердолил их, использовал verdigris. Но это была хорошая попытка самоутвердиться на дваче.
Какой диалект? Это просто набор классов. Вот буст - это больше похоже на диалект, особенно древний код, пестрящий макросами из буста.
*проект на qt
Это всё даже в снг есть, но тебе уже писали, что в эти области без опыта не попасть, про то и речь. Если ты конечно не заканчиваешь какой нибудь вузик лиги плюща. Разве что в йоба эмбеддед уровня магнитол на Qt, лол.
Алсо, буста в этих областях точно нигде нет. Правда, для типичной работёнки, куда возьмут без опыта скорее всего будет нужен, так что придётся пострадать.
Кастомная сборка настолько панацея без кучи зависимостей каждой библиотеки от кучи других, что уже не первый год почему-то мутят Qt lite.
Пофиксил через откат по хешу комита
Надо знать как работать с гитом, основные приемы, по крайней мере. Структуры данных/ алгоритмы пусть на самом простом уровне.(в идеале написать свой вектор, стек, очередь, чтобы знать что там и куда) Но это в принципе для любого языка нужно, разумеется.
>>03501
Ну так напиши на WinSock (сокетам беркли если красноглазый) и все.
Там не особо много придется мучиться.
Это вас стало слишком мало.
Сейчас бы гореть с того, что линуксоидов любя зовут красногоазыми, мде.
Я точно не тот кто то местный на кого ты подумал, но вообще да, я на венде работаю, потому что не было причин перекатываться на Линукс, давайте не устраивать тут подобные срачи.
{&i-numbers.begin(),&b-numbers.begin()}
Надо вывести позиции элементов i и b в векторе.
Сами элементы получаются вот так
for(const int& i:numbers)
for(const int& b:numbers)
>вообще да, я на венде работаю, потому что не было причин перекатываться на Линукс
Ну и молчи в тряпочку, ущербный, этот тред дети читают
>вектор, стек, очередь
Это несерьезно. Ладно там AVL дерево или реализация графа с большим количеством алгоритмов, а это хэллоуворлды, нужен софт посерьезнее.
> сокетам беркли если красноглазый
Выходит громоздко и некроссплатформенно (только если не выдумывать костыли), да и гуй хочу к нему прикрутить, чтобы норм смотрелось.
>Ладно там AVL дерево или реализация графа с большим количеством алгоритмов, а это хэллоуворлды, нужен софт посерьезнее.
С софтом посерьезнее ты станешь оверквалифаед для джуна и попадешь в неприятную ситуацию, когда ты на 50% мидл, а на 50% криворукий хуй, не могущий тикет в трекере заполнить.
Не откладывай поиск работы, после устройства ты откроешь много нового, например то, что велосипедостроение библиотек на графах не является чем-то хорошим и продвинутым.
В прочем написали {&i-&numbers[0],&b-&numbers[0]} и всё заработало. Странно, учитывая что &numbers[0] и umbers.begin() должно быть одним и тем же по сути, или я не прав?
Ощущение что джуны это люди которые знают что такое С++ и иногда им пользуются, почему такие низкие требования? От джунов вообще ничего не ждут чтоль?
Я уже накостылил. По мне так вышло вполне симпатично
std::pair<std::size_t, std::size_t> two_sum(const std::vector<int>& numbers, int target) {
for(const int& i:numbers)
for(const int& b:numbers)
if(&i < &b && i+b==target)
return {&i-&numbers[0],&b-&numbers[0]};
}
А теперь замени вектор на какой-нибудь другой контейнер, который не хранит данные последовательно или хранит данные разного размера.
И вообще, арифметика указателей - это плохо
С чего ты взял, что они низкие? Если я буду брать джуна, мне будет намного интереснее, как он работает с существующими либами (насколько быстро может выбрать нужную, въехать), чем то, может ли он написать 1000 имплементацию алгоритма из учебника Кормена. Лично я нашел первую работу, показав 1 коммит строчек на 100 в не очень популярный опенсорсный компилятор.
А за 10 лет коммерческой разработки с графами я не работал вообще ни разу.
Естественно с подобными скиллами ты работу найдешь, но на самом деле ты слишком жестко к себе относишься.
>велосипедостроение библиотек на графах не является чем-то хорошим и продвинутым.
Я это прекрасно понимаю и именно по этой причине я хочу написать софтину с испольхованием Qt или Boost, это даст мне гораздо больше, чем писать имплементации структур данных
И какие самые такие важные и часто используемые библиотеки какие ты бы спросил?
Что в крестах нужно знать наизусть? Чтобы от зубов отскакивало, без гуглежа. Весь STL? Какие-то критически важные фичи из 11/17 стандартов?
Подводные камни
//Код
switch(0) {default: {
//Код
}}
//Код
1) Составляешь список возможных библиотек
2) Смотришь по какой больше всех вопросов на стековерфлоу
3) Юзаешь её!
Получишь больше денег (если ты индус с построчной оплатой).
Я иду на конфу с первого пикрила >>03420 (OP)
https://blog.feabhas.com/2017/02/abusing-c-switch-statement-beauty-eye-beholder/
Там где Abuse ahoy начинается
Выдает километровую ошибку. text, t - строки
Блядь, вопрос-то не написал
А вопрос вот какой:
У меня есть указатель на байты и количество байтов
Как мне с такими нехитрыми входными данными преобразовать байты в cpp-шные классы?
Допустим, вот что есть на входе:
02 05 01 00 03 31 32 33 04 01 00 DE AD BE EF
По порядку:
02 - количество пакетов
05 - тип первого пакета(сообщение из чата например)
01 00 - id отправителя строки
03 - длина строки
31 32 33 - сама строка(123)
04 - тип второго пакета(какие-нибудь координаты)
01 00 - id того, кому принадлежат координаты
DE AD - координата X
BE EF - координата Y
В коде у меня есть типы message_chat_t и message_coords_t
Как создавать объекты, имея эти данные, чтобы сохранялась масштабируемость? Подозреваю что нужна какая-то фабрика, может быть даже абстрактная.
Сейчас я делаю это вот таким монстром, выглядит отвратительно. Хочу как-нибудь через шаблоны. Подскажите, в общем.
Да, я уже понял. Почти 40 минут ебался. Хоспаде, что мешало это говно перегрузить. И как же хочется нормальные сообщения об ошибках.
Волшебство
Шизик доказывает, что неведомая хуйня это нормально
> В глобальном неймспейсе (но не в глобальной области видимости
Что это значит?
>чтобы сохранялась масштабируемость
Если бинарное представление определяешь ты, то можно библиотеки де/сериализации, типа протобуфа. Хотя если вариантов данных мало можно и самому набайтоебить.
Лучше без этой параши. Это блядь худшая библиотека в мире, еще и с кучей бинарно несовместимого говна
Ну вот я и интересуюсь, как мне это сделать. Это же весьма распространённая задача, я уверен.
Это бинарный парсер. Если писать с нуля, набор функций
int read_int(stream) {...}
float read_float(stream){...}
vector<int> read_int_array(stream) {
int length = read_int();
for (length) {
yoba.push_back(read_int());
}
}
Дальше пишешь функцию read_class, который распарсит поток и создаст класс.
Можно писать не с нуля, а задействовать iostream (пишу этот пример не потому что фанат iostream, а чтобы ты увидел архитектуру подобного говна)
std::istream& operator >>(std::istream &is, vector<paket>& pakety)
{
int kolvo_paketov;
is >> kolvo_paketov;
while (is-- > 0) {
paket novy_paket;
is >> novy_paket;
pakety.push_back(novy_paket);
}
return is;
}
std::istream& operator >>(std::istream &is, paket& pakety) {
int tip_paketa;
is >> tip_paketa;
//вместо свитча можно использовать всякую виртуальную поебень, но зачем
switch (tip_paketa) {
case 01: //парсим первый тип, и так далее
}
}
А так есть хуйни типа протобуфа, которые по декларативному описанию сгенерят подобный код. Но сам протобуф не рекомендую. Вроде у фейсбука было че получше.
Это бинарный парсер. Если писать с нуля, набор функций
int read_int(stream) {...}
float read_float(stream){...}
vector<int> read_int_array(stream) {
int length = read_int();
for (length) {
yoba.push_back(read_int());
}
}
Дальше пишешь функцию read_class, который распарсит поток и создаст класс.
Можно писать не с нуля, а задействовать iostream (пишу этот пример не потому что фанат iostream, а чтобы ты увидел архитектуру подобного говна)
std::istream& operator >>(std::istream &is, vector<paket>& pakety)
{
int kolvo_paketov;
is >> kolvo_paketov;
while (is-- > 0) {
paket novy_paket;
is >> novy_paket;
pakety.push_back(novy_paket);
}
return is;
}
std::istream& operator >>(std::istream &is, paket& pakety) {
int tip_paketa;
is >> tip_paketa;
//вместо свитча можно использовать всякую виртуальную поебень, но зачем
switch (tip_paketa) {
case 01: //парсим первый тип, и так далее
}
}
А так есть хуйни типа протобуфа, которые по декларативному описанию сгенерят подобный код. Но сам протобуф не рекомендую. Вроде у фейсбука было че получше.
Эмит прописан так:
emit pointAdded((Point*)scene->items().first());
Что я делаю не так?
Попробовал через точку останова влезть внутрь метода Qt и внутри пройтись, получил сообщение об ошибке, на пикче.
Парсер у меня уже есть. Вот с таким интерфейсом(пик1). Проблема начинается на сопоставлении айдишника и cpp-шного типа.
> switch (tip_paketa) {
Неудобно, т.к. при добавлении нового пакета хуй пойми куда надо залезать и править этот код. Мне нужна масштабируемость.
Из говна и палок я уже всё сделал. Работает это всё на пик2. Сами макросы вот тут >>03911
Я хочу без макросов.
Контейнер - это контейнер items из QGraphicsScene. В нем находятся QGraphicItem-ы. Point - это наследник класса QGraphicItem.
> на что законекчен сигнал
А слот же тут не важен, т.к. ошибка вылезает еще до отправки сигнала.
Что за буст? Боюсь, мне придется тратить кучу времени, чтобы его изучить, вместо того, чтобы заниматься делом.
>Неудобно, т.к. при добавлении нового пакета хуй пойми куда надо залезать и править этот код
На самом деле это максимально удобно: код парсера у тебя в одном месте, а не размазан тонким слоем говна по всему проекту. Захочешь задокументировать протокол - вон он, пожалуйста. А ты оверинженеришь. Эти макросы - это вообще пиздец.
Ну а так если, допустим, у тебя есть интерфейс IMessage и куча потомков от него, то достаточно создать
std::map<int, std::function<IPacket()>> вместо свича. Если ты не любишь интерфейсы, можно использовать std::variant с той же целью.
Далее остается наполнить мапу функцией типа register_message(int, std::function<IPacket()>).
Желательно правда заменить ридера на ридера/райтера, но это уже такое.
Чел, дебаггер не помог никак. Все, что он выдал - это сообщение на пикче выше.
Но я уже разобрался в проблеме. Оказалось, что это все таки на стадии коннекта со слотом, хотя я думал, что на стадии эмитирования сигнала.
Спс.
>Подозреваю что нужна какая-то фабрика, может быть даже абстрактная.
Ну да, она получает на вход тип пакета и выдает подфабрику/стратегию для этого пакета, которая считывает сколько ей надо данных и строит объекты или чего там тебе надо делает.
Слышал, но не знаю как их тут применить
Вместо лямбд можно хранить абстрактные фабрики, прости господи
Багоры говнокомпиляторов. У MSVC бояр такой хуйни нет.
если бинарный протокол нормально спроектирован, то его пакеты должны ложится на пожатые структурки вооб ще то
далается это специально для того чтобы ничего не надо было парсить или там считывать, а сразу накладывать структурки на кусок памяти в котором лежит собственно этот байтовый массив (в независимости от того прилетел ли он по сети, или взят с дисковой подсистемы)
с другой стороны, если ты этого не понимаешь, но уже работаешь на работке где требуется от тебя этих знаний то это не твои проблемы, а проблемы работодателя
если проще, в терминологии "мы вам перезвоним треда" ты обычный жулик
Ага, а потом надо оказывается передавать строки переменной длины, в пакетах есть необязательные параметры, нужна обратная совместимость, и ты в жопе.
это не такая проблема как ты себе представляешь
сетевой порядок байтов в правильных протоколах всегда big endian
они все тагже считываются
а если есть необходимость (для платформы с little endian), что прямо в числе уже свопаются через специальные функциий типа из posix - htonl(), тем более эти функции используют зачастую специальные инструкции процессора (на x86-64) они есть
Значит ты не так им пользовался. Опиши свои действия
еще и сажу влепил, ай лолд
ты накладываешь структурки на постоянные части пакета только
а переменные части пакета (типа строки) представляются как все те же указатели на начало переменной части и их длина
а вообще пакет у тебя будет представлен структурой, которая состоит из указателей на структуры постоянной части, указателей на переменные части пакета, пустых указателей на необязательные параметры если их нет и все такое...
я повторяюсь, этим ты достигаешь того, что по сути, НЕ парсишь свои бинарные данные
а нахуя их туда сюда по памяти гонять, они и так уже у тебя лежат, в том же замаппеном файле, если это разбор файла бинарного формата на диске..
при том что они бинарные
Да, меня учили старому стандарту языка, сейчас самостоятельно вернулся к плюсам и вижу эту хуйню. Вас ис дас? Типа обнуляет, вместо того, чтобы хранить мусор в неинициализированной переменной? Но мой g++ и так автоматически помещает 0 в неинициализированную переменную, а не мусор, как это было ранее или в си. В чем прикол тогда?
>мой g++ и так автоматически помещает 0 в неинициализированную переменную
Дед, ты че буянишь, опять нахуярился?
И эти скобки в языке уже лет 15, тебя вообще говну трилобитов видимо учили
Такой оверинжиниринг до добра не доведёт. Объекты и так весьма быстро парсятся, без таких велосипедов которые больше отнимут чем дадут.
> если проще, в терминологии "мы вам перезвоним треда" ты обычный жулик
чего бля
хех
очевидно же что если это бинарный протокол, то работать с ним нужно максимально быстро
а это значит не гонять данные туда-сюда по памяти..
так чтож это не какой ни оверинжиниринг
Теперь линкер не будет выёбываться на копии этой константы в нескольких TU
Flatbuffers vs protobuf. Protobuf круче, если что. Учитывая, что все нормальные люди будут данные сжимать, как ебанного шакала (а затем и шифровать), то твой лохопердолинг для экономии тактов проца нахуй не нужен. Ты походу забыл, что узкое место ващет I/O, а не проц.
С какими же уебанами приходилось работать, когда писал на плюсах. Вот такое говно пишет каждый второй. Натурально, в каждом коммерческом проекте свой вариант сериализации, часто даже не один. У вас в жопе чешется не взять эталонный protobuf, а написать свой, родной сериализатор? А потом уволиться и заставить страдать следующего бедолагу, который прийдет это говно саппортить.
Я использую бинарный протокол лишь для того, чтобы уменьшить размер пакета. Быстродействие меня устраивает, байты читаются и так весьма быстро.
Есть ненормальные, которым latency важнее чем throughput при потоке в пару гбит/сек
мимосижурядомсhftшниками
Ну, просто это первое, что приходит на ум. Сделаю через std::map<int, builder> - станет заебись же. А протобуф говорят лютейшая ебанина.
если у тебя есть яйца, выкидиваешь предыдущий код на помоечку, пишешь свой
Неквалифицированные уебаны тебе это говорят. protobuf - прекрасный, качественный, быстрый инструмент. Все его используют, потому что он просто охуенно сбалансированный и идеально подходит под прикладные задачи.
>>04247
Ну разве что. Хотя вопрос открытый - что лучше: в два раза быстрее передать и в два раза медленнее декодировать или наоборот. Хоть у тебя там и несколько гигабит канал связи, а ram в приличных современных серверах 40+ Гигабит/с. Чего уж говорить про кеши проца.
протобуфы в оригинальном гугловском варианте - полное говно. А вот Capn Proto, и прочие вариации - уже сильно лучше
Sheldon, Leonard, Penny, Rajesh and Howard are in the queue for a "Double Cola" drink vending machine; there are no other people in the queue. The first one in the queue (Sheldon) buys a can, drinks it and doubles! The resulting two Sheldons go to the end of the queue. Then the next in the queue (Leonard) buys a can, drinks it and gets to the end of the queue as two Leonards, and so on.
Write a program that will return the name of the person who will drink the n-th cola.
Ага, а то насколько я знаю он по разному код генерит если сразу видит возвращаемые значения для некоторых методов.
conpelyator
Пересмотри сериал, там это объясняется
int est_probitie = yoba_func();
В 2к19 какой вариант считается не говнокодом?
bool est_probitie = yoba_func();
Буду на собеседованиях спрашивать, как работает этот код и почему, когда нужно будет продавить челика с зп.
Больной ублюдок.
Говорю, что это говнокод и пояснять тут нечего. Твои действия?
Да я тебя сам продавлю и займу твое место с такими говнопримерами. Хотел альфача - получай.
>В чем прикол тогда?
std::vector v1(10,2); // содержит [2,2,2,2,2,2,2,2,2,2]
std::vector v2{10,2}; // содержит [10,2]
Пидора ответ.
Алсо, пикрелейтед можно ставить в шапку следующего треда
Но ведь всё верно слева написано.
> В любой статье о C++ на хабре минимум треть обсуждения будет посвящена Rust
Пидорасы везде вопят о том, как они долбятся в жопу, и как это здорово и прогрессивно. Это не значит, что долбиться в жопу - норма.
Как и не следует то, что это не норма, из того, что норма не следует из приведенного тобой утверждения.
и сразу нахуй
Но в последнее время я начал применять его и для обычных типов вроде int. Подскажите мне правильный путь.
odnajdi napisheh auto t = 4, kogda tebe nujna double peremennaya, i sosnesh
возможно мой пост останется не понят, но попробую объяснить:
дело не в самом расте
а дело в разработчиках мозиллы
они, в свое время сделали первый браузер (нетскейп навигатор), который по сути занимал весь рынок браузеров, а количество пользователей интернета тогда росло сумашедшими темпами
что они сделали? решили заморозить кодовую базу, не выпускать новые версии браузера, а переписать код браузера целиком, потому что он им, видители не нравился, ну и переписали за пару лет, сделали файрфокс
ну и что получилось? пока они переписывали все с нуля, они проебали рынок, по итогу, весь рынок захватил ie в 90е, те не было даже и конкурентной борьбы
об этом еще спольски писал в своих статьях как о примере настоящего коммерческого идиотизма
но, дзен заключается в том, что люди не учатся даже на собственных ошибках
и уже в нулевые, разрабы файрфокса решили наступать на те же грабли еще раз, но уже в большем маштабе: а именно не просто переписать еще разок кодовую базу файрфокс, но сделать новый язык и уже на нем заново все переписать
последствия этого мы уже видим: хром отжал и те проценты что были у файрфокса раньше по сути делит рынок с браузерами от майрософт, а файрфокс где то в жопе сейчас по количеству пользователей, держась лишь на фанатах и ретроградах
вообще, историю с разработчиками файрфокса следует рассматривать в экономических учебниках, как кейс о том как просирать бизнес
Я его использую когда переменная нужна в контексте какого-нибудь API, особенно если инициализируется она через этот же интерфейс, т.к. в этих ситуациях мне 100% похуй какой там хитровыебанный тип оно хочет. Ну и в шаблонной дрисне тоже, ясное дело.
uint32_t?
#pragma once
namespace yoba {
inline constexpr int var {1337};
} // yoba.h
Покатит? И в дальнейшем в .cpp файлах с включенным хэдэром yoba.h обращаться вот так: yoba::var
да
У меня наверное не самое популярное мнение: если auto может повредить твоему коду - у тебя говнокод.
Раст в отличие от нетскейпа не проёбан же. У него есть огромное преимущество - уёбищность с++. Это дырявое поделие стоило пристрелить ещё 20 лет назад
https://tsar1997.blogspot.com/
а зачем?
имхо, уж если и фирма хочет чтобы у ее сотрудников был доступ к бумажным книгам, пусть купит майерса последнюю книгу и "шаблоны" вандервуда второе издание
вот это действительно полезные книжки по крестам
#define
Обосрался.
1) Видишь упоминание монад - перед тобой ебанутый борщеед. Лапша из колбэков не является хорошим решением никогда, а ничем другим монадический код не является
2) Только вот раст от легаси-проектов на С++ не спасает, а наоборот. Теперь ты не только мучаешься со сборкой легаси, но еще и мучаешься с кривым растовским FFI. Короче тупо выкинь старый код и наслаждайся сборкой
3) Когда его сделают для С++, где останется раст?
4) Используй компилятор с таким же ллвм бэкендом, как и у раста
5) При этом отсутствующие нахуй темплейты. А значит, если ты хочешь простой обобщенный код - ебись с системой типов, как будто у тебя хаскель.
А язык, который старше С++11, не продакшен-реди, да. И пока он станет продакшен-реди, в слоупочный комитет запилит в С++ все, чего там не хватало, чтобы закопать раст
Пиздец, мне этот код чем то джава/донет парашу напоминает. Как мужик дефайни ебт.
>слоупочный комитет запилит в С++ все, чего там не хватало, чтобы закопать раст
Маня, ну расскажи. Как по-твоему в с++ запилят проверку заимствований без убийства всей крестовой системы памяти
Да это и ослу понятно, можно было не расписывать для этих дуриков. С++ - unbeatable programming language.
ты чё, пёс, ты чё? вот запилят в с++42 вменяемые модули, полетишь вместе с препроцессором на помойку
си с классами достаточно для любой программы
est
>Видишь упоминание монад - перед тобой ебанутый борщеед. Лапша из колбэков не является хорошим решением никогда, а ничем другим монадический код не является
>А значит, если ты хочешь простой обобщенный код - ебись с системой типов, как будто у тебя хаскель
Че еще спизданешь, неуч? Сразу видно неборщехлеба, судорожно выбирающего свой любимый ООП паттерн из GoF.
> Только вот раст от легаси-проектов на С++ не спасает, а наоборот. Теперь ты не только мучаешься со сборкой легаси, но еще и мучаешься с кривым растовским FFI. Короче тупо выкинь старый код и наслаждайся сборкой
В расте есть то, чего так сильно не хватает сообществу плюсанов - культура разработки и чувство прекрасного. Где FFI неудобный - напишут нормальный фасад к C/C++ либам и будут радоваться жизни дальше.
> Когда его сделают для С++, где останется раст?
>И пока он станет продакшен-реди, в слоупочный комитет запилит в С++ все, чего там не хватало, чтобы закопать раст
Перешел от отрицания к торгу, сектант? Вчера же буквально раст был нинужен и плюсы были идеальными. А теперь вон фичи заимствовать хотят из раста. Еретик, что ли?
>>04682
В clang-е уже пилят lifetime analysis. В течении года завезут. Пока будет опциональным в виде навешивания аттрибутов на функции.
Думаю в C++23 или в C++-26 это попадет в стандарт и у плюсанов появится свой родной borrow checker, который, как известно, не нужен, а надо ПРОСТО хорошо знать плюсы и уметь правильно писать код.
>>04701
>>04702
Щас бы двачерам вякать на хабр.
>проверку заимствований
это какая то хуйня, связанная с владением ресурсов и с правильной передачей владения
это что ли?
умные указатели, не?
хех, в 98м стандарте по итогу самый православный способ хранить константы был трюк со статической переменной в классе..
>прекрасный код
Ты на него дрочить собрался, что ли?
Из-за вот такой хуйни я жалею, что появилось что-то, кроме ассемблера и сишечки. Щас бы сидели как 80-ых и пердели в мейнфрейм под хруст магнитной ленты, программируя на бумажке.
Ебаные срачи про архитектуру, про фп vs императивка, про гейтса, про небо.
И никакой четкой аргументации с метриками или хоть чем-то, что доказывает, что вот ТАК быстрее, а так НЕТ.
Про уДоБнЕе и "у вас архитектура языка говно!!!" это вообще рот ебал. Унифицировать и гомогенезировать од паттернами можно только запил крудов.
Заимствования это же маняврирование когда оказывается что на одном move semantics жить нельзя. Как одно может проверять другое?
>И никакой четкой аргументации с метриками или хоть чем-то, что доказывает, что вот ТАК быстрее, а так НЕТ.
В этом суть моего наезда на ООП и GoF. В ООП есть большая почва для спекуляций и много бессмысленного срача как результат.
В FP как минимум такой хуйни нет. Есть substitution computational model - которая по сути сводит весь код без эффектов к обычной школьной алгебре и до 10 всеми применяемых паттернов у которых по факту нет альтернатив. В какой проект не прийдешь - там всегда будут одни и те же архитектурные приемы: ленивость, комбинаторы, монады, аппликативы и функторы. Ты ПРОСТО берешь и делаешь работу.
>Сразу видно неборщехлеба, судорожно выбирающего свой любимый ООП паттерн из GoF.
Сразу видно борщехлеба с кругозором ленточного червя. Мальчик, ты в своей жизни не видел нихуя, чтобы делать хоть какие-то вангования о собеседнике. Не позорься.
>В расте есть то, чего так сильно не хватает сообществу плюсанов - культура разработки и чувство прекрасного.
Тогда почему эти люди создали такой хуевый язык? Которому не 30 лет и он не тянул за собой сотни тысяч легаси-проектов, которые нужно было не поломать.
>сектант
Сказал хуй, который пришел в крестотред доказывать нужность раста
конепции fp плохо ложатся на семантическую модель с++
>в 2к19 кукарекать про скорость
Есть ДВЕ метрики по которым выбирается язык:
Средняя частота ошибок для продуктов с высокой ценой пиздеца в продакшене и среднее время запила новых фич для всего остального.
Другие языки (да, кресты тоже) нужны исключительно из-за легаси-говна.
>Есть ДВЕ метрики по которым выбирается язык:
В глазах неадекватного школьника черно-белым миром - возможно. Потому что школьники тупые и принять сложность окружающего мира не могут.
Ты спизданул - ты и доказывай. Почему именно две? Почему скорость не важна? Как ты пришел к таким глубокомысленным выводам?
https://devblogs.microsoft.com/cppblog/addresssanitizer-asan-for-windows-with-msvc/
Скорость неважна потому что купить час работы хардвари в тысячи раз дешевле чем купить час времени разработки. Поэтому вторая метрика применима в большинстве ситуаций. Применимость первой мной уже описана. К выводам я пришёл продаваясь кодопроизводящим конторам.
>>04774
Нет, я разгребатель крестописанины из 90х. Но пидор, да.
>баттхертит от вангвания
>в то же время вангует опыт собеседника
Мальчик, ты в своей жизни не видел нихуя, чтобы делать хоть какие-то вангования о собеседнике. Не позорься.
>Сказал хуй, который пришел в крестотред доказывать нужность раста
Не хуй, а уважаемый дядя-плюсовик, который пилил первые плюсотреды еще в 2014-2015. Так что да, у меня есть полное право называть тебя сектантом, сектант.
>Тогда почему эти люди создали такой хуевый язык
Ну давай для начала ты, школьник, объяснишь почтенной публике, почему раст - хуевый, а только потом я начну тебя по-отечески обоссывать, ок?
>>04777
И 10 лет не прошло. Наконец-то win-говноеды начнут использовать современные промышленные практики разработки на C++
>Скорость неважна потому что купить час работы хардвари в тысячи раз дешевле чем купить час времени разработки.
Ну то есть ты описываешь вебоговно, в котором С++ никогда и не был популярен.
>Не хуй, а уважаемый дядя-плюсовик, который пилил первые плюсотреды еще в 2014-2015.
В 2011 я ковырял компилятор раста с целью изучения llvm. Пройдет 3 года, и на дваче появится школьник, перекатывающий плюсотреды. Пройдет еще какое-то количество времени, и школьник станет фп-шизиком, уверенным, что вокруг все идиоты, один он умный. Иди нахуй, дядя-плюсовик.
>Если throughput, то на какой-нибудь jvm можно написать сопоставимо с C++.
На jvm легко баззвордами ссать в уши своему энтерпрайз-начальству.
> И 10 лет не прошло. Наконец-то win-говноеды начнут использовать современные промышленные практики разработки на C++
Линуксочмоня, у вас такого нет и никогда не будет. Иди в виме по памяти говнокод пиши, порождая кучу багов.
> Не хуй, а уважаемый дядя-плюсовик, который пилил первые плюсотреды еще в 2014-2015
Сука, заорал с этого успешного плюсовика. Нвидия-кун, сеньор-цпп-тян, ла-кун и прочие олды треда обмякли при виде этого БОЯРИНА!
Ну нихуя ж себе, вот это достижения! Целый llvm изучал в 2011.
Я в 2011 году писал промышленный парсер-синтезатор-анализатор vhdl/verilog и че теперь?
>Чего добился? Хотя-бы 300к зарплаты есть?
Именно столько и есть. Теперь завидую тому пидору из nvidia, который 350к зашибает Ну че там, поковырял bazel, пес?
>>04822
ОЛДЫ ТРЕДА!!111 орнул с тебя
> который 350к зашибает
Это только зарплата, тут акции подросли, с акций еще ~90, суммарно ~440.
Но вообще комично, что ты ЛЛВМ изучал в 2011, а я в 2014 только плюсы учить начал, и где ты, а где я.
Собстно, нвидия-кун
Ты попал в хорошую, богатую компанию - молодец, никто этого не отрицает. Но о твоем скилле это говорит опосредственно, потому что в процессе найма есть много вещей, которые от тебя не зависят.
Рядом с тобой наверняка сидят типы того же грейда и зп, но с опытом 10+ лет. Тоже комично, что они в два раза больше работают, а добились того же? Короче, мде
>Ну, мне кажется да, это достаточно забавно.
А мне кажется, что ты не понимаешь, что в твоей профессии есть некоторый потолок знаний и зарплат, за который, будучи обычным плюсовиком, выйти нельзя. Твои коллеги тоже могли за 5 лет дойти до такой же зп, что и ты. С чего ты решил, что через 5 лет на той же позиции ты будешь получать больше? Я тебе больше скажу, ты уже достиг потолка зп для данной позиции во всем мире. Даже если ты переедешь в SF, по чистым деньгам для тебя ничего не поменяется.
Что, все плюсовики во всем мире с опытом >5 лет - хуже тебя, потому что ты с 5 годами опыта начал зарабатывать как они?
>Даже если ты переедешь в SF, по чистым деньгам для тебя ничего не поменяется
В SF у сеньеров в гугле компенсация больше 300к долларов в год. Даже если около половины отдавать на налоги (сомнительно) это около миллиона на руки в месяц.
Бизнесменом. Либо топ манагером каким
жаль, что шутки про картофельную страну уже не актуальны
Говорить зарплата не совсем корректно, так как учитываются премии и акции.
>Я в 2011 году писал промышленный парсер-синтезатор-анализатор vhdl/verilog и че теперь?
Хуй в очо. Аргументы ad дядюм в жопу себе засунь. Монадический код - костыли и говнище, когда от бедности нет вменяемой альтернативы. Чтобы понять, что такое вменяемая альтернатива, можно сравнить код на Go и код для ноды. Или квиксорт на С++ и на хаскеле с использованием ST. Монады всегда говно, говно во всем. Не понимают это только ФП-шизики типа тебя.
И у ФП-шизиков с растом возникает конвергенция: ФП-шизики тянут язык в сторону ФП-параши, а сам раст и не против.
>Именно столько и есть. Теперь завидую тому пидору из nvidia, который 350к зашибает
Я зашибаю больше этого пидора, например. Просто я не пидор и мне неинтересно, когда меня обсуждают.
Сколько получаешь?
> А мне кажется, что ты не понимаешь, что в твоей профессии есть некоторый потолок знаний и зарплат, за который, будучи обычным плюсовиком, выйти нельзя.
Вполне можно. Можно и пицот получать, живя в Москве. Можно и 700 (привет, Хуавей). Потолок где-то в районе ебейшего принципал инженера, но там уже столько денег, что можно дальше и не расти.
> Что, все плюсовики во всем мире с опытом >5 лет - хуже тебя, потому что ты с 5 годами опыта начал зарабатывать как они?
Я этого не говорил. Но тут вспоминается кулстори с моей прошлой работы, когда ко мне подошел зам начальника отдела разработки с опытом 15 лет, и спросил, что такое std::move у меня в коде.
>>04847
>В SF у сеньеров в гугле компенсация больше 300к долларов в год. Даже если около половины отдавать на налоги (сомнительно) это около миллиона на руки в месяц.
Не забывай про то, что там безумная недвижимость, и очень дорогие услуги. Так что, равнять СФ и Москву по абсолютным значениям ЗП - глупо.
Ну и да, 300к для SF это мало, в том же FB можно 400-500 иметь.
Не мог бы ты пояснить нубу, что такое монады? Мне даже википедия не помогла, тупо не понимаю и всё
>Можно и 700 (привет, Хуавей)
А что, там реально столько платят? А-то ходят слухи, что в филиале в нашем мухосранске мидлам платят около 200, что для нашего городка как-то дохуя.
Нужно вычитать не только налоги, но и расходы на жизнь.
Вариантов несколько:
- R&D. Топовые спецы по ML вполне получают под лям в ДС
- Свой бизнес. Будешь забирать себе всю добавочную стоимость
- Блогер, актер, коррупционер
- HFT
- Можно накопить 100 лямов и вложить в акции. При доходности 12% годовых будешь получать как раз лям в месяц.
>>04847
С 300к после налогов останется 15к в месяц. После затрат на квартиру и жизнь останется 7-9к в месяц, что как бэ не потрясающие деньги. Вон у какого-то типа из netflix брали интервью. Чуви занимается chrome web tools и попал на топ вилки по этому направлению. Он сказал, что в netflix стало хоть что-то оставаться после расходов, а пока он работал в гугле, вообще в ноль уходил.
за 3, но у меня до программирования был хороший технический бэкграунд. Перекатился из смежной области.
>>04869
Говорят, что да. Сам я ходил на собес Писал в прошлом треде, дали 260 до налогов, рофл. Видать, там лидам+ хорошо платят.
>>04875
Майкрософт никогда не платил. И находится он далеко не в долине, а в Сиэтле, где жизнь дешевле.
Какая-то жиденькая аргументация от студентоты. Хуйни понаписал короче. Мл под лям, лол блять просто, сейчас все математики страны посмеялись хором.
Сам нагуглил https://habr.com/ru/post/445800/
Весь тред пиздаболов короче. Пол мильена они получают, ага.
Судя по-всему начал с этого года. Они на топ-1 ведь вышли, обоссав гуглы и амазоны и вообще всех сразу. В 500 в гугле не верю, даже в 300 не верю.
https://www.levels.fyi
Вот более-менее честные зарплаты.
Алсо - еще есть teamblind.com - там тоже их пишут.
>вполне можно. Можно и пицот получать, живя в Москве. Можно и 700 (привет, Хуавей). Потолок где-то в районе ебейшего принципал инженера, но там уже столько денег, что можно дальше и не расти.
Хуй с пальцем сравниваешь. Этих вакансий по пальцах двух рук пересчитать можно и там надо быть куда круче, чем стандартный плюсовик в nvidia вроде тебя. Круто, если ты туда доберешься, вполне искренне желаю тебе в этом успехов, но когда доберешься, тогда и поговорим. Попасть на зп 350к+ за пять лет - это, конечно, слегка необычно, но только слегка. На вундеркинда ты пока не тянешь.
>Я этого не говорил
Именно это ты и говорил, просто другими словами.
>>Сам я ходил на собес Писал в прошлом треде, дали 260 до налогов
Ну собственно ты сам подтвердил, что далеко не все околотоп компании оценивают тебя в 440к. Значит есть фактор удачи или совпадения твоих узких скиллов с конкретной потребностью работодателя в момент найма. Хотя судя по тому, что ты CI/CD настраиваешь, то скорее удача.
>>04869
700к платят там единицам. Мой бывший коллега туда ушел сеньером-плюсовиком на зп 280к. Это в ДС. Еще надо учитывать, что там офис-стойло с дешевыми перегородками и бывают случаи, когда китайцы-менеджеры смотрят на работников как на людей низшего сорта (это, правда, слышал давно и через третьи руки).
>>04880
В mail.ru есть датасаентисты, которые зашибают 600к+. Уверен, что в yandex research есть ребята, которые зашибают еще больше. Я очень сомневаюсь, что какой-нибудь Райгородский или Воронцов (они вроде не в отделе ресерча работают, но все же) зашибают меньше 700к. Хотя, возможно, у них вся зп - это сток и тогда разговор именно о зп у нас не получится.
Поподробнее?
> Хуй с пальцем сравниваешь. Этих вакансий по пальцах двух рук пересчитать можно и там надо быть куда круче, чем стандартный плюсовик в nvidia вроде тебя. Круто, если ты туда доберешься, вполне искренне желаю тебе в этом успехов, но когда доберешься, тогда и поговорим. Попасть на зп 350к+ за пять лет - это, конечно, слегка необычно, но только слегка. На вундеркинда ты пока не тянешь.
В следующем году на ревью должен 500к тотал-компа перешагнуть, и получить лычку Senior II (оно же +грейд). Босс слезно обещал хотя знаем мы эти обещания. Я, собстно, про себя и говорил, упоминая ебейшего принципал инженера. Это вполне реально, работая в одном месте долгое время, если контора большая.
> Ну собственно ты сам подтвердил, что далеко не все околотоп компании оценивают тебя в 440к.
Безусловно. Мейл.ру меня скорее всего вообще оценит в 150к. А какой-нить новгородский яндекс в 90к и карточку на обед. Однако нвидия оценивает меня выше, и этого мне достаточно.
>Хотя судя по тому, что ты CI/CD настраиваешь, то скорее удача.
Щас обидно было. Настраиваю, хуле делать, когда никто до меня не озаботился и шлепали говно.
>>04904
Вычитай налоги, помни про конскую аренду. И да, зарплату ты получаешь, а вот всякие акции должны еще завеститься. Т.е. этот доход далеко не сразу.
>Райгородский или Воронцов
Это уже не /pr/, а реальная наука с математикой и статьями. Такие люди код не пишут. Хотя я не знаю, с чего ты взял про
>600к+
Ибо такие люди сидят и очень медленно генерируют идеи. Они столько прибыли не приносят.
Да сказочник он. Ни в каких мейлру столько не платят. Усманову на кокс денег не хватит с такими расходами.
так можно только разругаться друг с другом и все
Ты абсолютно прав
алсо, раст не хуевый
раст не нужный тупа
держится на самоподдуве кодеров из мозилы
и, кстати именно благодаря тому что умные дураки из мозиллы решили второй раз переписать свой браузер, щас они занимают меньше 10ти процентов рынка, лол
Ага. Один чел получает больше всех остальных итт вместе взятых.
>700к платят там единицам
В 2019 даже реакт-макака как я делает изи 700к, ремотно естественно, не знаю в чем у вас сложности
мимо реакт-макака
Конечно есть, у меня 0, например.
50к, полтора года опыта, мухосрань 1кк
BOOL b - fun(x);
if ( (a + b) > 1 )
Это преобразование можно считать безопасным?
Ну, нас таких в конторе человек 10-12, условно уникальные.
Прикольно, конечно(особенно когда видишь результат работы), но как-то всё равно тянет в свободное время пытаться учить плюсы. Даже в паре случаев смог для работы написать утилиты на них, охуенная практика.
Почему ненужный? Он безопаснее и проще крестов, а по перформансу такой же. Пройдет лет 5-7 и кресты канут в лету, так как ёбщество поймет, что здоровенный дедуля-франкенштейн, источник кучи багов, нахуй ненужОн
Кресты переживут тебя и твоих внуков.
Как настроить округление, вместо 50.199999 выдает 50.2
А если написать 0.0000000 вместо 0.0?
Ты хоть приложи числа, которые в сумме дают 50.199999, а не 50.2.
Или попробуй float, может, будет другой ответ не факт, что будет, это только предположение.
А как же правило что функция при одних и оех же входных данных должна возвращать одно и тоже значение?
В релизе тоже, но использование неинициализированной переменной всё равно ub, было и будет.
Это для примера, у меня там 4 булла и нужно вернуть фолс, если хотя бы 2 из них true.
Ну так ты не делай bool b = fun(x), делай int n = 0; n += fun1(x) ? 1 : 0; n += fun2(x) ? 1 : 0;
Зачем тебе тогда static?
Обычно пишут что-то вроде
[code]
MyCls const & GetDefault() const
{
static const MyCls def;
return def;
}
[/code]
Если тебе хочется перед первокурсницами изъебнуться, то есть ещё миллион других способов, от статика отъебись
Мне тогда придется преобразовывать то, что функция возвращает + проебать на инт в 4 раза больше памяти.
Байт там, байт тут, в итоге уже проебал гигабайт
Не, вру, пиши как анон выше советовал. Точно такой же ассемблер получается, что и у тебя
портишь статистику
тут выше по треду получают 250, 430, 600, 700, .. один даже за миллион если в рублях пересчитать
а ты тут влез со своими 450 баксами..
Потому что там задротские задачи для которых нужно знать матан.
Сейчас вся DIY разработка SOC идёт на PHP5
В с++ это нормально. Локальные переменные выделяются на стеке в порядке объявления. А борроу чекера тонет!
>многопоточку спрашиваем
memory model и всякие false sharing или про ссаные rwlock и condvar из stdlib?
case WM_DESTROY:
{
Shell_NotifyIcon(NIM_DELETE, &nid);
DestroyIcon(hIcon);
PostQuitMessage(EXIT_SUCCESS);
}
return 0;
Не хочу с собой тоскать многомегабайтные гробы, которые тратят в 100 раз больше ресурсов, чем нужно.
Почему?
Мейерс сказал, что volatile для пидоров.
Там же объяснение есть.
4["abcdef"] == 'e'
Квадратные скобки -- синтаксический сахар, маскирующий выражение (a + b). Необходимо только, чтобы одно слагаемое было указателем, а второе числом, иначе выражение не имеет смысла. В твоем примере a -- указатель на начало массива, поэтому (1 + 3)[a] == ((1 + 3) + a) == *(a + (1 + 3)) == a[1 + 3]
Бля, самого ведь раздражает, когда люди про разметку забывают
>Квадратные скобки -- синтаксический сахар, маскирующий выражение #(a + b). Необходимо только, чтобы одно слагаемое было указателем, а второе числом, иначе выражение не имеет смысла. В твоем примере a -- указатель на начало массива, поэтому (1 + 3)[a] == #((1 + 3) + a) == #(a + (1 + 3)) == a[1 + 3]
Что за сайт?
На каждой трансформаторной будке есть пикрил. Если нет, то да - будка виновата
в любой книге по крестам тоже есть предупреждения про UB, однако ты их проигнорировал
Т.е. в той области, которую можно автоматизировать, крестовики полагаются на человеческий фактор. Всё ясно, тред можно закрывать нахуй
Я их не обязан знать. В компьютерных программах есть такая вещь, как защита от дурака. Если её нет - это плохая программа
это отличное хобби.
>Квадратные скобки -- синтаксический сахар, маскирующий выражение (a + b).
Но ведь я могу раздельно определить сложение, скобки и звезду для класса, и они никак не будут с собой связаны...
Конечно обязан.
Особенность с++
>The order that function parameters are evaluated is unspecified behavior. (This won't make your program crash, explode, or order pizza... unlike undefined behavior.)
>unspecified behavior
Чо бля?
Ты фанатик, гонишь меня из профессии хотя я просто указал на брешь в инструменте. Если бы ты работал дорожником, то кидал бы асфальт лопатой, а утрамбовывал ногами
Где там брешь?
Про JMP* инструкции процессоров слышал?
Компилятор парсит твой говнокод, идет целая куча йоба-анализов, если после них нет ошибок, то идет конвертация кода в ассемблерный листинг. Сборщик, ассемблер (не путать с ассемблИ), читает опкоды всех инструкций, превращая их из шестнадцатиричных значений в двоичные. На выходе получается object file, линкер потом связывает этот файл с shared libraries и на выходе получается бинарник с нулями и единицами, который процессор готов исполнять.
Вот так это сеньор-помидор обьяснил на пальцах
>Важно понимать, что unspecified и undefined различны, что implementation-defined это когда то ли true то ли false (и задокано), unspecified это когда то ли true, то ли false (и может быть не задокано и в худшем случае таки undefined), а undefined это когда bool не true, не false, а его чтение может отправлять команду форматирования жесткого диска
А насчет циклов: в языке ассемблера есть инструкции вроде jmp, loop, которые реализуют циклы. Вместо переменных - регистры, которые по сути являются контейнерами по 8, 16, 32, 64 бит (есть еще конкатенация регистров для операций умножения, но это уже из другой оперы) для нулей и единиц, пермутации которых образуют самые разные числа.
А вообще шел бы ты читать dragon book, sicp и прочую классику.
Это то, что нормальные люди никогда не видели, но от чего у манек-неосиляторов оче сильно полыхает.
Иди репорти тогда, умник. Посмеемся всем тредом над тобой.
Довен пока здесь ты, объясняй чему это ошибка компиляции, если ты подряд выделил инты, указав volatile, что они могут измениться вне обозримого для компилятора кода, затем взял указатель первого инта и с помощью арифметики указателей поменял значение в 4-м по счёту инте?
Вроде же Sdl более высокоуровневый, чем OpenGL.
И то и то, в первую очередь, мини-фреймворки для абстракции создания окна, оконных эвентов, клавомыши и прочее. Если ты хочешь и там и там нарисовать что-то сложнее квадрата\жпега - все равно придется использовать OpenGL в контексте созданного окна.
>>05429
Он дурачок, который ниразу не трогал системное апи, в котором бывают структуры типа:
struct yobastring
{
int length;
char[1] buf;
}
Чем тут борроу-чекер поможет, если все захуярилось через копирование, а не через move.
Так это 2 разные переменные в структуре. Первая - размер буфера, вторая - первый элемент. В винапи есть вообще адовый ад, где 2 строки в одной такой структуре. Т.е. у тебя размер первой строки, размер второй строки (начинающейся после первой) - и первый элемент
Ещё вроде loader перед самим выполнением, ну или же dynamic linker для .dll или .so
>читает опкоды всех инструкций, превращая их из шестнадцатиричных значений в двоичные
Эмм, какая-то тавтология вышла. Может, ты имел в виду, трансляцию из асм листингов в объект код (бинарный код)?
>идет целая куча йоба-анализов, если после них нет ошибок, то идет конвертация кода в ассемблерный листинг
Можно подробнее расписать - в более-менее йоба компиляторах на этом этапе ещё идёт intermediate representation, этот IR оптимизируется таргет-независимо, потом таргет-зависимо.
Ещё в самом начале препроцессор, кстати.
Линкер может тоже что-то оптимизировать и выкидывать.
Судя по тому, что ты сравниваешь local vars memory layout с object memory layout, то дурачек здесь только ты
>>05429
Во-первых, даже несмотря на volatile, никем и ничем не гарантируется, что локальные переменные будут лежать подряд или в том порядке, в котором их объявили.
Во-вторых, в нормальном прикладном коде арифметика указателей используется в исключительных случаях. Это просто не нужно, потому что ты работаешь с сущностями предметной области и они не должны зависеть от memory layout. По-хорошему такие операции надо обрамлять чем-то вроде unsafe {}, как в других языках.
Когда я писал про ошибку компиляции - это в смысле она там должна быть концептуально. По стандарту ошибки там нет и вообще это UB
Как мне передать указатель на функцию в метод register_client_message?
Сам метод пик1
Передаю на пик2
Определение методов на пик3
На пик2 выдаёт ошибку:
> error: no matching member function for call to 'register_client_message'
> note: candidate function template not viable: no overload of 'on_message' matching 'const std::function<void (std::shared_ptr<network::connection_t> &, const std::shared_ptr<chat_global_t>)>' for 1st argument
Хотя на пик3 видно, что эта перегрузка есть.
А что лучше использовать? Bind я часто видел в легаси-коде, во те времена ещё не было лямбд.
Ну так стек растет не в сторону увеличения адресов, хули. (&a0)[3] вообще за пределы стекфрейма выйдет
https://godbolt.org/z/nPySa0
Ну и вообще скажите, как вы сами реализовали бы такую схему.
У меня есть массив сообщений(login_t, chat_t, delta_state_t, etc), но все они хранятся под типом message_t. Нужно вызвать для каждого из них свой обработчик on_message.
Ну и как мне кастовать из базового типа в дочерний? Без switch-case разумеется.
Можешь и в лямбду обернуть, но лично я, если параметры "длинные", пишу bind - так короче выходит
Визитор епта
Ну либо цепочка if dynamic_cast else..., либо храни variant и делай std::visit
ну или заведи enum с типами сообщений и в наследниках метод, возвращающий "тип", а потом switch, да
> без swich-case
> предлагает if-else и switch-case
Oh you
За std::visit спасибо, сейчас почитаю
Ох уж этот pattern matching из говна и палок. Не надоело говно жрать? В расте есть pm, между прочим.
Ну и уёбывай отсюда нахуй жрать говно в раст, пидор блядь.
Я рефакторю, разнося работающий код по неймспейсам. Раньше он не был таким длинным. Зато, когда закончу - работать с ним станет удобнее, я надеюсь.
Нужно банально бить длинные объявления функций хотя бы по запятым у параметров.
Плюс делать typedef'ы для умных указателей.
Я тебя на 3-м пике 2 аргумента, а на 2-м 1. Я не понимаю, что ты хочешь и почему ты считаешь, что это должно работать.
На 2 пике 1 аргумент, потому что метод register_client_message принимает 1 аргумент.
Вот очевидное решение https://ideone.com/O8JqvM
Ща подумаю еще
Про using/typedef/deduction guide не слышал? Я ахуел этот код глазами штудировать.
Но вообще там напрашивается виртуальный метод
Зачем сообщениям метод on_message?
А ты как бы сделал?
Сообщения приходят в виде байт. Я перевожу байты в C++-ные классы с помощью мапы <int, function<message(vector<char>&)>>на самом деле там интерфейс builder в значении, но не суть
Дальше запихиваю эти сообщения в vector<shared_ptr<message>> и работаю уже с ними. Хули мне остаётся то? И как этого избежать?
Орущая мелкобуква, от тебя воняет, отойди
> взятия адреса перегрузки
Чиво блядь? Если ты про bind и перегруженные функции, то тут уж да, оберну в лямбду. На весь проект >1kk LOC при переходе с буста на стд нашлось от силы десяток таких мест
Я ебу, это твой код. С абстрактной точки зрения, у тебя есть две задачи. Первая по id конструировать объекты. Это делает мапа из id -> function<message()>, который ты зачем-то обозвал билдером, хотя тебе было достаточно строчки
m_builders[T::id] = []() { return std::make_shared<T>(); };
Вторая - это работа с гетерогенным контейнером типа vector<message>.
У тебя в контейнере лежат черные ящики, о типе которых ты не знаешь. Самый нативный для С++ способ работы с гетерогенными контейнерами - это виртуальные методы. Почему они тебя тут не устраивают, я не знаю. Если не устраивают, можно о std::function подумать. Ну УЖ ТОЧНО тебе не нужно делать m_processors[T::id], потому что это такой кривой способ создать таблицу виртуальных методов, матчащихся почему-то не по самому типу, а по его id.
Ну и где тут дублирование?
и если знаешь тип сообщения, можешь делать static_cast и ЕБ ТВОЮ МАТЬ ЗАЧЕМ ТЫ shared_ptr'Ы туда-сюда тягаешь?
> m_builders[T::id] = []() { return std::make_shared<T>(); };
Сообщения из святого духа что ли создаются?
Билдер у меня выглядит вот так. Позволяет легко подключить новый протокол.
> У тебя в контейнере лежат черные ящики, о типе которых ты не знаешь. Самый нативный для С++ способ работы с гетерогенными контейнерами - это виртуальные методы.
Допустим, я сделаю виртуальный метод callback. В конструктор каждого сообщения буду передавать какой-нибудь messages_receiver_t, у которого в методе callback буду вызывать метод on_message? Я правильно понял?
>>05651
В смысле где? message::in::login_t например. Я пишу его 3 раза, хотя должен писать только 2(в вызове register_client_message и в объявлении on_message)
dynamic_cast уберу, он и правда тут лишний. А с поинтерами что не так? Мне использовать ссылки вместо них?
Eсть конечно. А еще говно в унитазе есть. Только это не меняет того факта, что всей этой залупе до Студии+Решарпера еще несколько лет разработки.
по твоей логике решарпер тоже сделан дошиком студентов из говновуза ИТМО. Алсо, как там твоя 32-битная студия поживает?
Позволь взглянуть на структуру твоих классов.
> А с поинтерами что не так? Мне использовать ссылки вместо них?
Конечно, если указатель не может быть nullptr. Иначе голый указатель (или то, что core guidelines предлагают вместо него). Если не собираешься становится владельцем - не передавай shared_ptr.
Назови мне фичи студии+решарпера (который бля сделан тем же JB), которых нет в clion
Нормально. Если ты пытаешься развести на жор памяти - то иди нахуй, дебаггер x64 и в отдельном процессе, а больше 4гб ide жрать не может.
Хороший отладчик
Лучшая IDE для крестов называется emacs. Все остальное провоцирует тебя говнокодить
какая вообще практическая задача у тебя?
>копеечные 200к
ты шутишь что ли? 200к для дс2 - безумные деньги вообще то
столько зарабатывают наверное только сотые центиля..
>к сожалению они не дают децильного распределения разделенного по областям деятельности
по каждой конкретной области в россии, имел в виду
то есть не посмотреть, например, конкретно для питера
только для россии в целом
Точку с запятой на прошлой строке поставил? Пиздец как так писать можно вообще, enter нажимай когда перестаешь строку видеть, оно само шифт добавит на нужную длину
Я на топовом железе жду зачастую секунд по 10, когда нажимаю F2 при курсоре на переменной (перейти к определению), вот что это за хуйня?
Точка с запятой стоит. На какой строке у меня проблема с написанием? Где я enter не поставил?
>скобки
>в инклудах
Лол. Инклуд с незакрытым неймспейсом это диверсия уровня #define true false а то и выше.
Ошибки из неоткуда появляются. До этого всегда 51 строка работала, а сейчас ошибка выскочила
где-то ты опять проебался со скобками
Я, конечно, могу быть старым пердуном-консерватором, но с каких пор в плюсах булевые операторы можно писать как and и or вместо православных && и ||?
всегда можно было, просто это никто не использовал, кроме странных людей без &| на клавиатуре. Собстно, та же история с триграфами
Какой же, повторюсь, пиздец - это действительно компилится.
Наследие тяжелого сишного прошлого, когда компьютеры были разными и у некоторых могло не быть символов & и |
Еще были триграфы https://www.oreilly.com/library/view/c-in-a/059600298X/ch01s06.html
> Я, конечно, могу быть старым пердуном-консерватором, но с каких пор в плюсах булевые операторы можно писать как and и or вместо православных && и ||?
В C++98 уже было. Ты настолько пердун, что кодил на плюсах до 98-го года?
>Так а почему тогда ошибка "пропущена ")" перед идентификатором and"?
>Ключевое/зарезервированное словое - нихуя не идентификатор.
Спроси это у тех, кто писал/переводил диагностические ошибки в твоём компиляторе.
>Квадратные скобки -- синтаксический сахар, маскирующий выражение (a + b).
Начиная с C++17 (или даже 14) между E1[E2] и *((E1) + (E2)) есть некоторая разница.
https://github.com/AI-Decay/ScreenDesktop
ньюфаг-студент
копирование в буфер обмена есть?
скрытие курсора есть?
скрытие оформления окна в режиме снятия скриншота с текущего активного окна есть?
а вообще винда десяточка умеет делать все это
разве что отложенные скриншоты не умеет и запись видеоряда
https://ru.wikipedia.org/wiki/Ножницы_(Windows)
https://ru.wikipedia.org/wiki/Снимок_экрана
вот видишь
все уже написано до тебя
программисты не нужны
>отложенные скриншоты не умеет
и это умеет
печалька для юных программистов
они ощущают свою ненужность
Пилю на бустах проект, хочу впоследствие прикрутить к нему гуи (таков проект, только в терминале он будет слегка уебищен), что лучше юзать? Не тащить же весь Qt из-за одного только гуи
Почему нет? Не понимаю этого "не тащить же весь qt из-за модульнейм". У тебя ограничение на размер приложения?
while(pow(++g,2) < 2500)
std::cout << pow(++g,2) << " " << temp << "\n";
g достигает значения 51? Разве цикл не должен завершиться на 50?
Не забывай, что pow работает с числами с плавающей точкой, и pow(50,2) может вернуть что-то вроде 2499.9999666
Не хочешь тащить - выбора мало. Чистый windows api или mfc, или дотнетовский windows forms через c++/cli
>тормозящее говно, иногда у qmake отваливается синхронизация с файлами и приходится перезагружать всю IDE
ноудискасс
bitor'd
Во-первых, почини вывод студии.
Во-вторых, ты мог сам загуглить ошибку C2280, ознакомиться с ее текстом и предположить, что же не так с тем классом, к которому ты пытаешься скастить.
Я это сразу как скинул увидел, но проблема была не в этом.
буст для юнит тестов, сфмл для отрисовки фигур. Вместо неё также можно информацию в консоль выводить, но тогда меньше баллов будет
тянуть 300+ пакетов буста для буст юниттестов это вин.
Ещё есть слухи, что в 2к20 лучше вообще взять хэдэронли catch2 и не ебать мозг с жирными либами для тестов.
если что-то очень небольшое - то imgui или nanogui
имя массива == указатель на его нулевой элемент (только если это си-стайл массив, а не std::array, который нужно передавать по ссылке в функции, чтобы изменить напрямую)
Поставь на F3
Просто есть ведь такая хрень (™p)[3]=&arr, которая почему то не одно и тоже что ™p = arr
Так используй CMake, нахуя тебе qmake? Лично я с qmake е работаю и у меня ничего не тормозит в сравнении с другими IDE.
Технически на linux, win, mac - одно и то же. Если массив не POD типов выделяется динамически, то у массива есть -1 элемент, в котором лежит кол-во объектов в массиве. Эту инфу потом считывает delete [] для вызова необходимого количества деструкторов. Насколько я помню, это - unspecified behaviour, так что вполне может оказаться, что указатель на массив и указатель на первый объект могут различаться.
Буду рад, если кто-то залезет в говностандарт и чекнет
> то у массива есть -1 элемент, в котором лежит кол-во объектов в массиве.
А если массив char? В -1 элемент количество ведь не поместится
> указатель на массив и указатель на первый объект могут различаться.
what_the_fuck_am_i_reading.jpeg
Компилятору похуй, он рассчитывает, что перед началом массива есть ячейка size_t.
> пук
Какие альтернативы у clion? Студия, которая работает как черепаха, не кроссплатформенна и весит 6 гигов?
Маня, не все сидят на винде и даже на винде не все сидят в студии. Я студию не переношу из-за тормозов. Отключаю в ней вообще весь интеллисенс и оставляю ее только для дебагера. Все остальное делаю в clion (а до стабилизации clion - в богомерзком eclipse. Да, даже сраный eclipse cdt был лучше студии+resharper/vassist)
ну и сиди без рефакторинга и с лагающим codecomplete. Алсо, как там, нормальное открытие исходников в отдельном окне уже добавили?
Вот поэтому он и говно. JetBrains - отвратительная контора для андроид разработчиков-пидоров.
Лично у меня рефакторинг работает и codecomplete не лагает.
> открытие исходников в отдельном окне
Я никогда этим не пользовался. А ты можешь сам написать плагин, если тебе это сильно нужно.
Что тебе не нравится в clion? Jetbrains один из лучших работодателей в россии, где прогеры решают действительно сложные задачи и получают очень хорошо.
За настолько сложные задачи нужно платить больше.
Старался использовать С++ как мог, сделал лямбда-функцию и использовал _cast. Разве что malloc на new поменять и умных указателей добавить. Как я ещё могу использовать возможности C++?
Охуенные истории
В смысле детский сад? 8.8мб чистого кода - это тебе не хуй собачий.
Нет, не в мегафоне. Платят 100к, хотелось бы больше.
Мань, начнем с того, что в твоем текстовом редакторе нет нормального отладчика, работа с которым занимает больше времени, чем написание кода. Тестов нормальных тоже нет. На этом можно закончить, это говноподелие от жидбрейнс не подходит для чего-то крупнее хеллоуворлда. Про написание драйверов и прочих низкоуровневых компонентов ос вообще молчу.
>8.8мб чистого кода - это тебе не хуй собачий
уговорил. Сколько компилится?
>>06185
>нормального отладчика, работа с которым занимает больше времени, чем написание кода
Интерфейс к отладчику есть, работает стабильно. А вот gdb/llvm работают херово, да. Поэтому я отладчиками практически не пользуюсь. Хватает тестов и санитайзеров
>Тестов нормальных тоже нет
Есть
Нет
Если в .h, который включается повсеместно, то да. Если в CPP что-то поправил - то только один файл пересоберется. Ну и перелинковать затронутое разумеется.
мимо собираю проект 1,5 часа с распределённой системой сборки
А если у меня cpp файл на мегабайт? Почему нельзя компилировать типо построчно где это возможно. Питон же так исполняется
> Я студию не переношу из-за тормозов. Отключаю в ней вообще весь интеллисенс и оставляю ее только для дебагера. Все остальное делаю в clion
windbg не пробовал? советую, если что
>Если массив не POD типов выделяется динамически, то у массива есть -1 элемент, в котором лежит кол-во объектов в массиве.
не, не у массива..
как правильно хранить (те сколько памяти нужно выделить, а потом удалить) лежит на реализации new[]/delete[], стандарту это без разницы, способ реализации он оставляет за теми кто будет реализовывать стандартну библиотеку..
>имя массива == указатель на его нулевой элемент
формально, это не так
формально, в некоторых случаях производится низведение типа
к примеру, при передаче по значению в функцию фактический аргумент типа массив низведется, и формальный аргумент станет типа указатель элемента массива
А где-нибудь можно взять core guidlines в pdfочке?
Хочу напечать, чтоб на бумажке читать от экранов уже глаза пиздец как болят, хочу бумажку
Потому что cpp на 1 метр - это лютейший пиздец и тем, кто хуярит такие файлы в 99% случаев надо нахуй отрубать руки, чтобы они больше писать ничего не могли
Ну ты советчик конечно, неосилятор со студией совладать не может, а ты ему дедушку windbg советуешь взять.
у google test тесты как тесты. много вариантов запуска у раннера, удобно. В целом похоже на все остальные тестовые фрейворки. boost test по функционалу победнее google test, но жить можно.
> Чем плох буст?
Стрельба ядерными боеголовками по воробьям
> Чем плох гугл?
не header-only
> Почему Catch2 лучше?
Header only, и не застрял в С++98, как буст
А как ещё? Ты, например, переставил местами поля в структуре. Формально изменения в двух строчках, на практике паддинги и смещения пошли по пизде во всей программе.
далеко не весь. У тебя от старой компиляции остаются обьектники, и при изменении и рекомпиляции - старые обьектники частично могут переиспользоваться, компилируя только измененный код
да, но если ты изменил 1 функцию, а еще 999 не тронул - то смысл перекомпилировать 999, когда их можно взять из обьектника? Собстно, студия так и делает.
А вот если ты сменил какую-нибудь там структуру, то перекомпилируется все, что ее использует. Но не вообще все.
почему дедушку
windbg активно развивают, постоянно выходят новые версии..
посмотри хоть скриншотики..
и есть еще типа WinDbg Preview, это новая морда к windbg, которая доступна в магазине windows//
Чем буст тест плох?
Так он и выясняет у тебя
Алсо, рейтаните кусок кода.
Уже нашёл баг в перегрузке метода create, не обращайте внимание
не библиотека а заголовок
Нахуя тебе parameter pack, если ты им не пользуешься?
Там стандарт на 1000 страниц с предупреждениями, хочешь сказать, ты его прочитал и всё наизусть знаешь?
Сколько ж ты шаблонного говна написал для 3 ссаных сообщений.
Да.
{
cin >> ch;
stackSymbol.push(ch); // помещаем элементы в стек
}
cout << endl;
stackSymbol.printStack(); // печать стека
cout << "\n\nУдалим элемент из стека\n";
stackSymbol.pop();
stackSymbol.printStack(); // печать стека
Stack<char> newStack(stackSymbol);
cout << "\n\nСработал конструктор копирования!\n";
newStack.printStack();
cout << "Второй в очереди элемент: " << newStack.Peek(2) << endl;
return 0;
Посоны а для чего нужен конструктор копирования.
Я лабу списал, но не понимаю как она работает.
:(
(Ну то есть там ещё h и срр файл со стеком)
Но примерно можете сказать для чего он нужен.
А то я довн. Или направьте меня куда нибудь нахуй по адресу.
послушай
комбинация std::variant в связке std::visit может использоваться как некий аналог динамического полиморфизма в крестах
но, блядь, зачем
когда у тебя есть проверенный десятилетиями пусть через гомогенные иерархии классов и виртуальные методы
std::variant в первую очередь как замена union, и в том числе для работы с встроенными типами; как один из инструментов type erashure, а не замена наследованию и интерфейсам
>знаком со средствами обобщенного программирования в С++ (templates);
Впервые такую формулировку вижу. И еще, сколько обычно отвечают на резюме, и отвечают ли на него вообще если ты не проходишь?
https://youtu.be/I0oerm0MYQY
Например написать функцию суммирования принимающую рандомное количество аргументов какого либо типа.
сикп
если вектор был создан непосредственно в методе, то его придется возвращать по значению, ибо в конце метода он разрушается и если ты вернешь его по ссылке - ты вернешь участок памяти с мусором вместо вектора. Если вектор был передан в метод, то возвращать его лучше, конечно же, по ссылке.
по значению, там будет либо (N)RVO, либо перемещение.
Вы видите копию треда, сохраненную 18 ноября 2019 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.