Вместо шапки - https://github.com/sosachbot/cppthreadhat/wikiОтветы на все вопросы - http://en.cppreference.com/w/ http://www.cplusplus.com/reference/Прошлый >>1437014 (OP)
>>1456115 (OP)может кто-нибудь устанавливал на линукс gRPC и protobuf? Я не могу разобраться с установкой. Вот так я устанавливаю gRPC https://pastebin.com/GmhTNf7Mпотом я устанавливаю protobuf тоже по инструкции. Но когда я пытаюсь скомпилировать пример из gRPC из examples, мне выдает ошибку будто у меня нет grpc_cpp_plugin. Я гуглил эту ошибку, и оказалось, что этот плагин должен лежать в папке usr/local/bin. Но там его не оказалось, а этот файл лежал в grpc/bins/opt вместе с плагинами для других языков. Но разве после sudo make install этот файл не должен был переместиться в usr/local/bin? Если я вручную копирую grpc_cpp_plugin в usr/local/bin, то эта ошибка больше не выскакивает, и теперь make не может найти ещё какой-то gRPC файл. Ещё я нашел что проблемы могут быть из-за разных версий protoc. Подскажите, как узнать, сколько у меня версий protoc? И мне кажется, наверное после сборки все файлы плагинов должны были сами переместиться в правильную папку? Я не знаю толком cmake, посмотрите пожалуйста мои команды установки. Может там ещё что-то нужно было сделать. чтобы все файлы установились в правильные папки?
1. Почему std::hypot(arr.x,arr.y,arr.z) выполняется почти в два раза дольше (как для float, так и для double), чем sqrt(arr.xarr.x+arr.yarr.y+arr.z*arr.z)? 2. Если я группирую элементы по 16 байт и считаю расстояния через sse, получается где-то в 2.5 раза быстрее. И если группирую по 32 байта и считаю черезе avx, то получается такая же разница в 2.5 раза.Это нормально? Просто в процессоре заглушуку поставили, которая два раза по очереди использует sse-функцию?Любопытно, что _mm_sqrt_pd более чем в два раза опережает sqrt обычный.То есть я создаю фиктивный __m128d, куда записываю один double через _mm_set1_pd, считаю корень через sse инструкцию и получается немного быстрее чем стандартный sqrt, при том что я полностью игнорирую второе число.
>>1456538>1Ох, я открыл cmath, и там внутри вот это. Зачем это всё? Там же только дополнительные вычислительные ошибки накопятся, разве нет? Это же не целые числа, чтобы с переполнением бороться.
Привет знатоки. Мне надо зделоть массив констант, а-ля коэффициент синуса в 16битах бля ШИМ модуляции, на этапе компиляции.Знаю что ннадо использовать constexpr, но туплю немношк.Массив у меня будет чалиться во флеш памяти, потому он должон быть static const, к тому же он обязан быть глобальным ради прерываний. Вобщем нихуя не компилится у меня. Чо делоть то?constexpr ststic const uint16_t sin_array[SIN_ARRAY_MAX] ={0};constexpr void fill_sin_array (void) { for (int i =0; i==SIN_ARRAY_MAX; ++i) sin_array = 0xffff std::sin(180 / M_PI i);}void manya () { consexpr fill_sin_array ();
>>1456712Посмотри https://stackoverflow.com/questions/19019252/create-n-element-constexpr-array-in-c11
>>1456582Конечно. Без них там разница раз в шесть получается. O3/O2 одинаково работают. При O3 там по умолчанию ещё какая-то автовекторизация есть которую неплохо бы отключить для частоты эксперимента, "-ftree-vectorize", но я не знаю как её отключать, если я её не указывал и она сама.>>1456708У меня не msvc. >>1456712Можешь попробовать так: https://ideone.com/XzSyzPНо sin - не constexpr, придётся искать кастомную реализацию sin, лол.
>>1456716 я так не могу, у меня лапки микруха. Крайне нежелательно использовать стандартную либу. На крестах только потому что можно регистровые кишки удобно запихнуть в класс и не видеть этого пиздеца как можно дольше. Да и начинал учить ЯП с крестов а не с си.>>1456717>Но sin - не constexprДа ёб страуструпа мать. Идея как обычно хорошая, а реализация через хуй. Похуй, ебану прощще таблицу в файл.
Продублирую вопрос из 91Наверно ньюфаги всех тут уже заебали, но всё же спрошу.А если есть знания матана (по крайней мере понимаю о чём речь идёт), из-за специализации в вузике, но на плюсы в моей 600к деревне ищит только одна контора, то как качать скилл?Сейчас погрузился в глубины формнного индуского ада на wso2, однако всё же хочется перебратся на плюсы.Есть идея влится в какой нибудь опен соурс, но вот не знаю какой.
Анон, как настроить в VS вывод ошибок сети (буста) типа ec.mesaage() или e.what() на английский язык в русской шинде? В начале программы стоит setlocale(LC_ALL, "en_US.UTF-8")
>>1456712Стало интересно, нагуглил этоhttps://rextester.com/CRR35028Там какразтыке "кастомный синус" (я помню, что это была лаба в вузике). Выглядит годно, мне понравилось.
>>1456783Через ряд отвратительная точность будет, синус даже не непрерывный получается, если его нужно для каких-то производных или ещё чего использовать, если что. И суммировать нужно начиная с высших степеней, хотя бы уж, что впрочем тоже не помогает.https://github.com/gcc-mirror/gcc/blob/master/libquadmath/math/sinq.chttps://github.com/gcc-mirror/gcc/blob/master/libquadmath/math/sinq_kernel.cВот этот синус непрерывный. Не знаю что там с точностью, но он по крайне мере гладкий и непрерывный с кучей своих производных. Не вникал в алгоритм, но вроде бы там таблица+ряд.Ну для 16-битных уж точно проще использовать таблицу, чем констъэксприть такое чудовище.
Посоветуйте учебник похожий на книгу кернигана и ритчи, очень нравятся в ней задачи, буквально с первых страниц дают очень сложные упражнения.
Из js-треда гонять начали, поэтому сюда вкачусь со своим вопросом. Вопрос по поводу совместимости C и C++.Есть, короч, кусок Си-шного кода. Могу ли я его скомпилировать C++ -компилятором?
>>1456883Там вот эти циферки 16 и 1 - время выполнения некой функции test(); Как так получается, что скомпилированное с помощью gcc в 16 раз медленнее скомпилированного с помощью g++?>вроде он расширение подглядывает при компиле.Вроде не должен.
>>1456887Про время хз, а про расширение что-то было, но возможно еще на 4й версии, вроде ошибок насыпало, если расширение и майн его не устраивали.
>>1456887>скомпилированное с помощью gcc в 16 раз медленнее скомпилированного с помощью g++М.б. г++ с О2 посчитал сам и выпилил всё, кроме вывода ответа. Проверь без О2.
>>1456893Я понял. Функция test(); ничего не выводит и не возвращает и g++ ее за ненадобностью не компилирует.
Аноны, посоветуйте литературы об асинхронности и многопоточности. Использую буст::асио, да что-то здорово насосал, когда io_context запихнул в нехитрый тредпул из вектора.
Работая с памятью другого процесса я должен париться о страницах или я полностью работаю в виртуальном пространстве процесса и могу обращаться к любым его адресам виртуальной памяти (4 гб для 32 разрядных вроде и дохуя для 64 разрядных процессов). Почему некоторые исходники, которые я смотрел, чтобы найти значение в памяти получают информацию о страницах?
>>1457075для asio надо курить бустовую документацию, там все сложно. Для обычной многопоточки - книга товарища Вильямса
>>1457185Я читал msdn, выделил по моему мнению нужные функции, но в разных примерах пишут по разному. Где то используют регионы, а где то нет. Поэтому и спрашиваю
>>1456881Ты проверял, меняется что-то для g++, если сделать .cpp расширение?А ты в объектный код смотрел, там в самом деле нет функции test() или предположил? Мне действительно интересно, настолько ли умный компилятор.шо ж ты за извращенец, GCC на винде?
>>1457229>меняется что-то для g++, если сделать .cpp расширениеНе думаю.>А ты в объектный код смотрел, там в самом деле нет функции test() или предположил? Мне действительно интересно, настолько ли умный компилятор.g++Там в тесте rand вызывается. Так что test() таки существует и все rand() честно вызывает.Если поставить заглушку вместо rand, то test оптимизируется до ret и не вызывается.gcc, однако, гораздо менее агрессивен.От test мало того, что что-то остаётся, так ещё и в main инлайнится. Не ожидалчекал тутъ https://godbolt.org/мимо в кресты и асм не умею, не бейте
>>1457133Если через ReadProcessMemory - вроде похуй, он сделает все проверки за тебя и просто пошлет тебя, если полезешь в пустоту.
>>1457349Ну.. хуй знает? Я не встречал например. Мож им удобней так, чтоб лишнее не сношать и не терять время. Или начитались того, где сказано так делать.
Почему не работает?VirtualAlloc((LPVOID)1000, 5000, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READ);int a = (int)1500;cout << *a;
>>1457490Совсем ультрадебил?Аллок только пытается выделить память где указано, но если это указывает дебил - то может и в другом месте, он тебе возвращает адрес где выделил.
Не запускаются программы собранные в clion, пишет нет какой stdlibc++, та же программа собранная в codeblocks работает. В чем дело?
>>1457534[code]LPVOID M = VirtualAlloc((LPVOID)1000, 4096, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);[/code]M ссылается на ноль
>>1457615If the function fails, the return value is NULL. To get extended error information, call GetLastError.
>>1457622Делал. Ща покажу. извиняюсь за то, что я туплю. Я сегодня вообще думал мозгами отдохнуть и поэтому не напрягаясь пишу и читаю
>>1457638Всё могу, в clion встроена консолька, а когда понадобилось запустить программу отдельно я соснул
>>1457354Я думаю я понял. Так мы сразу проверяем регион на доступность и если он недоступен, значит программа его не использует и мы можем пропустить его.
>>1457643Зависит от задачи же, если тебе просто почитать по известным адресам - ReadProcessMemory, если делаешь велосипед с поиском значений в памяти - то да, лучше проверить куда лезешь, чтоб быстрее было.
>>1457645> Если делаешь велосипедThis. Я не могу сообразить как карасик в данном случае может быть быстрее тупо сканирования по байтам. Мне же сначала нужно построить бор, сканируя память, а потом искать. Если бы мне нужно было один раз построить и потом искать то согласен, быстрее. Но мне кажется будет лучше сразу сканировать в поиске нужного значения
Сап, крестоносцы. Поделитесь вопросами/задачками по плюсам, которые вам приходилось решать на собеседованиях. В основном интересуют вопросы по тонкостям языка
>>1457618Надо с него достать ошибку.Я не помню точно код, но на стэковерфлроу был вопрос с хорошей самописной функцией для расшифровки.
>>1457692set_target_properties(prjname PROPERTIES LINK_FLAGS "-pthread -static-libgcc -static-libstdc++")
>>1457695Ругается на pthread, без него компилится, ошибок не выдает при запуске, но сразу закрывается, как при открытии из проводника так и из консоли.
>>1457702> Ну это для пингвина/мингв либа.У меня мингв и стоитИ как я уже говорил, в code::blocks этот же код нормально компилиится а программа запускается и работает.Еще попробовал скомпилить через консоль, но винда пишет что g++ нет, хотя MinGW лежит в корневом разделе диска
>>1457716Наркоман чтоль? Либо запусти батник у мингв, либо сам в PATH окружения пропиши его папку, как сделано в батнике.
>>1457720Запустил, один хуй все сразу закрывается, пиздец какой то. Неужели придется на code blocks сидеть или студию ставить
Короче помогло прописывание в cmakeset(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libstdc++ -static-libgcc")Как вообще разобраться в работе компиляции и всего этого? Учебник не затрагивает эту тему
>>1457755>один хуй все сразу закрывается, пиздец какой тоМожет быть там просто программы выполняется полностью и закрывается и нужно что-то вроде system("pause") прописать?Запусти cmd, и внутри cmd пропиши путь к твоей программе. Тогда в консолке останется вывод твоей программы. В программе выводи числа, printf("1\n") - printf("16\n"), таким образом определишь в какой момент падает программа, лол.
Почему так происходит?[code] for (int i = 7; i >= 0; i = i - 1) { bool p = (value & (1 << i)); cout << p; }[/code]Если я в программе напишу value = 110, то все правильно. Выводится 01101110, но если ввести это значение с клавиатуры, то выведется 00110001. Может это связано с тем, что visual studio тип int8 определяет как char?
>>1458059Прочитал, что происходит при знаковом типе. Слева записывается бит знака. Но меня удивило почему это работает для значения, заданного в коде.
>>1458070Что фиксится, норкоман? В твоём коде из >>1458061 ты выводишь в двоичной записи числа 110 и 49.
>>145807849 не нужно было выводить. Короче я понял. Int8 для компилятора тоже самое, что и char, поэтому ведет себя странно
>>1457679>В основном интересуют вопросы по тонкостям языка Если тут все прорешаешь, то вопросы по тонкостям будут не страшны: http://cppquiz.org
>>1458490Нет, не правда. Там неплохие контейнеры, но нет никакой проблемы написать контейнер, которые в определённой задаче будут работать чуточку быстрее и тратить меньше памяти. То есть, там много настроек которыми можно попробовать это исправить, но использовать их сложнее, чем написать свой контейнер, на мой взгляд.
>>1458490Правда. В стандартной библиотеке все самое шустрое. Если уж не в ней, то в бусте точно. Манек, которые пишу не кроссплатформенные решения на коленке зато на 5% быстрее даже не слушай.
>>1458490Хеш таблица (std::unordered_map) там не очень. Хотя если тебе хранить меньше десятков/сотен тысяч элементов, то разницы нет.
>>1458724>Хеш таблица (std::unordered_map) там не оченьТеоретически, ты свой аллокатор можешь написать, чтобы память под каждый элемент не выделялась.
>>1458490Какой-нибудь small_vector где проаллоцировано пара десятков элементов не помешало бы.Или что-то вроде small string optimization, но для вектора.
Как сравнить указатель с числом? Как делить указатель на число? В общем как рвботать с указателями как с числами? И как сместить INT64, не на 8 байт, а всего на один?
>>1459405>к отдельному байтуuchar тебе в помощь>к отдельному битуСмещаешься оператором >> и обрезаешь ненужное &1
>>1459396>Как сравнить указатель с числом? Как делить указатель на число? В общем как рвботать с указателями как с числами?Разыменуй.int a = 228;int b = &a;std::cout<<b==a;
>>1459396>В общем как рвботать с указателями как с числами?reinterpret_cast<size_t>(p), наверное, где p - любой указатель. Или просто ((size_t)p).>Как делить указатель на число?Мне кажется, ты делаешь что-то не правильно. Зачем делить указатель на число? Может быть тебе нужен остаток от деления, хотя бы?>>1459405Картинка, наверное.
>>1459419А в обратную сторону сработает, если чуть подправить? Чтобы указателю присвоить значение? Или reinterepret_cast? Только сейчас о нем прочитал
>>1459427Ты смотри только аккуратно https://www.viva64.com/ru/t/0030/Зачем тебе это, не лезь, дибил, оно тебя сожрёт
Аноны, хочу сделать простую p2p сеть на Qt или что-то с бустом думаю это не принципиально, максимум сотня пиров будет, но не могу понять как ее правильно устроить. В подробности думаю смысла нет вдаваться, вопрос в чём: посоветуйте пример одноранговой сети с открытым кодом желательно не больше 10к строк на плюсах, с теорией знаком танненбаум , а вот как это всё делать вообще не представляю
>>1457647А до как узнать до каких пор считывать? Нагуглил функцию свойство процесса PeakWorkingSetSize. Но как его применить? Память то может в любом месте выделиться. Я вот не знаю как ос память выделяет. Может она постранично выделяет и тогда я смогу посчитать колличество выделенных страниц, следовательно уже прочитанную память. Так смогу понять стоит ли читать дальше или нет.
>>1459543Я за память не шарю, но много раз видел схему, где исполняемый код находится после данных. Я смогу определить, что кусок памяти исполняемый и прекратить поиск. Но что мешает разработчику пользоваться памятью за исполняемым кодом.
>>1459549Так наверное и буду делать. Но вопрос: память выделяется постранично или произвольно? Я конечно погуглю сейчас, но хочу удостовериться
>>1459607Услышал тебя.Добро. В таком случае у меня все схвачено. Я кабанчиком за код. Может по ходу вопросики появятся, надо будет обкашлять. На созвоне.
>>1459610Постранично. Размер страницы 4096 байт. Запрашиваешь информацию через VirtualQuery, фильтруешь регион, дампишь память и потом ищешь в буфере то что нужно.
>>1459731Я думаю, он о том, чтобы вектор небольших размеров все на стеке хранил, без аллокации. Спорная идея, лучше какие-то временные буферы использовать.
Нужен перебор всех комбинаций с инкрементом, то есть из ['a', 'b', 'c'] будет не[code]aaaaab...ccc[/code], аabcaa...Несколько дней бьюсь, но алгоритм в голову не приходит. Это ведь простое что-то.
>>1460366Обычно со временем приходит понимание что во многих вещах есть какие-то закономерности. Увидишь их, формализуешь, то кодить станет гораздо легче.
Решил проверить Великую теорему Ферма. У меня получаются целые числа со степенью = 3, если ставлю достаточно большой предел поиска. Что я делаю не так? Может, переменной c байт не хватает для нормального ответа?https://ideone.com/7yEe0Q
Что за напасть, подскажите, пожалуйста.Сегодня с утра встал, решил покодить. Внезапно частное от деления округляется в меньшую сторону до целого, хотя тип double.Вот буквально такой код:double z = 3 / 2;Alert(z);выдаёт 1. 1/2 выдаёт 0. Если задать z нецелым, то выдаст заданное как положено.Что случилось-то? Я сейчас крякну.
>>1460508У меня программа так написана, что cout для ответа отрабатывает только тогда, когда итог операции x^n+y^n=z^n целое число. Тут наверняка проблема с типами данных у переменных.
>>1460512То есть, если при выполнении x^n+y^n извлекаемый корень из суммы целое число, то cout отрабатывает.
>>1460518А с чем тогда сравнивать? Как определить, что число целое? Ну, то есть после запятой только нули.
>>1459602Это опять я. Нашел такое утверждение "Конечный адрес памяти равен ImageBase + ImageSize. Эти значения берутся из заколовка PE файла". Почему мне никто не сказал? Это же куда лучше того, что предложил я.
Как добавить элемент в вектор из указателей на строку? vector<char*> meh;meh.push_back((new string("Test")));Хуйня, да?
>>1459536>torrentК торрентам ведь нужно примагнититься, ну или каким-то образом узнать адрес пира, чтобы получить данные. У меня стоит задача написать распределённую БД, и после передавать по ней один и тот же файл. Я практически полностью понимаю как это сделать, кроме одного момента: как новый пир узнает обо всех остальных, если нет центрального сервера, который отошлёт ему список всех участников сети? В интернете удивительно мало информации по данной теме, ну либо я неправильно ее ищу, поэтому и прошу помощи хоть алгоритм примерный
>>1461426Бля да я учусь, просто для задачи одного файла достаточно. Мне бы сделать так, чтобы при появлении нового хоста он делал запрос ко всем остальным вот на этом моменте я и туплю, и получал текущее состояние файла, а дальше просто пинговал раз в пару секунд остальные ноды и сидел тихо пока управление не дадут.
>>1461474А зачем запрос текущего состояния?Зачем кто-то из участников сети должен знать об остальных?Просто раз в какое-то время участник бродкастит всем список файлов и их хэши, другие ловят, отличается - поехали качать разницу.Хотя не уверен, что для большого количества файлов это нормально сработает.
>>1461486Не так буквально.Широковещание здесь в том смысле, что не кому-то конкретному, а просто всем - кто смог принять сообщение, тот принял. Главный косяк этой системы будет в случае возможного модифицирования файла сразу несколькими клиентами, придется как-то разрешать конфликты.
>>1458724Сап. Есть формула, типаdouble f(double a){ return sin(a)cos(a) + sin(a)sin(a)cos(a) + ...;}Нужно ли самому, в 2к19, повторяющиеся члены рассчитать самому, типа sca = sin(a)cos(a), или няша-компилятор все сделает сам, и не придется лишний текст писать?
>>1461652Синус - не constexpr, выше где-то было обсуждение этого дела, так что не выйдет повесить это на компилятор.Но если ты найдешь формулу приближения и тебе не очень важна точность, то их уже можно вычислить на этапе компиляции.
>>1461660Спасибо, хороший сайт.С -O3 разницы нет, без оптимизации всё, конечно, в лоб.https://godbolt.org/z/Vke05x
>>1461678CLang, пидорас, почему-то не соптимизировал нихуя код, gcc и очевидно icc делают всё хорошо. Не ожидал от цланга такого, пиздос, я на нем сейчас собираю
Антоны, можете помочь?Я в ваших крестах не очень разбираюсь, я вообще из другого языка, но смотрю проект и тут такой вот блокМожете подсказать, что тут происходит?
>>1461788Нет. Здесь есть параметр OcrScaleFactor: его значение по умолчанию (не заданное, это баг), функции его сохранения в настройки и получения из настроек. QSettings хранит их в ini файле или в реестре (это в винде по умолчанию).GUI тут нет вообще.
Аноны, кто нибудь может посоветовать годную практику для тренинга многомоточки? С теорией разобрался, а вот практику придумать/найти не могу
>>1461877держи классическую задачку с сантой и оленями:Санта Клаус постоянно спит, до тех пор, пока не будет разбужен либо всеми девятью северными оленями, вернувшимися из своего отпуска, либо любыми тремя эльфами из его десяти эльфов. Если Санту разбудили олени, то он запрягает их всех в свои сани, доставляет игрушки и, наконец, распрягает оленей (отправляя их обратно в отпуск). Если же его разбудила группа эльфов, он провожает каждого из них в свой кабинет, консультируется с ними по поводу игрушек. После этого он выводит каждого эльфа из своего кабинета (отправляя их обратно работать).Санта должен отдавать приоритет оленям, в случае если его ожидают сразу и олени, и группа эльфов.
>>1461901>Санта должен отдавать приоритет оленямолени > эльфыалсо я не секу в вашем мл, в чем задача то?
Допустим, я рисую прямую QPainter-ом с помощью метода drawLine. Как мне потом обновлять состояние этой прямой? Ну то есть чтобы я ее двигал, и предыдущее состояние не сохранялось на картинке.
Ананасы, допустим я возвращаю из функции вектор по значению.Как понять: он копируется или перемещается? Вроде ещё есть copy elision. Он тут играет роль какую-то?
>>1461979Что за getVec()?Смотри. Допустим есть метод doSomething(). Ты можешь объявить его как vector doSomething(), тогда он будет возвращать вектор, а если объявишь его как vector* doSomething(), то он будет возвращать указатель на вектор. Используешь в зависимости от своих потребностей.Не совсем понимаю, что ты хочешь сделать, н овангую, что тебе вообще ничего не надо возвращать, а просто написать void-метод, который будет что то делать с твоим вектором.
>>1461965Пиздовать читать стандарт, там все сложно. Начиная с С++17 copy elision происходит обязательно, вроде даже всегда, но мув/копи конструкт/оператор= всё равно может вызваться уже после завершения твоей функции, например, если ты делаешьvector<T> hui = f();
>>1461984> Не совсем понимаю, что ты хочешь сделатьВозвращаю координаты соседних тайлов.Функция принимает на входе координаты тайла (жёлтый) и расстояние (радиус) вокруг которого мне нужно получить координаты (серые). На пике расстояние равно 2.
>>1461866>не заданное, это багС чего ты взял, что оно не задано? Статик конст в хидере только с С++11 можно прописывать.
>>1462002Ты слеп? >>1461965>>1462001И как я из итератора узнаю сколько элементов в векторе?Зачем мне его хранить всё время работы программы?
>>1461965тут сразу ошибки проектирования:вместо того чтобы работать с голым вектором, его следует обернуть в класс (к примеру набор неких "документов" у тебя будут хранится не напрямую в векторе_документов, а делаешь класс "реестр документов")далее в си и крестах значение функций чаще используется не для возвращения результата работы, а для кода ошибки/успешного завершения, а в случаях когда принято решение не использовать исключение, то тут и вообще нет выбораа результаты работы функций возвращаются через параметры-указателино в современном с++ делают по другому - возвращают результаты работы через владеющие смарт-пойнтерытакие дела
>>1462012>И как я из итератора узнаю сколько элементов в векторе? Зачем мне его хранить всё время работы программы?Я так понял, что у тебя таблица, и тебе надо для ее элементов делать какие-то действия с соседними ячейками. Если ты будешь возвращать вектор, содержащий соседние ячейки, это будет не очень быстро работать, если таких обращений много из-за динамичекской аллокации. Если он храниться все время программы, то лучше конечно вектор. Если обращаешься часто - кастомный итератор (в котором ты спокойно можешь хранить и размер вектора).
>>1462015> возвращают результаты работы через владеющие смарт-пойнтерыА это не противоречит принципам ооп?
Есть способ запретить для класса создание lvalue, но разрешить создание rvalue?Можно: Klass().method();Нельзя: Klass k; k.method();
>>1462017но "инты" то что то означают? разве нет? что у тебя там - длины хуйцов твоих половых партнеров или зарплаты бати за последние три годачто то они должны означать
>>1461965Если не накосячишь компилятор сделает RVO и копирования/перемещения вообще не будет. На современных компиляторах часто выгоднее возвращать по значению.
>>1462027Короче, профилирование показало что эта функция вообще не влияет ни на что.>>1462035> но "инты" то что то означают? Индексы массива и всё
>>1462047заверни это в обычную функциюв ней будет создаваться объект, вызываться его метод, удаляться объект
>>1462047>Хочу, чтобы объект удалялся сразу после вызова метода. Ему больше незачем жить.Тогда сделай конструктор приватным, а функцию Klass() объяви как friend. То есть создавать объект сможет только она.
>>1461755Нужно.Во флотах a (b c) != (a b) c, поэтому компилятор не сможет вынуть такие вычисления с плавающей запятой. Возможно --ffast-math или /fp:fast могут заставить игнорировать это, но фиг знает.
>>1462056>>1462047>ребят как бы побольнее сломать себе ногу?возьми молоток, и раздроби коленную чашечку!
>>1462030Фабрика. Ну и если тебе нужно чтобы метод вызывался только раз для каждого созданого объекта, но сам момент вызова не сильно важен то можешь сделать сам метод приватным а его вызов засунуть в деструктор. Тогда если ты сделаешь Klass() то метод будет вызыватся сразу (будет создан временный объект, сразу уничтожен с ваызовом метода). Если сделать Klass k; то метод будет вызван при выходе из текущего скоупа - если конечно это тебе приемлемо.
>>1462108Если это зафорсить, то можно заставить sjw, а следовательно и гугл вместе с другими крупными корпорациями, бойкотировать кресты. Тогда язык останется без поддержки и загнется.
Анон, а где в обычной программе в 2к19 я могу встретить указатели? У меня уже, не знаю, миллион наверное строк кода в проекте, а анальной звёздочки всё нет и нет. Везде референсы! Правда, шаред-птр из-за дизайна тоже нету.Почему тогда "указатели" так часто всплывают в какой-нибудь иные?Алсо, в сишечке почему-то нет ссылок, были бы не лишними констрефы
>>1462162> Анон, а где в обычной программе в 2к19 я могу встретить указатели?В старых проектах. В Си библиотеках.
>>1462162У нас в проекте оптимизация переиспользования памяти на бекенде. Здоровенный массив хранится в памяти одним сплошным куском, а наружу отдаются вьюхи, имплементированные как связка поинтер + длина. Хотя может быть для этого сегодня уже есть либы.Еще это нужно, если работаешь с QtQuick. Сущности из C++ в QML передаются через поинтер, а не референс.Гугл советует использовать указатели вместо неконстантных ссылок для передачи параметров внутрь функций. Типа так заметнее, что значение b мутирует: foo(a, &b)
>>1462182>а наружу отдаются вьюхи, имплементированные как связка поинтер + длинатипа std:string_view что ли?как вьюхи то сделаны? свои костыли?
>>1462182>а наружу отдаются вьюхи, имплементированные как связка поинтер + длинаили типа как буфера в asio сделаны?
>>1462087Gcc и msvc оптимизируют, clang только с ffast-math. При этом clang без ffast-math еще и sin-cos вызывает каждый раз, даже если встроенные функции использовать:https://godbolt.org/z/1tj_ng
>>1462162Ну вот мне иногда приходится ковырять PCM-аудио, там без указателей не так. Или сжатие, как например Хаффман (который я выпилил нафиг, ибо побитово Хаффмана делать это зашквар).
>>1462279Почему там без указателей никак? Там, вероятно, есть массив семплов, ну и передавать его везде через констреф в крестах. В сишечке то конечно, может быть даже цос и стоит на си делать.
>>1462293> Почему там без указателей никак? Написано в бородатых годах? https://www.youtube.com/watch?v=z0NfI2NeDHI
>>1462162Все системное программирование - это ехал указатель через указатель, потому-что си. В нормальном продакшен коде на современных крестах указателей должно быть минимум.
Есть программа, часть исходного кода которой не стоит опубликовывать.Могу я загнать эту часть в lib файл оставив только хидеры? При этом нужно, чтобы кто-то ещё мог дописать кода и скомпилировать. Это то что мне нужно?
>>1462538именно для этого почти все умные указатели могут отдавать свой сырой указатель который инкапсулируюттипа у себя в коде с умными указателями работаешь, а в старые библиотеки отдаешь сырые указатели на обработку
>>1462657конечно можешьно придется поразбираться, там много неочевидных вещей начиная с того что .lib файл может как содержать объектный код, либо только содержать секции импорта-экспорта и тому подобные заморочки
Object object = eta_funkciya_vozvraschaet_object();Учитывая RVO, гарантируется ли то, что в случае выброса исключения внутри функции объект останется нетронутым?
>>1462702точнее такObject object;try {object = eta_funkciya_vozvraschaet_object();} catch (...) { // объекту пизда? }
>>1462703>>1462702Мне тоже стало интересно и я накидал код на 30 строк. RVO происходит, только если я пишу "Object temp= make()", если я пишу в две строки "Object temp; temp=make();" (как в твоём втором посте), то там move-конструктор. То есть ситуации, когда в object что-то хранится и оно сломается просто невозможно достичь, потому что для этого нужно объявлять твой объект внутри try-секции, из которой он всё-равно никаким образом не выплестнется.>>1462701
Постоянно рука тянеться использовать unsigned вместо int во всевозможных циклах и сётчиках. Мол, умножение проще, сравнение проще.Имеет смысл, или устарело с момента выхода условного второго пентиума?И аналогичный вопрос для 64-битных программ, продолжать использовать 4-байтовый (unsigned) int или 8-байтовая переменна будет быстрее на (0.5%) из-за восьмибайтового выравнивания в памяти?
>>1462737Это очень норма, мне даже автокомплит vs2017 давал size_t для циклов. Как раз недавно классы делал, где решал, инт или size_t для размеров. Не очень хорошая ситуация происходит, когда делаешь вычитание, приходится тернарное сравнение делать:size_t a = 10; size_t b = 5;size_t ba = b > a ? b - a : 0;Бесит.
>>1462737Некоторые алгоритмы получаются немного проще, если позволить счетчикам уходить в минус. Unsigned счетчик при этом переполняется и приходится принимать дополнительные меры.
>>1462544Читаешь по N бит сразу. Лезешь в таблицу и смотришь, какой символ эмитить и на сколько бит нужно сдвинуться. В дофига раз быстрее и всё ещё просто, все нормальные посоны так делают.
>>1462863можешь рассказать личный опыт использования? что по твоему лучше сделано? буфера в asio, boost::interprocess или вообще сейчас string_view использовать?
>>1462737я хз, но если ты типа пишешь modern c++, то вообще можно без счетчиков, работаешь через итераторы и обобщенные функции
>>1462737Все арифметические операции над знаковыми/безхнаковыми одиеаковые благодаря дополнению до двойки. Также без разницы, использовать int32_t или int64_t - регистры-то одни. Хотя, если так уж интересно, посмотри таблицы Агнера Фога.
>>1456115 (OP)Привет, крестаны.Перекатился 4 месяца назад из джава-тырпрайз-манямира в десктоп-разработку, проекты у компании все на Qt.Вроде все и хорошо, но надо бы построить вменяемый DevOps тулчейн, пушто динозавры в нынешней конторе только-только осилили Git вместо SVN, и в настоящий момент катастрофически не хватает менеджера пакетов/зависимостей, пушто нынче каждый чих ведет к пересборке кучи проектов и ненужному мусору в Git.Беглый гугл подсказывает что есть Conan и Buckaroo, но по обоим исчезающе малое количество инфы. На какой стул лучше сесть?
>>1462936У меня обратная ситуация.Писал несколько лет десктоп на Qt в подобной конторе (где даже svn, а затем гит разворачивал сам, лол). Устав от низкой ЗП, которую еще и постоянно задерживают, и методологии разработки прямиком из 90х, пытаюсь перекатиться в джаву.Какие подводные?
>>1462902Если уж и байтоёбить, то надо еще учитывать сколько байт в инструкции. Поскольку буфер декодера маленький, 1 такт можно потерять.По хорошему надо тест проводить.
>>1462902>если так уж интересно, посмотри таблицы Агнера Фога. Интересно, посмотрел. Долбать fdiv/idiv тормозные, конечно, почти как квадратный корень.Пойду выпиливать все деления. И остатки от деления. Ужас, это получается лучше сохранить две размерности двумерного массива, чем каждый раз считать компоненты через / и %. А я то думал, это за один такт работает (для целых чисел) и для небольшого массива 20x30 можно через деление и один индекс всё делать.
>>1463224Если ты делишь на константы, то компиляторы умеют заменять деление умножением самостоятельно. Ручной вариант примерно такой(но смысла мало):unsigned long long k = 1000;//деление на 5k = 858993460;k >>= 32;printf("%lld\n", k); //200k = 1337 90;//деление на 1337k *= 3212392;k >>= 32;printf("%lld\n", k); //90Умножение pipelined и снимать результат умножения с порта можно каждый такт если нет data dependency.Если делитель переменная величина, то не могу ничего подсказать.
Если не сможешь избавиться от делений то AVX512._mm512_div_epi64 например. Уж лучше чем насиловать процессор кучей делений.
>>1462953>>1463026Спасибо, анончики. Буду посмотреть.>>1462972Ну так и чо, предлагаешь сидеть и не рыпаться, ждать пока кто-то другой соберётся и тратить по полчаса на каждую сборку? >>1463039> Какие подводные?Работа с тырпрайзной джавой превратилась из написания кода в написание конфигов для зоопарка генераторов кода, генераторов генераторов, генераторов конфигов для генераторов генераторов. И всё это с воплями ПОТОМУ ЧТО ЭТО ПОЗВОЛИТ СКОНЦЕНТРИРОВАТЬСЯ НА РЕШЕНИИ ЗАДАЧ ВМЕСТО НАПИСАНИЯ РУТИННОГО КОДА.
>>1463254>Ну так и чо, предлагаешь сидеть и не рыпаться, ждать пока кто-то другой соберётся и тратить по полчаса на каждую сборку? в смысле? у тебя будут компилится только измененные файлы (которые сам изменил или вытащил из гита), это быстро, линковка щас тоже быстрая тк линковщики неплохие щаса полную пересборку проекта под целевые архитектуры и прочее, с прогоном тестов и прочим делается на отдельном сервере ночами или как там у вас, в общем зависит от того как настроен ci/cd на фирме..
>>1463313> как настроен ci/cd> ci/cd> в компании перешедшей на Git в 2018 годуВот ты взялся надо мной стебаться мол я ещё молод-зелен процессы рабочие настраивать. А процессов-то того, нету.
Почему комитет не выпускает какие-нибудь одобренные\проверенные библиотеки вместо добавления всего в std?Что-то вроде буста.
An oft-asked question is why we don't propose this library for Boost, instead of proposing it for the C++ standard library.The short answer is that we are indeed planning to propose our reference implementation for Boost. It will be a great opportunity to get it into people’s hands sooner while we go through the process of standardization. Additionally, libraries like Boost.Container show that there is room in Boost for filling in implementations for compilers that do not provide a complete standard library.But submitting a library like this to Boost is orthogonal to submitting this proposal to ISO C++. C++ is still missing out-of-the-box access to a piece of fundamental and very common hardware.Источник: http://wg21.link/P1386R2
>>1463458> But submitting a library like this to Boost is orthogonal to submitting this proposal to ISO C++. C++ is still missing out-of-the-box access to a piece of fundamental and very common hardware.Короче, нужен какой-то менеджер пакетов?
>>1463471Они хотели сказать, что audio это фича, которая "ну вот очень нужна" поскольку звуковушка есть в каждой машине. Ну это то, как я вижу их слова. В std хлама ведь нету совсем. Надеюсь меня простят, что я так слова искаверкал.
>>1463506Что им мешает свое говно как либу сделать? Или добавить в буст? Клавиатура вот действительно в каждой машине есть
>>1463534По поводу либы, они даже сделали свою https://github.com/stdcpp-audio/libstdaudio. правда пока только для мака(винда говорят как только так сразу)Я у них в предложении похоже нашел ответ.Wouldn’t it be great if the basic functionality of talking to your sound card would come for free with every C++ compiler, as part of the C++ standard library? Not only would it allow one to write truly cross-platform audio code, but it would also lower the barrier of entry for learning.Видимо так. "truly cross-platform" меня немного пугает. Особенно когда некоторые пишут код с фичами, которые поддерживает лишь их компилятор.
Под типами и алгоритмами похоже имелось ввиду, что нужно будет предоставить типы аудио и их алгоритмы для стандартизации. Чел, ты бы хоть пояснил.
Насколько я знаю вывод в консоль медленный. Можно ли не дожидаясь вывода продолжить выполнение без использования потоков?
[code]UINT64 Address = 0;Address = reinterpret_cast<UINT64>(Address + 4096);Ошибка: C2440 'reinterpret_cast': cannot convert from 'UINT64' to 'UINT64'[/code]
>>1463567Поищи, как выключать синхронизацию плюсовых и сишных потоков - тогда cout'ы будут быстрее, но printf больше нельзя будет использовать.А если как хочешь ты - просто выводи на экран в другом потоке.
>>1463567Операции вывода какбэ буферизуются, если ты что то вывел в файл или сиаут это не значит что туда что то реально записалось, если ты принудительно не очистил буфер. Программа продолжает работать не дожидаясь реального вывода.
>>1463589>>1463595>>1463597>>1463598>>1463685Кому верить? И еще дополнительный вопрос. Как узнать самые медленные места в программе? Есть ли анализаторвы какие? И как понять во что упирается программа? Скорость чтения-записи маленькая и стоит снизить колличество обращений к памяти или еще что? Еще надо глярут че там у меня по занятости процессора. Если он занят на 25% то можно еще поток заебашить, а если нет то не надо. Я правильно рассуждаю?
>>1463951Каждый кусок дублируешь два-десять раз и смотришь стало ли медленнее. Если не стало, то тормозит что-то другое.Можно каждый кусок обвешать rdtsc-шками, 100 наносекунд оно тебе спокойно посчитает с неплохой точностью. А если специально в цикле на нескольких итерациях гонять, то там можно доли процента выцепить.
>>1463951Если тебе просто померить то >>1463964 неплохой вариант. Если что-то по серьезнее то https://software.intel.com/en-us/articles/intel-architecture-code-analyzer
Еще глубже: google - > performance analysis guide, работа Левинталя.Разбор cpu по евентам. Был еще guthub репозиторий основанный на его работе, но я потерял ссылку, если у кого есть скиньте сюда.
>>1464087Хм. Наверное, стоит сделать биттвое поле с юнионом, типаstruct Foo { union{ uchar bits0 : 1; uchar val; } field0; union{ uchar bits17 : 7 uchar val; } field1;} Структрка Foo займет один байт, и вроде работает uchar &p = *foo.field0.val;Условием сможешь чекнуть, что p == 0.Я не проверял.
>>1464095>>1464099Вообще я могу не заниматься такой хуйней. Я пытаюсь найти переменную в памяти другой программы. Вдруг разрабы заморочились и сделали такую переменную, что она размером несколько бит и начинается с 3 бита 2538 байта
>>1464105Анализировать целиком значение и сдвигом искать - по скорости будет также, если не быстрее. Естественно, чем больше известно входных данных, тем будет проще. Если знаешь точное число, можно взять его разрядную сетку, числа в памяти маскировать, сдвигать и сравнивать с паттерном. И спросить об этом в Си разделе, это их говно.
>>1464105Да, поиск сначала делай по целым числам, не нашел - двигайся по байтам и бери 1, 2, 4 или 8 байт в зависимости от размера паттерна
>>1464112> Если знаешь точное число, можно взять его разрядную сетку, числа в памяти маскировать, сдвигать и сравнивать с паттерном. Да я так и хотел. Обрезал до первого значащего бита и пытался так шагать. А потом вспомнил что я смешаю указатель на байт, а не на бит.
>>1464114То есть никакой долбаеб не будет хранить значение так, как я сказал? А всякие cheat engine найдут такое значение?
>>1464105https://ideone.com/rEMkatЯ бы вот примерно так написал, если на коленке, если прям по битам. Но это совершенно точно не самый быстрый алгоритм (быстрее подготовить 8/32 маски, и 8/32 верных значения, и прыгать сразу по 1/4 байта без битовых сдвигов), и он за границу массива выходит.Каким образом ты будешь идентифицировать конкретную переменную, если найдёшь, например, 623 мест с подходящей комбинацией бит? Или есть несколько пар дампа памяти и значения переменной, так чтобы можно было отсеять?>Вдруг разрабы заморочились и сделали такую переменнуюА на чём написана программа? Если высокоуровневый мусор, то шанс использования отдельных бит исчезающе мал, мне кажется, но точно не уверен.
>>1464139Сверху массив рандомных значений, просто чтобы потестить.find - то что нужно найти, size - его размер в битах.mask - хуита (маска) вида 0b0001111, на которую я побитово умножаю (через &) очередной байт.Далее, я циклом прохожусь по всем массиву (по каждому байту), но беру за раз по 4 байта (чтобы после сдвига там остались ненулевые биты, то есть значение размером в 27 бит этим говнокодом не найти(точнее, найти, но в любой позиции)), которые находятся в part.Во втором внутреннем цикле я 8 раз (по числу бит), бинарно смещаю этот part, умножаю на маску и сравниваю с нужным значением. Вывожу номер байта и бита, если совпало.>>1464145У меня работает, что там по стандарту должно быть - не знаю.
Вопрос по Qt. Безопасно ли создавать сигнал, который принимает аргумент по ссылке (как и слот)? Вроде как там автокопировние внутри при передаче в слот, но я уже не уверен.
>>1463951> Как узнать самые медленные места в программе?Можешь через профайлер прогнать. Он покажет какие функции сколько времени работы программы используются.А дальше уже можешь попробовать что-то в них поменять.
Предположим у меня есть пять функций Func1, Func2, Func3, Func4, Func5.Так как я не особо разбираюсь, я ввёл каждую из этих функций, но при этом мне нужно, чтобы при вводе cmd 1 выводилась функция 1 (сделано), при вводе 2 (после функции 1) включалась функция 2 (это тоже работает) и при вводе 1 (после функции 2) включалась функция 3 (а вот тут пиздец) и так далее. Типа такой цепочки действий. Если подскажете в каком направлении искать инфу, буду очень благодарен.Писал функции через if else, но не ебу как в int main указать поочерёдность выполнения каждой из них
>>1464391То есть чтобы на каждую функцию был выбор из двух действий, как, например в текстовом квесте
>>1464392>>1464391Нормально задачу объясни. Может уже есть какое-то решение.Конечные автоматы, вся хуйня
Господа крестовики. Как я понимаю при компиляции динамической или статической либы обязательно с ней в "поставке" должны идти хедеры, с помощью которых можно ссылаться на методы и сущности, коотрые определенны в либе из кода. А на этапе линковки или загрузки вызвы связываются с конкретной сущностью в бинарнике. Как именно происходит это связывание, если упрощенно? Препроцесситься хедер, потом обрабатывается компилятором/линковщиком и на выходе получаем имена сущностей, определенные в хедере, которые потом ищуться в символьной таблице подключаемых библиотек? Т.е. меня интересует этот вопрос в таком контексте что если хедер библиотеки как-то не так обрабатывается при компиляции, например используются другие правила для манглинга имет функций, то на выходе мы получим ошибки линковки/загрузки?
>>1464391Не понял. Ты во всех случаях вбиваешь 12345, или ты можешь ввести 13, и у тебя должна активироваться третья функция после первой?Может быть тебе нужен массив указателей на функции, чтобы их можно было вызывать по номерам? Не знаю что ты хочешь сделать, но если у тебя пять функций где логика привязана к номерам функций, то это то что тебе пригодится. И матрицу/таблицу переходов прикрути. В твоём случае 5х2. Есть одна из пяти функций и ответы 1/2, при которых осуществляется переход на функции с номерами указанными в матрице. Например, так: https://ideone.com/uMscJD
>>1464391стейт-машина, конечный автомат..гугли..вариантов реализации масса, самые простейшие это комбинация if-else с флагами состояний либо таблицы выбора..есть и более сложные подходы..
При добавлении элемента в вектор, если не будет хватать места, весь вектор будет перемещен в другую область памяти, все верно? Можно как то это контролировать, ведь по времени это явно затратнее, чем просто добавить элемент?
>>1464554есть еще дек, он хранит элементы другим способом - чанкамипоэтому получается что дека на вставку будет быстрее работать чем вектортут нужно делать выбор в зависимости от задачитак как вектор хранит все данные одним куском памятиэто дает скорость при прямом обходе элементовв то время как очевидно что в деке прямой обход будет чуть-чуть медленней тк придется скакать между чанкамитак же вектор может отдать свои данные одним куском своей сырой памяти, при помощи вектора удобно работать со старым сишным кодом, которому нужны массивы и сырые указателис деком же так не получитсяпо итогу, вектор получается универсальней, за счет увеличения амортизационной сложности на вставку
>>1464671помимо вопросов, связанных с производительностью и с совместимостью с сишным кодом, как минимум еще нужно помнить о том что некоторые контейнеры и контейнерные адаптеры "портят" итераторы и сырые указатели на их элементы, а другие - не портятопять же, выбирать контейнер следует исходя из требований задачи
>>1464668ну а вообще, конечно, дакогда примерно знают, сколько места займет вектор, то делают предварительный reserve(), возможно c последующим shrink_to_fit() - щас он в стандарте, а раньше делали трюк со swap()это позволит сделать оптимизацию по времени для интенсивных вставок в вектор, при первоначальном заполнении, например
Дебис в треде. Пишу залупу с потоками и для потока пикрил получаю ошибку 2893 и 2672. Нихуя не понимаю как лечить.
>>1464805Лучше ибупрофеном, так дешевле.А с потоком что делать? Проблема в сигнатуре, причем явно ругается на типы значений, но в чем конкретно проблема я не пони.
>>1464811Охуенное описание ситуации в целом и проблемы в частности. Тут же весь тред наизусть помнит коды ошибок 2893 и 2672. Просто помогать не хотят и траллируют.
Как по нормальному передать в приложение параметр utf-8? Через аргумент командной строки слишком трудно, да и вроде бы не на всех платформах прокатит. Если через файл, сохраненный в utf-8, то для пользователя слишком муторно будет. Как по нормальному сделать?
>>1464815Ну ебать, не засирать же тренд копипастой с мелкомягкие.док, а по номеру вполне рил найти.https://docs.microsoft.com/en-us/cpp/error-messages/compiler-errors-2/compiler-error-c2893?view=vs-2019https://docs.microsoft.com/en-us/cpp/error-messages/compiler-errors-2/compiler-error-c2672?view=vs-2019Шо еще описать, я не ебу. Делаю все как по буквам, в сигнатуре функции запускаемой в потоке все указываю как в гайдах, в сам объект потока передаю через std::ref, но на этапе сборки мне вываливает вижуалка эти ошибки.
>>1464823Тогда бы код запостил или хотя бы тот гайд. Как блять мы тут должны по скрину одной строчки всё понять и починить?Ну проверь, где ты эту функцию используешь, где какие типы ожидаются и какие на самом деле.
>>1464672Я вообще не согласен с фразой "вектор - универсальный". Там любой контейнер универсальный. Лично я, например, чаще использую лист, и вот он для меня универсальный. Универсальный
>>1464668>list использовать, там на это похуйНе совсем. Лист все равно использует аллокацию. Пускай только для одного элемента, а не для всех как у вектора. Но аллокация все равно очень дорогая процедура.
>>1464887У меня в листе только емпти() проверяется например. Там вроде константа. И поиски ещё в листе, если данные не имеют какого-то известного закона распределения, то поиск с вектором вроде одинаковый по сложности.
Так а чё дальше делать, когда ты выучил все основы с++Начить изучать конкретные библиотеки типа OpenGL или Vlukan?
PlayerЗВ itsPlayers = new Player[DEFAULT_PLAYERS_COUNT];Я правильно понимаю, что это указатель на массив из 6 элементов класса Player?В таком случае что делает эта строчка?itsPlayers[0] = ЗВ(new Player());
>>1465143>>1465213Я придумал, можно же в UE4 вкатываться, а то действительно учиться ради учения такое себе, а тут интересно
>>1465259> В таком случае что делает эта строчка?Уничтожает памятьпараллельно копируя только что созданный объект
Можно ли как-то написать набор значений, которые должна проверить программа?Для примера, мне нужно, чтобы программа выводила квадраты чисел, т.е. я ввожу 2, программа вывод 4, ввожу 3, программа выводит 9 и тд. Можно ли куда-нибудь записать несколько значений, для которых программа должна будет выполнить проверку, не выходя из окна консоли?
>>1465347Я имею ввиду, для любой программы, не только для квадратов чисел. Если у меня будет несколько последовательностей, и чтобы не вводить несколько тестов каждый раз, написать их где-нибудь однажды, и программа выведет результат работы с тестами.
>>1465352Напиши в файл. Пусть программа читает входные данные и результат, который должен получится. Если ее вывод не сходится, то пусть выводит сообщение об ошибке
Вообще вот код https://ideone.com/YuCgjdЯ уже 3 часа ломаю голову над тем, почему в добавку к заданным игрокам выводится стандартный игрок 1. И если в ideone все выглядит так, словно массив при резервировании памяти инициализируется конструктором по умолчанию, то на моем пк все выглядит так, где первая цифра позиция в массиве, вторая позиция игрока, а третья его высота..
>>1465366Ну и пиздец...Какие приватные атрибуты в 9 строчке, у тебя все публичные. Нахуй столько указателей. Почему ты за ними не следишь. etc>И если в ideone все выглядит так, словно массив при резервировании памяти инициализируется конструктором по умолчаниюДа так и есть.И у тебя так же.Просто в "конструкторе умолчанию" ты position не инициализировал и в нём мусор, вместо значения.мимо чайник
Здарова бандиты.Написал для использования в работе некую приблуду, 6к строк на крестах с Qt.В мои рабочие обязанности эти не входило, но прогу заценили и вовсю используют.Исподники я естественно никому на работе не показывал и не собираюсь, но хочу взять патент на это дело.Я правильно понимаю, что для того чтобы всё было чисто, мне нужно либо избавиться от Qt, либо купить соответствующую лицензию?Лицуха стоит неадекватных для этого случая денег (хотя за прогу я получил прибавку 25% к з/п и премию в две увеличенных з/п).Так-то переписать на голом WinAPI проблем нет, хотя время это займет, Qt использовал чтобы побыстрее получить результат.
>>1465354Ты через new выделяешь память и тут же о ней забываешь, т.к. нигде ты не сохранил указатель, который тебе new вернул. Это утечка. Не стреляй себе в ноги, возьми связку vector+unique_ptr
>>1465385Ты можешь использовать бесплатный в коммерческих проектах при условии соблюдения требований LGPLv3. Сама GPL довольно сложно составлена, и нужен профильный юрист, чтобы пояснить, возможно ли в твоем конкретном случае использование этого продукта. Минимальное требование - динамическая дин ковка.
>>1465385А зачем патентовать всё? Патентовать нужно только твой мега-супер алгоритм, отвязав его в твою либку, к которой подключается qt со всем гуи. Наверняка же у тебя вся мякота сводится к нескольким функциям, зачем тебе там qt?
>>1465385Я как-то раз в одну контору устраивался и отказался т.к. в ТД был пункт о том, что всё что я напишу\придумаю (вплоть до всяких слоганов, рисунков и тд) будет принадлежать компании.Пришлось отказаться.
>>1465385ты в россии?как трудовой договор был состален? типовой?вообще то если ты создавал эту прогу в рабочее время по заданию работодателя, то имущественные права на этот интеллектуальный продукт принадлежат фирме, на которой ты работаешь..
>>1465449то есть обычно ты работаешь по специально созданному трудовому договору, в котором не происходит передача имущественных прав работодателю на интеллектуальный продукт, который ты создаешь, работая на эту фирму? дак что ли, а?
>>1465480РФ.ТД типовой.Разумеется в нерабочее время, на своем оборудовании и по своей инициативе.В мои обязанности это никак не входило, и вообще я не кодер.Более того есть целый отдел который должен заниматься и этим тоже, но вот как-то они не додумались, за что им вставили пистон, когда я вылез с этой темой.Патент мне нужен для документально зафиксированной ачивки.
>>1465488Выложи на гитхаб и приложи файл с лицензией. Ну если ты готов показать исходники, конечно, оставляя за собой авторство.
>>1465385GPL налагает ограничения на распространение проги. Если она используется только внутри компании и вообщн никак не контактиркет с наружними сераисами, то ЕМНИП всё нормально. Но ты анону не верь, а почитай сам.
>>1465385Спасибо всем откликнувшимся, в общем буду перерабатывать на голом C/WinAPI, хардкорность не пугает - предмет знаком.Вообще изначально я не думал что так взлетит и будут активно пользоваться - делал чисто для себя из интереса, Qt использовал чтобы побыстрее получить работающий прототип.
>>1465579If the program dynamically links plug-ins, and they make function calls to each other and share data structures, we believe they form a single program, which must be treated as an extension of both the main program and the plug-ins. This means that combination of the GPL-covered plug-in with the non-free main program would violate the GPL.Нужно хитрее. Например, клиент-сервер через сокеты.
Добрый вечер анонче, хочу для практики написать свой движок для имиджборд. Не планирую написать что-то конкурентноспособное, просто для оттачивания скиллов. Для разработки хотелось бы использовать Qt, хотя в теории могу освоить Boost давно стоило бы. Так вот в чём вопрос: из приложений я писал только пару небольших игр, и самое большое 8к строк - приложение расписания для моего вуза. К чему я это пишу, что с серверами делов не имел, и хотелось бы спросить у опытных анонов литературы/примеров/исходников для создания подобного рода сервисов, и каких-то полезных советов.
Можно ли как то послать структуру в функцию по отдельности? А то не хочется создавать отдельную переменную, когда можно просто цифры передать.
>>1466146Конечно! Это - ссылка, точнее константная ссылка, const MyStruct &data. В 2к0 пацаны использовали указатели, но ща не надо так делатьб.
>>1466150Вариант 1 - Project Options -> Debugging -> Command = имя exe-файла, который ее использует. Дальше расставляешь брякпойнты, F5 и понеслась пизда по кочкам.Вариант 2 - Debug -> Attach to Process.
>>1466132Использовал подход Model-View и Qml, в основном вышли большие модели. Из всего кода сам интерфейс занимает только 1к.
Анончики, кто проходил собесы: что конкретно интересует работодателя в гитхабе? Качество кода или сложность реализованных проектов? Написал приложение, работает корректно, но боюсь что посмотрят на мой код и скажут что такие макаки им нахуй не надо, а на ревью и кинуть некому.
>>1466395Прочитай гайдлайны и вылижи свой код. В логику глубоко вчитываться никто не будет, главное чтобы выглядело профессионально
>>1466523То есть им будет похуй что конкретно я писал, лишь бы кодстайл по гайдлайнам был? Грустновато как-то
Кто-нибудь реально (не лабы/курсачи) работает с Clion под виндой? Стоит своих денег? Как там с отладкой? Есть что-то подобное Edit & Continue из VS?
Подскажите за QML, есть ли возможность узнать находится ли приложение в активном фокусе? Проблема: в программе есть таймер, если заблокировать телефон/свернуть приложение таймер останавливается, а при разворачивании - идёт. То есть теряется суть таймера, вот уже несколько дней не могу понять как заставить его работать в фоне, а лучше просто перехватывать сигнал о получении приложением фокуса. Пока накостылил чтобы при нажатии на таймер он обновлялся, но это уже уровень выше быдлокода
>>1466395> Качество кодаДля этого статические анализаторы и автоформатирование.Хотя наименование функций\классов\переменных оно не исправит.Иногда, бывает, интересно узнать как другие всякие мелкие проблемы.Например есть переменная которая хранит состояние и в коде есть проверки: state == STATE1 || state == STATE2 и тдМожешь попробовать исправить эти места с использование какой-нибудь шаблонной йоба-магией.
>>1456115 (OP)Насколько отличаются разные версии QT? Если сейчас начать осваивать QT5, то через год нужно будет с нуля учить QT6?
>>1466595В Qt6 вроде бы как начинку собираются менять, всё в 17 стандарт переведут. Из заметного знаю что в QML строгую типизацию завезут НАКОНЕЦ БЛЯТЬ
>>1466612А андроид даёт какие-то сигналы о пробуждении приложения? Жрать ресурсы пока приложение даже не используется так себе идея, легче было бы просто пересчитывать таймер, благо в программе делается в пару строк всего. Ссылку не грузит, судил по названию, если там об этом написано то извиняюсь
>>1466603Спасибо, полезно. Хреново я конечно фичт шаблонов знаю>>1466595Qt5 жив лет 6, и пока какого-то массового перехода не планируется. Да и Qt4 вполне себе похож.Но, к слову, Qt любит добавлять новый функционал достаточно часто, и есть смысл его узнавать
>>1466598>всё в 17 стандарт переведутМинГВ, с которым он поставляется под винду, его до сих пор не поддерживает, так что хз.
>>1466757Ну так будут поставлять с новым mingw>>1466630Тут уже сам анончик, я не телефонщикхотя на ведре вряд ли получится без жабы
>>14668011. Перейди на CLion.2. Гугли туториалы по массиву, даун.3. Я бы сейчас задумывался о смене языка, потому что плюсы говно (если ты не хочешь в гейдев пойти)4. Никогда не стоит спрашивать советы на двощей.5. Если ты начал кодить - ты подписался на то, что 100% информации будешь учить сам.мимо прошел этот путь
>>1466801Со всем, что не-ASCII, на Си/Плюсах лучше дела не иметь. А если иметь, то курить мануалы и надеяться, что ты будешь работать только с UTF-8.
Есть 3 класса, каждый в своем h файле. 2 класса инклюжены в main, и оба эти класса в своих заголовках инклюдят третий. В итоге компиляторы выдает redefenition of class как фиксить?
>>1467341Как пользоваться этой залупой? При создании заголовка автоматически создаётся и ifndef с именем файла капсом, но для чего это не ясно.
Есть вектор хранящий тип класса. Как в него поместить потомков этого класса, чтобы их методы остались при них?
>>1467354А тебе хотел написать, что forward declaration в самом должно помочь, только это требует корректного использования этого класса внутри другого(кажется, только через указатели и без методов).Потом в .cpp инклюдь сам класс, а в хэдер не суй его.>>1467648Обосрался, это было сюда: >>1467643
>>1467643Скорее всего ты ебалду какую-то собираешься написать. Храни unique_ptrы на базовый класс и дёргай виртуальные методы, при очень сильной необходимости можешь сделать dynamic_cast к наследнику и дёрнуть невиртуальные методы
>>1467658Мне нужно создать класс оркестр, класс музыкальные инструменты и 3 дочерних класса для муз.инструментов. Класс оркестр должен хранить элементы 3 дочерних классов и выводить их, при этом каждый из 3 доч. классов должен иметь свою собственную функцию вывода, переопределяющую таковую у класса муз.инструменты.И я хуй знает как это реализовать.
>>1467665А, бля, я забыл, что семестр начался уже. Иди нахуй короче, в универчике тебе всё объяснят, не зря же ты туда поступил.
Анон, перспективен ли дроч ФП в крестах? Всети корутины и фьючерсы связаны с ФП? std::transform уже умеет параллелить из коробки? Оно в 2к19 быстрое?
>>1467885>Анон, перспективен ли дроч ФП в крестахПерспективен скорее dataflow подход в котором ты рассматриваешь свои данные как трубу, которая куда-то течет. В ФП-тусовке этим занимались лет 30 назад, пока не улетели в космос к монадам и стрелкам. Современное ФП в крестах не попишешь. Но понимать основные принципы ФП типа иммутабельности можно и нужно. В этом плане это намного полезнее дроча паттернов ООП.> Всети корутины и фьючерсы связаны с ФП? Ну так, опосредованно.> std::transform уже умеет параллелить из коробки?Не умеет, но есть неплохая либа Intel TBB, в которой соответсвующая функция есть.Хотя OpenMP еще проще.
>>1456115 (OP)Такой вопрос.Я написал два класса Canvas и Reader.Canvas работает с bitmap ставит пиксели, отражает с права налево и сверху вниз, делает кроп и все такое.Reader, название условное, читает и пишет .bmp. То-есть Canvas передает в Reader bitmap, а тот его преобразовывает в формат bmp и пишет в файл. Ну, или Reader читает .bmp, делает из него bitmap и отдает в Canvas. Чисто гипотетически я могу добавлять в Reader функционал для работы с другими форматами типа png или jepg, ну ясно я делать этого не буду, так как проект делается чисто для себя, что-бы подучится как вообще работать с классами и архитектурой.Canvas взаимодействует с Reader через интерфейс самого Reader'а который у меня чисто абстрактный класс, а работа с конкретным форматом реализуется через наследника, который наследует интерфейс.Собственно у меня два вопроса.1 - Как правильно объединить Canvas и Reader. Функционально и идеологически это разные классы. Но все же они связанны между собой. Собственно вопрос, как вообще конструируют подобные вещи?2 - Canvas и Reader у меня обмениваются кусками памяти, когда надо обменятся bitmap. Я просто передаю указатель на память и размер куска. Мне это очень не нравится, так как получается, что оба класса могут шарится по памяти друг друга. Собственно вопрос как сделать тут нормально и безопасно?
>>1467894ООП из головы просто выкинь. Ты не замечаешь, что наворачиваешь сложность на пустом месте?И не надо оправдываться тем, что "так как проект делается чисто для себя, что-бы подучится как вообще работать с классами и архитектурой". 99% проектов с этой хуйней. Пиши просто, понадобится - отрефакторишь.>Как правильно объединить Canvas и Reader.У тебя есть труба, по которой текут данные, и процессоры, у которых есть вход, выход, и (что противоречит ФП, но удобно) какое-либо минимальное внутреннее состояние.>CanvasЗачем-то делает слишком дохуя. Для разных действий нужны разные классы.>Reader>пишет bmpНу ты понял>Canvas и Reader у меня обмениваются кусками памяти, когда надо обменятся bitmap. Я просто передаю указатель на память и размер куска. Мне это очень не нравится, так как получается, что оба класса могут шарится по памяти друг друга. Собственно вопрос как сделать тут нормально и безопасно?Взять матричную библиотеку (eignen, armadillo, opencv) и обмениваться матрицами трехмерных векторов (потому что картинки RGB), которые внутри уже умеют в слайсы, copy-on-write и тому подобные вещи.Если ты прямо вообще не хочешь пользоваться готовым, пиши собственный класс подобных матриц. Но, умоляю, выброси его, хватит с нас подобного говна в реальных проектах.
>>1467897Спасибо конечно за ответ. Но он мне помог примерно никак.Анон, реально спасибо тебе, но все же это совсем не то что мне надо.Есть тут аноны которые дадут совет, не советуя при этом отказаться от ООП?
>>1467909От ООП нельзя отказаться или не отказаться, потому что его не существует. Особенно в С++. Особенно в 2019 году. Просто нет такого понятия.
>>1467942>>1467897Хорошо, т.е. c++ умрет? Он же был придуман как ООП? Или превратиться в шаблонный си с stl и бустом?
>>1467954Когда придуман в 80-е? С тех пор 30 лет прошло. И за это время язык только становился дальше от ООП. Исключение тут разве что Qt с сигналами-слотами, но вот что реально умирает, так это гуи на С++.
>>1467954С++ это мультипарадигменный язык. Можешь писать на адовом ООП с абстрактфакторипроксибинами а-ля индусская джава. Можешь писать на чисто процедурном диалекте, а-ля чистый С. Если угараешь по извращениям, то из С++ можно сделать почти функциональный язык программирования.Сила С++ в том, что он сочетает в себе абстракции и низкого и высокого уровня, все зависит от программиста. И крутые С++ программисты, обычно, комбинируют парадигмы, и получается хороший и читаемый код.ООП в каком-то простом варианте (RAII) - всегда будет в С++, а вот всякая дрисня типа АБСТРАКТНЫХ ФАБРИК - это пережитки двухтысячных, такое ООП мертво уже сейчас.
Спрошу здесь.Изучая с++ на что лучше всего обратить внимание?На потоки? - почти не разбирался с ними.На rvalue? - хз что то. Не смог нормально разобраться покаНа тепмлейты? - разбирался, но не видел нигде практического применения кроме как в stlНа ООП? - вроде разобрался на начальном уровне но слишком объемная тема.На шаблоны? - пока не брался за них и не знаю стоит ли.На stl? - вроде ничего сложного. Удобно.Отпишитесь опытные аноны. Но просьба без снобизма и поучительного тона. Просто напишите что в плюсах нужно задрачивать и почему, а что не стоит и почему.
>>1467997А как практиковать темплейты и потоки? Ну второе еще ладно, а вот с шаблонами вроде бы всё понятно, и сфинаешка, и трейты вроде бы не сложные, но где это применять в своих программах? Или это знания уровня устройства ОС или ассемблера, то есть просто для общего понимания?
>>1468006Достаточно обширная тема, в двух словах ты не поймешь. В шаблонах Джоссатиса есть хорошее дополнение, я там более-менее понял, а так статей сотни.
>>1468013В том же посте написал, >Шаблоны С++ Справочник разработчика, 2-е изданиеВроде бы первое дополнение
>>1468050Я не он и в метапрограммировании мало разбираюсь, но что мешает использовать tuple? Хотя наверное сам отвечу - там уже есть всё, что нужно.В догонку спрошу, что поменялось между boost.mpl и boost.mp11? А между последним и hana? Собираться быстрее стало хоть?
>>1467955>>1467965>>1467969Спасибо. Для себя плюсы в плюсах я вижу в том, что я развиваю скилл программирования и перекат на любой другой язык будет максимально простым.Вчера, например, я познакомился с кортежами, чтобы возвращать из функции два параметра, как в Матлабе.Алсо, разбирает бугурт, когда какой-нибудь дноработник на работе спизданет типа "я пишу на с++", а на деле там очень хуевый си без классов, зато расширение файла цпп. Даже контейнеров нет, пиздец. я не знаю для кого это пишу.
>>1468005Сделай compile-time вычисление синуса с заданной точностью. Предполагается создание таблицы, но все на шаблонах
>>1468164На самом деле, очень мало народа действительно может сказать, что знает С++, и писать не дырявую хуйню,а что-то вменяемое. Писать на C++ != знать С++, помни это
int temp= new int[newRowsnewColumns]; for(int i=0;i<newRows*newColumns;i++) temp=mass; delete mass; mass = temp;Мне надо создать новый массив, который будет меньше старого. Я правильно делаю?
>>1467894> они связанны между собойНикак они не связаны. Тебе нужен класс Image с методами setBitmap, getBitmap и save. Канвасу вообе не нужно знать что там есть какой-то ридер.>что оба класса могут шарится по памяти друг другаПо другому никак. Естественно если ты не хочешь копировать куски памяти. Естесвенно в голый указатель никто не ебется и делается какая-то обертка над ним которая позволяет упорядочить работу с этим указателем. В библиотеках направленых на работу с openGL обычно идет разделение на три класса: Текстура - это то что ты называешь битмапом, "распакованая" картинка которая отсылается в память GPU, Изображение (Image) - изображение преднозначеное для чтения или сохранения на диск, обычно подразумевается какое-то сжатие (jpg, png) но не обязательно и Спрайт - легковесный класс для передачи ссылок на текстуру (или область на ней), есть в нем содержится указатель на текстуру и координаты района текстуры. Но такое деление продиктовано архитектурой GPU, в частности тем что пытаются максимально уменьшить количество обращений к карточке, в том числе всю графику (которая используется в какой-то одной сцене) собирают в несколько больших кусков (sprite sheet). Если ты полностью на CPU рисуешь то тебе возможно нет смысла заебываться с этим. Если волнует производительность то нужно думать в сторону кеша процессора - там наоборот будут выгодны относительно небольшие текстуры.
Мне нравиться, что на ООП начали гнать, мол нинужон. Я на ооп потратил много времени, придумывал абстракции, какие-то там невероятные наследования, интерфейсы блядь, рисовал uml даже. И меня это бесило пиздец, так как много времени тратишь на это всё, а пользы, особенно когда проект ведёшь один, толком то и нет. Меня ещё Ява бесила всегда, хоть и не работал никогда в этой сфере. Она ассоциируется с какими-то офисными чуханами нулевых. Бесит, блядь! Ебаный матлаб загружается на топ реке сутки нахуй
>>1468240Спасибо за ответ.Но если можно уточни пару моментов.>Никак они не связаны. Тебе нужен класс Image с методами setBitmap, getBitmap и save. Канвасу вообе не нужно знать что там есть какой-то ридер.Канвас и ридер у меня никак не связаны. Функционально. То-есть у них обоих есть по setBitmap, getBitmap, через них они обмениваются самой текстурой. Ридер может грузит и сейвить картинку. Канвас работает с картинкой. То-есть каждый занят своим делом.Но! Меня сильно не устраивает то что для работы с картинкой мне нужно создавать два объекта разных классов, которые вообще никак идеологически не объеденные. Мне просто интересно есть ли како-то стандартный метод "идеологически" склеить их.Вообще тут вопрос не в этом конкретном случае. Вместо канваса и ридера может быть все что угодно. Меня именно архитектура сейчас интересует.Ну, другой пример. Пусть у меня будет 3Д-ридер. Который читает разные форматы 3Д моделей, переводит все это в некий "стандартный" формат и отдает его обработчику, который уже делает что-то там с вершинами. Asimp так устроен.Собственно у меня вопрос как повторить такую архитектуру?Думаю такая ситуация, которую я описал часто возникает. Как все это разруливаеться?>Естесвенно в голый указатель никто не ебется и делается какая-то обертка над ним которая позволяет упорядочить работу с этим указателем.Можешь чуть подробнее? Просто у меня сейчас как раз голый указатель передается. Скажи буквально пару слов.
Ребята, поясните что это за новомодная поебень с "композицией вместо наследования"? Что с этим делать и как быть? Откуда оно взялось? Почему оно вдруг стало модным-молодёжным?
>>1468407Это для второго принципа SOLID: дополнение существующего без его изменения. Облегчает внесение правок с предсказуемыми последствиями, dependency injection и юнит тестирование.
>>1468407>Ребята, поясните что это за новомодная поебень с "композицией вместо наследования"? Если ты об этом вчера услышал, то скорее всего потому что ты отсталый даун, а не потому что это новомодная поебень.Наследование тебе нужно для полиморфизма. Если тебе не нужен полиморфизм, тебе не нужно наследование.
>>1468470>Наследование тебе нужно для полиморфизмаИ для переиспользования кода.Но использовать наследование для переиспользования кода нужно крайне осторожно. Так как тут очень легко выстрелить себе из дробовика в обе ноги и голову одновременно.
>>1468288> Скажи буквально пару словНу вот у тебя передается указатель, и потом с ним что-то делается. Ты оборачиваешь указатель в класс и всю ту работу с ним пытаешся максимально перенести в этот класс-обертку. Чтобы работать с ним контроллируемым способом а не кто как захочет. Естественно у тебя графика, затратные по ресурсам операции и нужно искать компромисы - возможно все безопасн оне получится, из-за производительности.
>>1467356>#pragma onceЭта ебань же вроде не входит в стандарт? да, везде работает, но НА ВСЯКИЙ СЛУЧАЙ
>>1468891>Как наследование способствует переиспользованию кода больше, чем композиция?Я не утверждал что способствует больше. Я просто написал что наследование может использоваться и для переиспользовании кода.Но если ты можешь переиспользовать код композицией, то выбирай композицию, а не наследование.Вообще наследовать лучше всего интерфейс. С наследованием функционала могут повылезать всякие нехорошие проблемы потом.Учти что ООП нужен именно для больших проектов. Если у тебя проект небольшой и ты не видишь куда там впихнуть наследование и прочию дичь то значит они тебе и не нужны. Обойдись без них. Используй классы чисто для инкапсуляции, как обертки.
>>1467298>Со всем, что не-ASCII, на Си/Плюсах лучше дела не иметьА можно попробовать и получить àëëî éîáà ýòî òû
Я ебал в рот выбирать, на какие посты ответить.Поэтому отвечаю безадресноВсем, которым непонятно, какой принцип ООП главнее какого другого.Когда ты достаточно воспринял теорию, и надрочился в практике, у тебя возникает такая хуйня, как code smell.Ты делаешь так-то, не потому что это отвечает принципам SOLID или "один класс - одна ответственность", а потому что ты жопой чувствуешь, то так и надо.Т.е. это забеись, что у вас возникают эти глупые вопросы "а чому так?", но привыкните, что кроме вас на них никто не ответит.Опыт приходит не с правильными ответами на дваче (да даже и на стэковерфлоу), а на порванной парой хуевых проектов жопе.Стремитесь к этому, а не к абстрактному понимаю асбтрактных принципов.
>>1469107>Опыт приходит не с правильными ответами на дваче (да даже и на стэковерфлоу), а на порванной парой хуевых проектов жопе.На самом деле не приходит, потому что ООП является псевдоинтеллектуальной хуитой.
>>1468985>Учти что ООП нужен именно для больших проектов.Никем еще не доказано, что ООП ускоряет или удешевляет разработку больших проектов. Что на маленьких, что на больших проектах проблема условно говоря одна -- разбиение сложной проблемы на более простые. Отсюда требование, чтобы разные компоненты программы работали как можно более независимо, чтобы разработка каждого компонента была относительно простой задачей. Но наследование не приводит к модульности, у тебя наоборот разные классы связываются между собой, ты уже не можешь поменять один класс, чтобы он гарантированно не уебал всех своих наследников.Этого не происходит с интерфейсами, потому что интерфейсы никакого отношения к наследованию на самом деле не имеют, интерфейс это просто некая гарантия, что объекты данного типа могут быть аргументами для некоторых функций. Интерфейсы есть и в функциональных языках и к ООП никакого отношения не имеют, так нахуя тащить в язык целую свалку в виде ООП? Ради единственной полезной фичи, которая реализована через задний проход, и называется это умным словом "наследование"?
>>1469213Ну давай так, гринтекст. Как много статей о критике ООП ты читал и что тебе в них не понравилось?
>>1469220>статей Лол.Статьи не нужны, нужен код. Будет лучший, чем ООП, способ писать код - будем писать по другому.
>>1468014>тормозная хуета, иногда в хуй не видит изменения в исходниках из-за чего приходится чистить вилкой весь проект
>>1469152ООП не сводится к наследованию. Более того наследование лучше юзать чем меньше тем лучше.Просто без ООП хуй ты более менее большой проект напишешь
>>1469323>а без наследования нет полиморфизма.Если речь не про тимплейты/дженерики, конечно, но они к ООП прямого отношения не имеют, это скорее элемент функциональщины.
>>1469342Приведи пример, когда полиморфизм в ООП реализован не через наследование. Интерфейсы в жабе -- это тоже про наследование, если что. Ad hoc полиморфизм по типу когда void func(int) и void func(double) считаются одной и той же функцией (методом) к ООП особ отношения не имеет. Тимплейты тоже. Все это можно сделать без ООП в языке типа Си.
>>1469377Дженерики без наследования тоже особо работать не будут. Это просто указатель на Object (по аналогии с указателем void в C), но со статической проверкой типов. Т.е. оно все равно имплицитно использует тот факт, что все объекты в Java наследуются от Object. Плюс просто так дженерики без extends/super использовать особо не имеет смысла (иначе почему бы не делать все через Object по старинке), а это уже наследование.
>>1469388Ок, уговорил.Да вообще все идет по кругу. Когда я пришел в кодач, не понимал, че это все ООП хейтят. Теперь понял. Но объявилось новое поколение школоты. А я уже старый и мне даже спорить лень.
>>1469392Хейт к ООП не столько из-за самого ООП, сколько из-за мифологизации ООП как таблетки от всех болезней, которая наконец то всех нас спасет от высокоуровнего ассемблера а ля Си. Объяснение ООП нужно начинать с объяснения полиморфизма, как и почему он работает. А объяснение полиморфизма нужно начинать с, сюрприз, теории типов. Потом нужно переходить к тому, что наследование в ООП -- это не более, чем способ реализации полиморфизма. Вместо этого студентам ебут мозг примерами про кошечек и собачек, которые наследуются от Mammal, в результате нихуя не понятно. И проблема не в примерах, потому что примеры могут быть вполне хорошими, а в том, что пример сам по себе объяснением не является.Из-за этого флера недосказанности со стороны ООП выглядит как секта, где все поклоняются ООП, но никто не может объяснить, как это говно работает и почему оно выразительнее процедурного программирования. Оно действительно выразительнее процедурного программирования (если мы под процедурным программированием подразумеваем чистый Си), но адепт ООП тебе никогда не объяснит, почему, потому что тогда все очарование пропадет и адепт лишится объекта поклонения.
>>1469413> Вместо этого студентам ебут мозг примерами про кошечек и собачекА теория типов будет, значит, ясна человеку который учится программированию несколько недель?Тем более всё запутает.
>>1469418Значит надо давать больше реального кода на си, показать хотя бы препроцессорную компиляцию, передачу массив по констптр и, я хуй знает, контейнеры в с++. Это полезные вещи, которые хорошо займут время преподавания ООП.мимо
>>1469422> передачу массив по констптр и, я хуй знает, контейнеры в с++Учим программированию или языку с++?
>>1469418И тут мы приходим к закономерному выводу, что учить новичков сразу ООП нельзя.Ну и тут надо понимать, что учить на мультипарадигменном языке, где ООП одна из парадигм != учить ООП. Программированию вполне можно учить и на С++, и на Python, просто давать информацию дозировано.Уже не говоря о том, что учить программировать можно на языке без ООП, на C или на Scheme, например.
>>1469428>Уже не говоря о том, что учить программировать можно на языке без ООП, на C или на Scheme, например.Да можно вообще учить программировать на ассемблере. А еще лучше - сразу в автокоде для МК-61, хуле.Сортировка методом пузырька не сильно от этого изменится.Учить ООП без наработанных на жопе мозолей от программирования без ООП, конечно, глуповато.
>>1469439Я учился кодингу с создания карт для варика 3.Там процедурное программирование. Чуть лучше чем в Си, конечно.
>>1469439>Учить ООП без наработанных на жопе мозолей от программирования без ООП, конечно, глуповато.Новичок не сможет нормально использовать ООП, если его учить сразу ООП. Тем более, что ООП не про алгоритмы и структуры данных, а про разработку полноценного софта, у которого есть как минимум ТЗ. Так что да, в идеале без наработанных на процедурном программировании мозолей к ООП вообще нельзя подпускать за километр.
>>1469487Короче. ООП это всего лишь инструмент.Можно программить на яве, где любой кусок кода надо обернуть в класс, и не пользовать ни одной идеи из парадигмы ООП.А можно и наоборот.Когда ты знаешь, что кроме молотка и отвертки есть еще гаечный ключ, дрель и токарный станок, ты не пытаешься ЛЮБУЮ РАБОТУ делать молотком. Но когда тебе надо забить гвоздь, ты не пытаешься использовать для этого отвертку.Я видел людей, которых начинали учить сраз в парадигме ООП.Они и программу, которая умножает две константы, пытались делать на иерархии из 10-ти классов.В общем, "хейт к ООП" существует только во влажных мечтах анона, особенно того, который херачит на яваскрипте.Природа даже для дрочки дала две руки, какую выбрать - сам решай.
>>1469547>особенно того, который херачит на яваскрипте.ПЕРЕСТАНЬТЕ насмехатся над разными языками программированияC быстрыйJava популярныйRuby прикооольныйPython прекрасныйJavascriptHaskell интригующий
>>1469576> Java популярныйИскренне желаю, что его популярность упадет и никто это говно не будет использовать. Андроид правильный шаг сделал
>>1456538stl не разрабатывается, чтобы быть самым быстрым, а чтобы быть надёжным.если тебе нужна скорость -- бери специально заточенные под это фреймворки или сам пиши/th
>>1469547>всего лишь инструмент>что кроме молотка и отвертки есть еще гаечный ключ, дрельМолоток, отвертка, гаечный ключ и дрель - все это стандартный набор инструментов, который доступен всем.Тут подойдет другая аналогия.Вот дядя Вася работал всю жизнь на буровой машине и благодаря своему опыту он может в некоторых случаях на своей буровой машине заменить экскаватор. Конечно, экскаватор с экскаваторщиком справился бы лучше.Но дядя Вася не может просто так взять пойти в магазин и купить себе экскаватор. Не может он и в разумные сроки освоить управление экскаватором, тем более, что рабочий проект - не самая лучшая площадка для учебы.Или еще лучше - посмотри на врача-хирурга. У него довольно много инструментов, но не менее важно, то что его набор также ограничен. Нету у него времени выбирать "идеальный".>всего лишь инструментПодбирать "идеальный" инструмент на каждый пук - не самая лучшая стратегия.Вон кладовщик на складе инструментов или продавец-консультант знает все обо всех инструментах. Кроме того, как ими собственно пользоваться.
Ананасы, может кто-то во всяких блогах\сайтах\книгах натылкался на разные идиомы\паттерны?Типа такого:https://news.ycombinator.com/item?id=20159216https://habr.com/ru/post/326540/https://en.wikibooks.org/wiki/More_C%2B%2B_IdiomsБанда четырёх это замечательно, но хотелось бы ещё чего-то. Скажем так, для каких-то небольших\локальных решений, а не на уровне всей иерархии системы или её частей.
>>1469576С - самый простой и убогий язык из тех, что используются на практике.Java - кобол нашего времени.Ruby/Python - пыхоплеяда, высеры ГСМ-ов и неграмотных долбоебов, которые проделали большую работу изобретя квадратное колесоJavascript - JavaScript Haskell - язык программирования, менее вонючий чем все остальные, и от того нахуй никому не нужен.
>>1469862Как же у человека в голове то насрано.Впрочем он явно не кодит активно и судя по всему никогда и не будет, так что вреда особо не принесет.
>>1469906Нет, не угадал. И вреда разработке ПО, больше чем рандомная крестоблядь, принести довольно сложно.
Куда в 2к19 можно податься, хорошо зная кресты, чтобы зарабатывать не меньше чем за жс или го? Читаю статистику моего круга и облизываюсь на среднюю зп гофера в 150к. В нашей крупной продуктовой конторе столько платят только синиерам с 5+ годами опыта. Блохчейн сразу нахуй.
>>1469930Люблю кресты за то, что нужно рвать жопу, чтобы получать скромные по меркам любого другого стека зп.
>>1469956Перекатываться между языками не так просто, как кажется. Ты можешь выучить синтаксис, но овладеть соответсвующим языку стеком на уровене хотя бы мидла можно только практикой. В этом плане С++ один из самый простых, ибо кроме правил языка, хоть и бездонных, в нем ничего нет. Нет здоровенных фреймворков типа спринга, не надо ебаться с конфигами серверов и билд-систем, не надо держать в голове особенности разных GC и подбирать их под задачу, чтобы увеличить RPM. Поэтому неудивительно, что за кресты не так хорошо платят, ибо сложные вещи типа метапрограммирования все равно на практике применяются довольно редко, а обычные фичи аналогичны таковым в других языках и изучить их не такая уж и проблема.
>>1469965> Нет здоровенных фреймворков типа спрингаQt>Поэтому неудивительно, что за кресты не так хорошо платятДа чуть ли не каждой второй веб-макаке с 2-3 годами опыта платят больше, чем мидлосиньерам на крестах. Ведь, конечно же, на рынке платят за знания, а не за способность произвести прибыльный продукт.
>>1469975> QtДесктоп-фронтенд на C++ не вписался в рыночек. А про веб ты прав, сегодня это намного прибыльнее крестов.
>>1470245А где-то требуется знание всего boost от корки до корки?По-моему такие требования из области тыжпрограммист.
>>1470261Ну легаси эт понятно.Но буст - это же десятки независимых библиотек под совершенно разные предметные области.
Какой же clion охуенный, просто секс. После последней обновы заголовок окна объединен с панелью меню и при передаче аргументов методу класса подписываются имена переменных.
>>1456115 (OP)господа. дедлайны горят. молебно прошу вас поспособствовать в написании легкого кода. подсобите сибирскому касипоше :((под пунктами 2 и 3)