Вместо шапки:• https://github.com/sosachbot/cppthreadhat/wikiОтветы на вопросы:• https://en.cppreference.com/w/• https://www.cplusplus.com/reference/Прошлый тред: >>1598511 (OP)
Анон, нужно твое авторитетное мнение по поводу использования крестов в микроконтроллерах, например, какой-нибудь стмке 32.С одной стороны, везде СИ блядь, драйвера, память нахуй с другой - кресты с их отличными плюсами, шаблонами там, абстракцией и всей хуйней. В реальных задачах на мк хорошо выделяется часть, которая железная и часть, в которой сама суть работы.
Сап, аноны, решил вычислить n-ое число pi. Нашел алгоритм типо вычисляющий n-th pi число с логарифмической сложностью, но я его походу реализовал через одно место, хз в чем трабл. Кто шарит, прошу помочьМой говнокод и алгоритм:https://rentry.co/picomputationП. С. Вычисляющий это число в десятичной системе, а не в шестднацатеричной как в формуле Бэйли — Боруэйна — Плаффа.
Единсвенное не понял какое выбрать n0, вроде для ошибки типо, т. е. чем больше, тем лучше, но результат меняется каждый раз довольно сильно
помогите пожилому вкатывальщику по книге страуструпа плз. 1) задача; 2) говнокод; 3) результат. Чо т я заебался уже, фигурные скобки во все места перебрал, либо одну 3 выводит с ошибкой, либо просто ошибку, либо ничего
Простите за тупой вопрос, но почему _itoa_s возвращает мне строку, где вначале мусор в виде 37777777, раньше такой же код у меня работал, теперь перед ответом добавляет этот мусор.
>>1609021Можно простоvector primes {2};for (int i = 3; i <= 100; ++i)__if (find_if (begin(primes), end(primes), (int x){return i%x == 0; }) == end(primes) )____primes.push_back(i);
>>1609182malloc в C++ до 20ого стандарт - undefined behavior. Выкинь и перепиши нормально.И какие блять ITOA когда ты пишешь на С++ - либо from_chars, либо to_string
>>1609235Двачую, я когда анону картинку с решением кидал, то за auto еще терзал себя, что зря вписал, а он тут ему find_if предлагает))
>>1609240Ну так то да, у нас обычная практика обучения крестам - дать подмножество из си плюс основы ООП, хотя знание стл, какбэ тоже часть языка, хотя бы 99 стандарта даёт реальный буст производительности кодера, уровня абстракции и понятности кода.А на 17 вообще сказка, заметили там наверху что вектору тип не нужно прописывать?
>>1609253>1) const в глобале = static const (только в C++)Допустим у нас есть header.h: const int h = 5;Если мы его включим в несколько .c файлов без защитных директив, то линковщик С выдаст multiply definition, а в С++ все скомплится на ура. А все потому, что в С++ h является локальной в каждом файле, куда подключен header. Если нужно использвать const int через extern, то при определении переменной, надо писать extern const int h= 5>2) В C++ нет VLA. int foo (size_t n, size_t m[n]); // Не скомплится в С++Хотя не все комплиторы работающие с С11 могут в VLA, а вот для C99 поддерживать обязаны.3) А еще в Си вместо темплейтов есть _Generic:int print_int(int d) {printf("%d\n", d);}#define print(d) _Generic((d), int: print_int)(d)main() { print(123); }4) Ну и конечно же Compound Literals. Онли С совместимый код белоу:char foo = (char []) {"x", "y", "z"};int i = ++(int){1};
>>1609083В очько себе засунь свой wcharhttps://docs.microsoft.com/en-us/windows/uwp/design/globalizing/use-utf8-code-page
>>1609270Ну тащемта да, но все конпеляторы нормально с этим работали.>>1609258> extern constconst_____expr
>>1609258Что те непонятно в "подмножество из си"? Это часть си, не весь, кресты не обязаны это реализовать, всё-таки разные языки под разные вещи.ЗЫ я имел дело с например сишными проектами для вертолетных автопилотов и никогда там такого не видел, мож плохо искал? Хотя могли делать под конкретные компиляторы канеш.
>>1609274У если сишные автопилоты не используют _Generic, это не значит, что в языке си не _Generic, что за импликация от частного к общему?
>>1609194>find_if (begin(primes), end(primes), (int x){return i%x == 0; }) == end(primes)Как это называется? Как почитать?
Олды, объясните, почему я не могу инициализировать так свои значения в массиве? (T это int*)https://pastebin.com/GSkV5Si3
Если скопировать и вставить код в visual studio, то он автоматически отредактируется по определенному шаблону. Вот как этот шаблон изменить? Например, чтобы после ( и перед ) всегда был пробел, или чтобы { был на одной строке с выражением, а не под ним.
>>1609269А что у нас класс строк для utf-8 завезли чтоб без всякой ебли изкарбоки? Нет. Ну и нахуй этот utf-8 тогда.
Подскажите на сколько распараллеливание по ядрам на плюсах сложнее по сравнению с распараллеливанием на других языках?
>>1609745Чел, советовать целую книгу с теорией человеку, который спросил про сложность этой задачи как минимум тупо.
С++ сеньоры помидоры, я правильно понимаю, что exceptions считаются замедляющими код, не потому что они как-то ресурсо-затратно сделаны сами по себе, а из-за того, что куча различных оптимизаций (типо перемещения) невозможна из-за вызывающихся в конструктрах/деструкторах исключений?
Сап, аноны, помогите разобраться с mutex'ом и синхронизацией потоков.Допустим, у меня есть очередь, один поток постоянно проверяет пуста ли очередь, если нет, то выводит на печать первый элемент и удаляет его. И есть поток (метод класса, если объектов много - то поток не один), который добавляет элементы в очередь. Куда нужно ставить lock и unlock, чтобы все безопасно работало?
>>1609781Ну для твоего случая есть condition_variables, ты захватываешь мьтекс, который wait освобождаешь и лочит, когда ей приходит уведомление, а затем чекает: если предикат норм, то выход и исполняем код, а если нет - освобождаем мьютекс и ждем следующее notifycondition_variable cond;Queue q;...void pull_from_queue() {... unique_lock<mutex> lock(mtx);wait(lock, []{ return !q.empty() };...}void add_in_queue() {q.push_front(...);cond.notify)one();}Собсна так синхронизация потоков и делается, через онли мьютексы тебе придется задержку создавать, чтобы дать захватить мьютекс функции, добавляющей в queue элемент, и все это в while
>>1609786>мьтекс, который wait освобождаешьмьютекс, который в wait освобождается и лочится, когда cond приходит уведомлениебыстро фикс
>>1609698Ну так не будет больше этой поеботы в кроссплатформенных приложениях. One u8string to rule them all
>>1609380Стандартная библиотека крестов он называется XDDС рейнджами это выглядит ещё короче и понятнее.
>>1609805А чем wide строки не подходят для кроссплатформенности? Вся винда же работает на них и поддерживает кучу разных языков.
>>1609754Нет, эксепшены не влияют на оптимизации.Единственный случай, про который я слышал — это спецификации throw() в имени функции могут как-то запороть оптимизации, потому что компилятор вставит проверки на типы брошенных исключений. Но эти спецификации уже задепрекейтили, так что пофиг.
Как можно организовать чтение из сокета и отправку в одном потоке?С частотой в одну секунду на сокет приходит сообщение, отправка может произойти в любой момент времениСокет храниться в классе Может, через дефолтный bool - флаг?
>>1610179Вроде как без noexcept в конструкторе перемещения компилятор не реализует perfect forwarding, если я верно помню. Хандельянц из PVS-Studio об этом вещал в лекциях своих.
>>1610209Вот это походу и есть единственное место. Ну или в библиотеках разных могут быть безопасные версии каких-нибудь алгоритмов, если не бросаются исключения
Короче, двач, столкнулся таки с GNU autotool.Как же я блять говна поел, ребята, полный пиздец. Есть ли какая-то альтернатива этому дерьмищу? Оно же блять страшное как моя жизнь.Как блять это вообще случилось-то, хлопцы? Что за нехуй?Какие вообще альтернативы этому пиздецу есть? qmake что ли? Почему этот пиздец существует, я не могу. Блять, да по-моему свой скрипт на питоне, выдающий конечный мэйкфайл проще написать чем в этой хуйне ебаться...
>>1610312Ему уж 50 лет скоро, ты что хотел? qmake какой-нибудь да, альтернатива. Существует, потому что диды не готовы перелезать ни на что новое. Ты вот какой новый софт в этом году освоил? А в прошлом?
>>1610317> Существует, потому что диды не готовы перелезать ни на что новое. Да бля, деды, идите нахуй.> Ты вот какой новый софт в этом году освоил? А в прошлом?Ну год тока начался, в прошлом стал активно работать с OpenMP и MPI(со вкусом буста, на чистом MPI писать я в рот ебал). Ну это только для меня новое, а так-то конечно всё что вам надо было написано дедами. Но вот справиться с жму аутотренингом никак не могу. Ненавижу всей душой.
Здраститя, вопрос есть. Вот например у меня функция, которая делает простые вычисления в цикле (по сути просто сложение), а потом результат в виде массива отправляет в другую функцию и дает ответ. Но делается это оче долго, потому что массивов много, а если распараллелить наверное есть шанс ускорить работу. Я могу заранее задать отправную точку, откуда надо считать для каждого потока, тут проблем нет в общем, но дальше у меня вызывается следующая функция, где массив обрабатывается, и вот я не могу понять, у меня функция отдельно для каждого потока вызывается и выполняется или просто как-то последовательно? Просто из той функции у меня тоже какие-то функции вызываются и тд говнокод. Есть шанс, что это само по себе нормально работает? Я пока в тестовом режиме запустил, чет медленно всё происходит хотя я еще вывод не пофиксил, но все равно хуета. Просто пытался гуглить, там какие-то member functions, это оно или нет? Я просто хочу, чтобы у меня каждый поток делал то же самое, что и вся программа, в принципе даже можно ее несколько раз запустить, но тогда там непонятно с использованием ресурсов пеки шо будет, пока вот на 6 потоках запустил, вроде пишет 100% проца используется.
>>1610184Бля, чел, подробнее давай. Асио или нативные сокеты ебёшь? Чё за дефолт bool флаг? Если асио, то ебуш async везде
>>1610482Какого нэхуй массива? Натив или вектор? То есть у тебя целая куча массивов(массив массивов?), и ты хочешь чтобы у тебя сложение происходило одновременно?Ну бля, дедпул тредпул делай.А вообще, на gist/pastebin залей. Это чё, тест на работе юниорской?)))
>>1610493Это по учебе кста. У меня всего один вектор получается, и там в нем делается +1 к последнему элементу и дальше сдвиг, если нужен (там короче как прибавление единицы к длинному числу в N-й системе счисления, разряды которого в каждой ячейке), потом еще проверка на повторы ну может еще чего прикручу. В принципе может я там хуету написал, но я думаю мне все равно распоточивание понадобится, даже если всё переделывать придется. Потом готовый вектор отправляется в функцию, и потом цикл начинается заново, к этому же вектору снова прибавляется 1, снова отправляется в функцию и тд. А функция просто возвращает 1 или 0. И эт самое, я там еще постоянно вектора отсылаю, вроде ж как-то можно через rvalue их не копировать каждый раз, а как-то просто быстро передавать, я там правильно написал через move? https://pastebin.com/Gj8KJ6Ds по морде только не бей
>>1610507Назови нормально переменные, комментарии поставь, что это за говно ебучее ты скинул? Скидывать такой код на ревью = плевать в ебало ревьюеру, я бы на месте учителя тебе в рот насрал.
>>1610527Там просто контекст знать надо... Ну бля, мне сложно сходу на англицком выдумывать кратко и емко что конкретная переменная делает даже на русском. Ну а вообще как нормально чисто без осознания смысла, а по распоточиванию? Говорю, я могу почувствовать, что говно высрал и переделать способ получения вектора, и ту функцию могу тоже переделать, но структура та же останется. Мне вот именно почувствовать как с потоками работать в такой ситуации.
Как правильно итерировать по множеству до бесконечности? Нужно брать элементы из множества и помещать в массив, а когда оно заканчивается снова брать сначала.
Какой из этих двух вариантов лучше? Обычно создавать объект на стеке, а потом просто мувовать его в контейнер? Или указатель на куче? На картинке пример грубый и кривой, но суть думаю понятна. Что по производительности быстрей, если эти классы большие и часто создаются?
>>1610700Не трогай кучу и мувсемантику, пока не разберешься в плюсах нормально. Делай всё на стеке, если явно не требуется другое.
>>1610731Дело в том, что класс AAA большой. Если просто писатьcontainer.data = test;то будет использоваться copy assignment. Копирование объекта же дольше длится чем просто мувнуть его? Я знаю, что объект test после мува становится пустышкой. Короче, я создаю объект test, делаю что-то с ним, затем пихаю его в контейнер (который кроме этого еще другие поля содержит), и после этого test мне больше не нужен в этом скоупе. Поэтому я подумал, что может быть мув семантика хороший вариант? Или всё-таки лучше аллокация на куче?
>>1610152Да я уже понял, но там мало настроек как-то. Вообщем установил clang-format плагин, пердолю настроечки. В идеале закос под Windows NT style хочу сделать.
>>1610799Тебе же говорят - не лезь, если не разобрался.Как минимум, задумайся, что лучше - создать объект на месте в куче или вызвать конструктор, а потом переместить объект куда-то?Хотя, теоретически, компилятор увидит, что ты дурачок и Object a();smt.a = std::move(a);Превратит в smt.a = object(a);
>>1610799>объект test после мува становится пустышкойПосмотри, что такое std::move, там просто рвссылка навешивается, специально, чтобы выбрался не копи конструктор, а мув и если ты мув конструктор или там оператор присваивания не сделаешь таким, чтобы он мувал, то никакого мува не случится.
Приветствую, меганьюфаг-школотрон в треде. Знаю основы пайтона, учил его для решения всяких задачек (олимпиады + ЕГЭ), но позже понял, что он говно (для этих целей), сейчас хочу вкатиться в плюсы как можно быстрее. Что можете посоветовать для этого, помимо книг на 1ккк страниц? Или не выпендриваться и читать книжки? Также был бы рад каким-нибудь годным ресурсам для начинающих. Всем спасибо.
>>1610938Ничто не мешает мувать объект со стэка. Напримерstd::vector<XXX> aaaa(100500);foo(std::move(aaaa));Абсолютно валидный код.Это ответственность разработчика класса предоставить правильный мув-конструктор.
>>1610700Оба хуже. Первый делает непонятно что, второй течет ресурсы и приводит к битым указателем.Поскольку ты не очень понимаешь, что делаешь, то напишиclass AAAA{std::unique_ptr<XXX> data;}мув-конструктор сгенерится автоматически если ты не определяешь своих конструкторов.
>>1611082Страуструп, книги Майерса и Саттера, может быть Вандервуда, потом всякие статьи по современным стандартам.В С++ нельзя просто взять и вкатиться
>>1608046 (OP)Какие доводы использовать C++ вместо pure C? Си простой, компактный. C++ монструозный, одна только спека сколько там сейчас страниц, 3000?
>>1611129Пока графика не нужна.>>1611130Мне не нужны тысячи абстракций на все случаи жизни. Я все равно их все никогда не освою. И я сторонник минимализма. Керниган писал, что Си хорош тем, что это маленький язык, им можно быстро овладеть, и реально знать и использовать все возможности языка. В C++ такое невозможно. Даже создатели языка не знают всех его особенностей. А уж экосистема там наверное вообще гигантская. Зачем нужен комбайн с миллионом функций, если будешь пользоваться только десятком?
>>1611132Ты не териотезируй, ты пиши код. Когда ты поработаешь над достаточно большим проектом, сам поймешь зачем нужны шаблоны, классы, виртуальные функции, исключения, конструкторы-деструкторы и прочее.
>>1611132>Пока графика не нужна.>Какие доводы использовать C++, если мне в моей песочнице ничего из С++ не нужно. Отвечайте быстро!Никаких, ты прав. Вообще не понимаю, зачем пользоваться языками программирования, если я могу и руками пасьянс разложить.
>>1608046 (OP)Кто нибудь проходил специализацию от Яндекса на курсере "Искусство разработки на современном C++"? Стоит ли проходить платно? Один месяц стоит 4900 руб. Курсов 5 штук. Думаю один курс за месяц можно и не пройти. Тем более последующие курсы наверняка сложнее предыдущих. Выходит что пол года нужно времени, если не больше. Итого минимум 30000 руб. Стоит оно того?Я еще не совсем понимаю что входит в платную подписку. Задачи точно входят. Но задачи, их же можно самому порешать. Там же название задачи написано, можно нагуглить условия. В общем, если кто проходил платно, расскажите что там к чему, годные курсы или нет.
>>1611132>Зачем нужен комбайн с миллионом функций, если будешь пользоваться только десятком?Фи, амикошонство, люмпенпролетариат!
>>1611134Я боюсь погрязнуть в теории. Ведь фич очень много, придется все это изучать, потом практиковать. Боюсь что долго придется осваивать конструкции языка.
>>1611135>>1611139Лишние абстракции это зло. Вы сейчас прёте против этого закона, что противоречит программированию как инженерной дисциплине. Реальные доводы будут, факты какие-то, хотя бы развернутое мнение, собственный опыт? Я не для троллинга или срача спрашиваю. Мне хочется понять вашу мотивацию. Свою я высказал. Пока побаиваюсь C++ из-за его монструозности. Может это только предрассудок, не знаю.
>>1611083Ну да, ты к чему это? В своём посте я вроде не писал ничего про стек или не стек, ты точно мне ответил?
>>1611132Чем больше приложение, тем больше там вылазит всяких моментов, которые на чистом С никак не контролируются.
>>1611145Лишние абстрации это лишняя сложность. Обычно это случайная сложность, когда проектировщик не нашел способа, не смог сделать простым. В инженерии борьба со сложностью ключевая цель. Иначе смысл инженерии теряется. Принципы KISS постулируют это. И не только они.
>>1611152>Чем больше приложение, тем больше там вылазит всяких моментов, которые на чистом С никак не контролируются. Можно пример? Хочу понять чего это касается, ручного управления памятью, недостаточным уровнем абстракции, недостаточным количеством инструментов или библиотек для разработки, или может что-то еще?
>>1611154>В инженерии борьба со сложностью ключевая цель. Ещё раз: ты это где-то прочитал или из своей головы вещаешь?
>>1611156https://ailev.livejournal.com/1227127.htmlhttps://www.coursera.org/lecture/system-thinking/bor-ba-so-slozhnost-iu-v-myshlienii-kkmdj
>>1611156https://books.google.ru/books?id=24KzDwAAQBAJ&pg=PA456&lpg=PA456&dq=борьба+со+сложностью+в+инженерии&source=bl&ots=vwbZE0vPmZ&sig=ACfU3U0FJ4R36j6R_V1pW7YhXtqJVrCPVA&hl=ru&sa=X&ved=2ahUKEwjp5unDxOTnAhXks4sKHZXVCbcQ6AEwBnoECAkQAQ#v=onepage&q=борьба со сложностью в инженерии&f=false
>>1611156https://www.google.ru/search?newwindow=1&hl=ru&tbm=bks&sxsrf=ALeKk01W0sVUhgdb8M8FHI9N4Qe9kuQc2Q%3A1582353350113&ei=xstQXqzMBrKEmwXj2bPYDw&q="борьба+со+сложностью"&oq="борьба+со+сложностью"&gs_l=psy-ab.3...46683.48503.0.49002.2.2.0.0.0.0.132.262.0j2.2.0....0...1c..64.psy-ab..0.0.0....0.-q4b9HHEjMQ
>>1611160>ПринципыТы путаешь принцип с законом. Принципы могут быть разные, каждый со своими достоинствами и недостатками. Например, вот широкоизвестное эссе о принципах построения опенсорс программ: базарном и кафедральном. Оба принципа используются и по сей день.
>>1611170Нет шаблонов и перегрузки -> код нужно копипастить 100500 раз и называть func_int, func_double, func_char, да, для него. На самом деле наверняка это решается через касты к воид звёздочка и обратно,но тут возникает множество опасностей отстрела ноги.
>>1611128На С++ можно писать в стиле С, если хочется, но при этом пользоваться всякими дополнительными плюшками, типа перегрузки операторов, RTTI, и т.д.
>>1611160>Принципы KISSТак именно из этих соображений появились абстракции, да, в маленьком проекте кажется на чистом си писать проще, но потом оказывается, что плюсы сколь угодно масштабируются и в миллионнострочном проекте писать на плюсах не сложнее(имея некоторый опыт), чем в лабе1. А в си код начинает схлопываться под собственной тяжестью, программисту становится тяжело удержать в голове что делает данный код, его становится тяжело поддерживать, потом единственный бородач, который в нём что-то понимал, уходит на пенсии и имеем легаси, в котором никто нихуя не понимает и стремится запихнуть его под диван.
>>1611184"Борьба со сложностью" — это бесконечно абстрагируемое понятие. Назови одну деятельность, которая не занимается "борьбой со сложностью". А так-то конечно, да. Инженер сделал мост, чтобы он не падал — поборол сложность переправы через реку. А потом хирург вырезал аппендикс — поборол сложность выжить с перитонитом. А потом кондуктор взял деньги за билет — поборол сложность поддержки транспортной инфраструктуры.
>>1611182Извините, а назуй тогда Си нужен в т.ч. в embedded разработки, когда можно писать на Си с классами, с перегрузками и вот этим всём?
>>1611186>в си код начинает схлопываться под собственной тяжестью, программисту становится тяжело удержать в голове что делает данный код, его становится тяжело поддерживатьИз-за чего? Чего там не хватает? Можно конкретику?
>>1611199А, ты хотел сказать, что при создании указателя на функцию надо знать аргументы к этой функции? Это да. Ты так написал, будто тип функции (тип возвращаемого значения) зависит от типов аргументов.
>>1611190Если проектировщик создал систему для решения задач, но она оказалась сложнее в использовании чем решаемые задачи, то это разве можно считать решением задачи? Если язык настолько сложный, что требует больше времени и сил на его освоение, чем решение задачи другим языком, то зачем нужен такой язык? Суть языка в том, чтобы просто решать сложные задачи, а не сложно решать простые, или сложно решать сложные. Вот это борьба со сложностью. В этом суть, чтобы в конечном итоге решать задачи просто. Это суть инженерии.
>>1611196Да, но разные функции могут возвращать разные значения. Для int передаешь одну фунцию, для других типов другую.
>>1611200Ну а я что написал?>>1611201Тип функции это не тип возвращаемого значения, int тип интов, int тип указателя на инты, по той же аналогии и с указателями на функции, если ты разыменуешь переменную типа void ()(int x int y) ты не получишь переменную типа воид void.
>>1611191>Извините, а назуй тогда Си нужен в т.ч. в embedded разработки, когда можно писать на Си с классами, с перегрузками и вот этим всём? Вот это я пытаюсь выяснить. Пока адепты внятных доводов не приводят.
>>1611203То есть тебе под каждый тип нужна функция. И чем это проще, чем func_int, func_double, func_char... ещё 100500 функций.
>>1611206Тем что главная функция не зависит от других. Барьеры абстракций же. Слои не зависят друг от друга. Если тупо под каждый тип писать отдельную функцию, это будет просто копипаста.
>>1611202>Если проектировщик создал систему для решения задач, но она оказалась сложнее в использовании чем решаемые задачи, то это разве можно считать решением задачи? Да. Пример: решаемая задача: сделать табуретпростое решение: принести пенёкрешение проектировщика: выкачать из земли нефть, очистить её, полимеризовать в пластик, создать линию по отливке табуретов из пластика, сгенерировать электричество, подключить линию к электричеству, доставить сырьё, и наконец создать табурет. Что сложнее?
>>1611207Какая главная функция, вот в плюсах ты пишешьtemplate<class T>T sum(const T& a, const T& b){ return a + b; }Как ты это обойдёшь, не создавая кучу функций под все типы которые складывать можно?
>>1611210А, в С11 шаблоны появились? Прикольно. Нет, ну если в Си и дальше будут завозить фичи плюсов, то и спорить будет не о чем.
>>1611154>Лишние абстрации это лишняя сложность. В крестах набором же, добавляется больше с каждым стандартом, но что было раньше наоборот легче и внезапно быстрее
>>1611191Для embedded наверное есть какие-то преимущества, типа стандартная библиотека не такая большая, и легче предугадать, как компилятор сгенерит код. Или разрабы просто не знают, на каком ещё утюге им придётся запускать своё творение, и сразу берут по минимуму.Или если библиотеку пишешь, или прослойку между языками, то Си может пригодиться. Ну и для копания в линуксах и прочих опенсорсах.А в остальном, я не знаю, зачем Си ещё нужен.
>>1611240> легче предугадать, как компилятор сгенерит кодНу и нахуя этой экстрасенсорикой заниматься?
>>1611247Я вот думаю почему коммитет по си до сих пор не внесёт 2 маленьких, но удобных изменения - к структурам можно обращаться как в С++, не обертывая typedef'ом и добавить uint для соращение unsigned int, и все блять, язык в 10 раз удобней станет
>>1611144> Лишние абстракции это зло.Тред Go ниже. Возвращайся когда заебёт самописная кодогенерация, RTTI на говне и рефлекшонах, и отсутсвие абстракций в языке, приводящее к их переизобретению в коде. Это не критика Go, многим заходит писать и так.>>1611132А теперь подумай, когда он это писал и с чем сравнивал? Си хорош когда у тебя нет вариантов, а иначе можешь пойти в ядро и изучать как они эмулируют плюсовые абстракции.PS. Не бойся изучать новое, бойся зацикливаться на старом - вылетишь с рынка быстрее чем успеешь сказать котлета.
>>1611258>изучать новоеЯ вот больше боюсь забыть старое, поэтому додрачиваю многие вещи довольно долго.
>>1611257https://stackoverflow.com/questions/35808996/why-hasnt-typedef-struct-been-made-optional-in-c
>>1611261> Сказал крестовый пердун.Ты как говоришь будто я не знаю питон, go, js и pl/sql на уровне достаточном для поиска работы.
>>1611292>В классе есть сырые указатели. Но туда же кроме nullptr ничего не записали? Тогда можно.Кстати, подчеркивания перед аргументами ставить не обязательно. Можно писать прямоFont::Font(std:string fontPath) : fontPath(fontPath)- компилятор поймет, что один fontPath - это член класса, а другой - аргумент.
>>1611292Бросание исключений в конструкторе абсолютно легитимно, следи только, чтобы они бросались до всяких new и тд, чтобы при раскрутке не было утечек, а лучше вообще используй только смарт поинтеры, это требует совсем небольшой привычки, зато про утечки в 99% случаях можешь забыть. В то же время бросать исключения в деструкторе абсолютно нелегитимно, никогда так не делай, если интересны подробности можешь погуглить про ключевым словам stack unwinding, libunwind, libcxxabi, чтобы понять как это вообще всё работаетhttps://monoinfinito.wordpress.com/series/exception-handling-in-c/
>>1611402Стараюсь использовать смарт поинтеры где могу, но в СДЛ сразу ловлю исключение, если использую unique_ptr для его объектов
Алсо может кто знает, как в выдаче гугла забанить ru.cppreference? Постоянно этот кал первым вылезает вместо en.cppreference.
>>1611427Конкретно про СДЛ не скажу, но вообще, когда получаешь объекты от других библиотек, то у них обычно процедура освобождения тоже бывает какая-то библиотечно-специфичная, и для них просто так нельзя вызывать delete.Возможно, тебе нужен смарт поинтер с кастомным deleter-ом.
>>1610920Ну ок, значит мув пока не трогать, хотя я поэксперементировал и оно работало, (видимо как ты написал?) Можешь дать хороший пример или статью про мув?А если вот так сделать? container.data = std::move(AAA()); Тоже хуйня под капотом происходит?
>>1608862> вывести все простые числа до 100Не благодари.// This file is a "Hello, world!" in C++ language by GCC for wandbox.#include <iostream>#include <cstdlib>template<std::size_t... Args>struct NotDivideTo; template<std::size_t N, std::size_t P, std::size_t... Args>struct NotDivideTo<N, P, Args...> : public NotDivideTo<N, Args...>{ static constexpr bool value = N % P != 0 && NotDivideTo<N, Args...>::value;};template<std::size_t N>struct NotDivideTo<N>{ static constexpr bool value = true;};template<bool b, std::size_t K, std::size_t... Args>struct NextPrimeImpl;template<std::size_t K, std::size_t... Args>struct NextPrimeImpl<false, K, Args...>{ static constexpr std::size_t value = NextPrimeImpl<NotDivideTo<K + 1, Args...>::value, K + 1, Args...>::value; }; template<std::size_t K, std::size_t... Args>struct NextPrimeImpl<true, K, Args...>{ static constexpr std::size_t value = K; };template<std::size_t... Args>struct NextPrime{ static constexpr std::size_t value = NextPrimeImpl<false, Args...>::value; };template<std::size_t... Args>struct PackedPrimes{};template<bool b, std::size_t N, std::size_t... Args>struct PrimesImpl;template<std::size_t N, std::size_t... Args>struct PrimesImpl<true, N, Args...>{ using value = PrimesImpl<NextPrime<Args...>::value < N, N, NextPrime<Args...>::value, Args...>::value;};template<std::size_t N, std::size_t Head, std::size_t... Args>struct PrimesImpl<false, N, Head, Args...> { using value = PackedPrimes<Args...>;};template<std::size_t N>struct Primes{ using value = PrimesImpl<true, N, 2>::value;};template<std::size_t s, std::size_t... Args>void print_pack(const PackedPrimes<s, Args...>&){ std::cout << s << " "; print_pack(PackedPrimes<Args...>());}void print_pack(const PackedPrimes<>&){ std::cout << std::endl;}int main(){ print_pack(Primes<100>::value());}
>>1611602Пиздец, какой же уебищный синтаксис у этих последовательностей. Недавно потребовалось удалить последний элемент последовательности для последующей передачи в другую функцию... Это просто пиздец. Вместо какой-нибудь функции типо pop пришлось строит рекурсию через несколько структур в 30 строк.
>>1611688Вот так можно например выкрутиться// This file is a "Hello, world!" in C++ language by GCC for wandbox.#include <iostream>#include <cstdlib>#include <tuple>template<class Tuple, std::size_t... I>auto remove_last_impl(const std::index_sequence<I...>&, const Tuple& t){ return std::make_tuple(std::get<I>(t)...);} template<class... Args>auto remove_last(const std::tuple<Args...>& t){ return remove_last_impl(std::make_index_sequence<sizeof...(Args)-1u>{}, t);}template<class Tuple>void print_size(const Tuple&){ std::cout << std::tuple_size<Tuple>::value << std::endl;}int main(){ std::tuple<int, char, double> t(1, 'a', 1.23); auto result = remove_last(t); std::cout << std::get<0>(result) << std::endl; std::cout << std::get<1>(result) << std::endl; print_size(result);}
>>1611484Не помню конкретную лекцию, но посмотри все, полезно будет, ищи: pvs studio c++.Насчёт std::move(object()); - здесь object() уже rvalue, а мув из lvalue делает rvalue.И, если не ошибаюсь, если сделатьvoid func(object&& x){}object smt();func(std::move(smt));smt.mthd() //будет ошибкаТак как память, выделенная под smt отдается в функцию и там же уничтожается при выходе из нее.
>>1611484Погугли universal reference, move semantics, c++ reference collapse rules>>1611720>а мув из lvalue делает rvalue.Тут будет && && и это схлопнется в &&, смотри скрин.
>>1611720> Так как память, выделенная под smt отдается в функцию и там же уничтожается при выходе из нее.Очнись, в c++ не завезли destructive move
>>1611693>>1611719Мне нужно было передать цепочку хешей которые гарантированно считаются в компайл тайме, поэтому тупл тут не катит. Чтобы заставить компилятор при компиляции их высчитывать приходится вызывать функцию внутри треугольных скобочек.
>>1611723>Тут будет && && и это схлопнется в &&, смотри скрин. И что это значит? Я вообще не врублюсь.
>>1611788Ну если наполнение туплов, хэши или что там, в компилетайме считается, то и тупл компилетаймовый будет.
Помогите написать кастом удалитель для SDLВот так пытаюсь сделать (на пике) Получаю ошибку C2027(использование неопределенного типа SDL_Texture) & C2338(can't delete an incomplete type);ftexture это поле класса, выглядит так std::unique_ptr <SDL_Texture> ftexture = nullptr;Можно ли вообще указать удалитель при создании, чтобы не писать его постоянно в make_unique?
>>1611788>The correct answer - as stated by Herb - is that according to the standard a constexpr function may be evaluated at compiler time or run time unless it is used as a constant expression, in which case it must be evaluated at compile-time.https://isocpp.org/blog/2013/01/when-does-a-constexpr-function-get-evaluated-at-compile-time-stackoverflowВ общем если у тебя constexpr auto result = evaluate_hashes(), то гарантированно будет считаться в компилетайме.
>>1611816Ну да можно конечно вручную констэкспр писать, но тогда код по раздувается и по уебански выглядит.
>>1611819Ну это явно лучше чем как ты говорил, 30 рекурсий через рекурсии или там аргументы в шаблон засовывать. Ну бля, таплы для того и были придуманы, типа вот у тебя есть там ArgsA... и ArgsB... и из-за той же проблемы, что они слипаются, нельзя написать template<class A, class... ArgsA, class... ArgsB...> и вообще ничего нельзя написать после вариадик темплейта, юзаются два тапла tuple<ArgsA...>, tuple<ArgsB...>, они как раз и нужны для обхода подобных ситуаций, я думаю скорее всего можно там сделать через тапл и это будет относительно норм выглядеть.
>>1611723>>а мув из lvalue делает rvalue.>Тут будет && && и это схлопнется в &&, смотри скрин. Щас бы, в 2k20, путать rvalue и rvalue reference… ♂️
H Sutter said on Jan 14, 2013 05:50 PM:@chico: But programmers can rely on constexpr being fully compile-time in the cases where it matters -- to do compile-time things like initialize array sizes or instantiate templates. If they try to invoke something that isn't compile-time, the compiler will let them know.In all other cases (using constexpr in places the language doesn't require to be compile-time), it doesn't matter. Programmers don't need to rely on anything else being done at compile vs. run time, and can't anyway because of optimizations -- the point of optimization is that the compiler can move work around, including in either direction from/to compile time to/from run time, and all such optimizations are legal as long as a well-formed program can't tell the difference (have different output) -- so it doesn't matter because the program is indistinguishable.I could imagine someone may want to force a variable to be written to ROM (say), but that (a) is rarely necessary or interesting in practice (I can't remember if I've seen a true need for it myself), (b) is handled using compiler- and platform-specific extensions if at all (e.g., optimization levels and related controls), and (c) isn't specific to constexpr (e.g., it has always been the case that a compiler "might" put a static const int variable into ROM, and that's often cited as the canonical reason why casting away const is undefined behavior -- it may not be physically possible to mutate the const object).Bjarne Stroustrup said on Jan 14, 2013 08:58 PM:It seems that I was too terse and caused confusion. Sorry. The correct answer - as stated by Herb - is that according to the standard a constexpr function may be evaluated at compiler time or run time unless it is used as a constant expression, in which case it must be evaluated at compile-time. To guarantee compile-time evaluation, we must either use it where a constant expression is required (e.g., as an array bound or as a case label) or use it to initialize a constexpr. I would hope that no self-respecting compiler would miss the optimization opportunity to do what I originally said: "A constexpr function is evaluated at compile time if all its arguments are constant expressions."
>>1611858>In particular, std::move produces an xvalue expression that identifies its argument t. It is exactly equivalent to a static_cast to an rvalue reference type.Чел...
>>1611859И к чему ты это процитировал?По-моему, твоё упоротство только подтверждает, что ты не отличаешь rvalue от rvalure reference.
>>1611138Проходил. но тогда он только выходил и я покупал отдельно каждый курс. Первые два достаточно простые. Красный повеселей. Коричневый сложен, черный не стал проходить, там подписка началась.В общем курс неплохой. Но следует учесть, что у меня было за плечами несколько прочитанных книг, мини проекты и на работе я перекатился в разраба. По сложности задач, зависит от времени и терпения. Некоторые я решал неделя+, другие за пол часа. Финалки достаточно сложные. Готовься к разрыванию очка на грейдерах.
>>1611886Что за тип — ясно.А при чём тут reference collapsing rule и что и как func "навешивает" — нет.
>>1611893При том, что есть функция f(T&& a) и мы туда отдаём переменную типа object&&, поэтому T будет object, получается я лох, а ты прав, прости меня, дурака.
>>1611900>При том, что есть функция f(T&& a) и мы туда отдаём переменную типа object&&В `std::move(object())`, `object()` это1. Не переменная, а выражение2. Тип которого `object`, а не `object&&`
>>1611812У тебя все правильно с делетером. Тут проблема с тем что SDL_Texture в хедере специально не определен, чтобы скрыть внутреннюю имплементацию, а unique_ptr разыменовывает указатель этого типа, например в методе get. Так можешь начать писать свою обертку для таких случаев.
>>1611906Я про func писал, а не про мув, в func мы передаём rvalue reference object&&, я жопой смотрел, думал там что-то типа func(object&& &&), то есть сам тип object&&.
>>1611913>в func мы передаём rvalue reference object&&В выражении `std::move(object())`, у `std::move` возвращаемый тип `object&&`, а у самого выражения тип `object`.
>>1611918static_assert(std::is_same<object, decltype(std::move(std::declval<object>()))>::value,""); статик ассершн файледstatic_assert(std::is_same<object, decltype(std::move(std::declval<object>()))>::value,"");всё окТак что здесь вы неправы.
>>1611826>>1611829Вот типо для примера, как это выглядит. Функция констекспр и строка залупа нигде больше не используется. Почему пидорас на компиляторе не может это заранее подсчитать и подставить готовый хеш? В итоге приходится делать вот такой лайфхак с аргументами шаблона.
>>1611937> Почему пидорас на компиляторе не может это заранее подсчитать и подставить готовый хеш?Ты пробовал аргумент std::string_view constexprом сделать?
>>1611967Хотя может попробуешь cout вытащить оттуда? Посчитать в констекспр, а потом уже печатать отдельно.
>>1611979Вот так сделал, ничего не изменилось, выход компилятора все тот же со строкой в бинаре.>>1611972Ну вот интересно почему так нахуй, что мешает посчитать при компиляции?
>>1611812>>1611908Нужно просто объявить деструктор и определить его в cpp. Иначе придётся include писать в заголовке.Алсо, =nullptr можно не писать
>>1611986А какая разница константный он или нет? Зачем вшивать в бинарь call GetHash когда можно просто mov rax, 0x228?
>>1611956А, блин, там тот же принцип, что и когда мы например f(T& t) по ссылке получаем, то внутри функции это уже просто T?
>>1611993>А какая разница константный он или нет? Ну больше там не на что ругаться как мне кажется. А тут может он не понимает, что его можно оптимизировать.
Кстати кто может объяснить как стдшный basic_string_view добился того, что при инициализации из константной строки он считает длину на этапе компиляции? Почему мой кастомный класс так не может и считает все в рантайме?
>>1612026 _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY size_type length() const _NOEXCEPT { return __size; }
>>1612026>>1612045Все я походу понял почему, в char_traits::length юзается магическая функция __builtin_strlen которая позволяет зафорсить компилятор посчитать длину заранее.
>>1612047 template<typename _CharT> _GLIBCXX14_CONSTEXPR std::size_t char_traits<_CharT>:: length(const char_type* __p) { std::size_t __i = 0; while (!eq(__p[__i], char_type())) ++__i; return __i; }
>>1612050 static _GLIBCXX_CONSTEXPR bool eq(const char_type& __c1, const char_type& __c2) { return __c1 == __c2; }
>>1612054Ну вот вроде почти так написал, все равно не хочет при компиляции считать. А вы кстати проверяли как гцц компилирует? Может он так же в рантайме считает.
>>1611875Мне в принципе пох. Я писал на множестве разных языков, включая большое количество функциональных. Это меня не пугает. Дело в том, что боюсь погрязнуть в байтоебстве. Раньше то я вручную памятью не управлял. И с другой стороны стоит прагматик, и говорит: нахой оно тибе нужна? Смысл в чем?И я не могу ответить на эти вопросы. Даже самому себе. Дело в том, что сук тянет к плюсам. Почему не знаю. Просто тянет. Наверное какие то детские мечты. Помню один чувачок с моей группы, а я учился на программиста, рассказывал, что C++ язык для "Ылитки". Я конечно в это поверил тогда. Потом уже, когда писал код на разных языках, включая Хаскелл, я смеялся над этой шнягой. Но теперь не знаю, хочется закрыть этот ебаный гельштат.
>>1611995Слушай, вроде как std::move(...) это xvalue expression, и что, можешь тыкнуть где написано про то, что у xvalue тип становится не T&& а T? А лучше вообще на статью, где объяснено про xvalue, glvalue, prvalue и тп.
>>1612106> Слушай, вроде как std::move(...) это xvalue expression, и что, можешь тыкнуть где написано про то, что у xvalue тип становится не T&& а T?https://timsong-cpp.github.io/cppwp/n4659/expr#5
>>1612114Алсо нашёл годное объяснение, может кому пригодится тоже.http://www.stroustrup.com/terminology.pdf
Посоветуйте, что почитать про шаблоны. Чтобы научиться такую хуйню >>1611602 писать, или хотя бы понимать что оно делает.
>>1612193МунлаеSFINAE пойми да посмотри пару примеров ,"метапрограммирование с++ шаблоны" можешь погуглить, на степике есть курс(бесплатный) https://stepik.org/course/3206/promo, там ближе к концу что-то разбирается, ещё неплохо помогает на хаскеле каком пописать, потому что там те же принципы, а вообще это был пример как сделать простую задачу сложным способом, в реале 95% всей этой хуйни никогда никем не используется, а то и вообще могут ебало набить за подобную хуйню в коде, как заметил анон выше>>1611635, потому что почти всегда всё можно сделать проще, читабельнее и тд
>>1611492>Что такое рефлекшоны?Что бы как в qt ты мог в рантайме узнавать информацию об классах, делать циклы по енумам, узнавать кем был вызван метод и т.п. В стандарте это все пока на уровне планов.
Почему char ch = new char[20];ch = (char)"full time"; if (ch == "full time") cout << "true\n";Выдает true, acin.getline(ch, 20); if (ch == "full time") cout << "true\n";falce? Как это работает?
>>1612384То есть, "full time" хранится, как константная переменная, но вторая "full time" не может же иметь тот же адрес памяти? Почему тогда true выдает.
>>1612514>>1612352Хуйню пишете. char ch = new char[20]; // Выделяется кусочек памяти на 20 чаров, с адресом первого байта например 0х4242. Так что ch==0x4242 ch = (char)"full time"; // Берется адрес первого байта статической константы, например 0х0013, и перезаписывается в ch вместо старого значения. Теперь ch==0x0013. Первоначально выделенная память с началом в 0x4242 и размером 20 байт при этом становится недоступной и течёт. if (ch == "full time") cout << "true\n"; // Ну тупо сравниваешь значение указателя c тем, что только что присвоил. Очевидно 0x0013==0x0013.А вот во втором случае надеюсь последние две строчки не продолжение той же программы, иначе это уже совсем пизда всё по-другому: char ch = new char[20]; // Так же, как в прошлый раз выделяется память. ch==0x4242. cin.getline(ch, 20); // Читается строка и сохраняется в участок памяти, на который указывает ch. Сам ch продолжает указывать на ту же память, т.е. ch==0x4242 if (ch == "full time") cout << "true\n"; // За каким-то хуем сравнение адреса первого байта статической константы с адресом первого байта выделенной памяти. Очевидно 0x4242!=0x0013.
>>1611812Вообщем сделал я эти кастомные удалители для SDL, если кому-то интересно как это сделать могу скинуть гитхаб.
>>1612638Там перед getlune нет выделения, да и любом случае все неправильно. Если надо строки сравнить, то надо либо strcmp либо std::string юзать.
Анончики, помогите. Как создать android-приложение на плюсах с Qt в Visual Studio? Не спрашивайте зачем мне это
>>1612853Мне студия нравится больше, чем креатор. Там даже расширение для Qt есть специальное. Не могу только понять как там проект под андроид создать. За 3 дня перерыл весь интернет и не один способ не работает
Думаю на чем делать ГУИ. Под виндоус, кросплатформенность не нужнаQt - монструозная хрень, требует кодогенерации, нет нормального дизайнераwxWidgets - в общем норм, есть некоторые корявости вроде обработки событий, нет дизайнера (есть какие-то сторонние тулзы, но ну их)WinForms - очень простые в использовании, есть дизайнер, по сути дельфи от майкрософта. Но нужно будет делать врапперы вокруг плюсового кода.MFC - вроде как легаси ад, а вроде как и нет. Есть кое-какой дизайнер. Отлично интегрирована в студию, проблем с вещами вроде файлов ресурсов не будет.GTK - не юзал, по отзывам имеет нестабильный API, требует танцев с бубном чтобы юзать под виндой.
>>1612887>нет нормального дизайнераЛолват? Там на виджетах считай теже винформс, только непривычные, а с qml там по-моему даже удобнее чем в студии с xaml.
>>1612887> Qt - монструозная хрень, требует кодогенерации, нет нормального дизайнераthis.Лучше уж код генерировать, чем дрочить MESSAGE_MAP_BEGIN. Если ещё плагин для студии поставить, то вообще ноль ебли.И по поводу монструозности - это скорее всего хромиум (спасибо веб-блядям). По факту тебе нужны только Qt5Core.dll, Qt5Gui.dll и Qt5Widgets.dll (все вместе точно до 50мб). Ну и pdb + дебаг версии этих библиотек.
>>1612887>Под виндоуса кроме этого? Что делать тулза будет? Какие функции будет? Ну там - базы данных, графики, порты ввода/вывода, сетевые функции, работа со звуком?Сколько человек будет использовать? Сколько лет, ты планируешь, она проработает? Какие версии винды? Будет ли продаваться (т.е. коммерч. лиценз)? Будет ли это однократная поделка или допиливаться месяцами/годами? Сколько человек будет участвовать в разработке? Придется ли кому-то после тебя её дорабатывать?
>>1612887>>1612939Ну и в большинстве случаев можно вообще без moc обойтись, теперь сигналы без него могут работать
>>1612887>монструозная хреньНа сам деле там есть утилита для деплоя приложух, которая сама тебе выбирает только те длл которые требуются. Получается в районе 50-150 мб у меня обычно.
>>1612940Редактор для самодельного игрового движка. Продаваться не будет. Будет использоваться и разрабатываться потенициально лет 20, поэтому стабильность важна (а MFC стабилен как кладбище). Писать буду я один скорее всего. >>1612914Например, свой компонент так просто не добавишь через дизайнер, да и вообще в нем большинства компонентов нет. XAML тоже плох, но я и не планировал WPF использовать.>>1612939Я сколько не пробовал юзать QT в студии, у меня всегда что-то ломалось. То кодогенерация, то обновления файла формы в дизайнере не подхватывались. Чтобы те же файлы ресурсов прикрепить к бинарнику тоже нужны кастомные шаги сборки.Вроде как Qt очевидный выбор, но на моем опыте с ней требуются некоторые пляски с бубном. MFC ископаемая, но она в студии работает из коробки.>>1612974Тут больше имелся размер самой библиотеки - она скачивает гигабайт 10, наверно, при установке, и там есть вообще все на все случаи жизни.>Получается в районе 50-150 мб у меня обычно. Вообще это очень много, для простой десктопной программы.
>>1612997>скачивает гигабайт 10,Я хз, у нас анально огороженный инет на виртуалках, кют ставим из оффлайн инсталлятора (на сайте есть такая опция, но в жопе).
Если передать указатель в другую функцию и освободить память там. То вроде же и указатель в мейне должен освободиться? Я знаю, что указателю после delete еще нужно nullptr присвоить. Но если этого не делать, и просто использовать его дальше будто его не удаляли, то что будет? Код на пике ошибку не выдает. Куда он пишет значение 69? Про смарт поинтеры я в курсе, но мне интересно как эта херня работает с сырыми указателями.
>>1613206delete просто помечает память как освобождённую, мол память по этому адресу может использоваться снова, с самими данными по адресу ничего не происходит, пока нет нужды их затереть и что-то другое туда записать
>>1613224Ну типа я про то же, сегодня ты записал туда 69 и распечатал 69, а завтра демон насрал и распечатал ты 18962862865923, хотя 69 вроде записывал.
>>1613232Да понятно, что использовать указатель после делете это юби, чё там будет одному Богу известно.
>>1613234>использовать указатель Точнее дереференсить его. Ну это логично, мы сказали, что больше нам не нужна память, куда этот указатель указывает, компилятор делает с ней чё хочет угодно.
>>1613219>>1613224То есть, new резервирует мне память на куче, и только мои указатели могут туда писать. А после вызова delete память освобождается, и писать туда может уже кто угодно, верно? Вообще как и кем это все прослеживается? Например сам размер выделеной памяти new int[10] – это делает C++ runtime (или как оно правильно называется) или операционная система за этим следит? Если потом вызвать delete[], откуда он знает, что память размером 10 интегеров, т.е. где хранится эта информация?
>>1613239>А после вызова delete память освобождается, и писать туда может уже кто угодно, верно? Вообще как и кем это все прослеживается? Например сам размер выделеной памяти new int[10] – это делает C++ runtime (или как оно правильно называется) или операционная система за этим следит?Размер инта умножается на 10 плюс некоторое смещение, потом с полученным размером вызывается системный malloc.>>1613239> откуда он знает, что память размером 10 интегеров, т.е. где хранится эта информация?Там в начало добавляется смещение, в котором длина хранится, поэтому кстати и нельзя путать delete и delete[], так как обычный delete ничего про смещение не знает, а скобочный будет размер искать в начале.
>>1613239Впрочем это всё везде может по разному быть реализовано, стандартом не регламентирована реализация, я лишь один из вариантов рассказал.
>>1613239Строго говоря в твою память и так любой писать может, иначе как бы я cheat engine пользовался.
>>1613206Указатель — это просто число, адрес в памяти. Он вообще не знает, есть ли по этому адресу что-то, или нет. Если память освободили, вызвав delete, а кто-то всё равно полез по этому адресу, то может случиться всякое разное:- ничего- дебаггер может поймать ошибку и остановить программу- чтение мусора- повреждение данных другого объекта (который уже успели записать туда вместо удалённого)- порча кучи (внутренних записей менеджера памяти)- access violation (если менеджер памяти уже отдал этот кусок системе обратно)
>>1613239>Вообще как и кем это все прослеживаетсяmalloc.c лолОн какбэ зависит от компилятора, и там обычно сидит оптимизирующий менеджер памяти заточенный под твою ОС. Прямого управления памяти обычно нет никогда.
Я так понимаю, методы структуры хранятся отдельно от информационных полей объектов структуры? Я не проебусь, записав структуру в файл, записав туда какие-нибудь указатели на методы?
Что происходит с фоновым потоком метода класса, запущенного с помощью datech, при передаче этого объекта в функции указателем?
>>1613456вот, полюбуйтесьсначала эти щеночки задают такие вопросы, а потом работают на работах за 150 тыщ рублей в месяца я гнию у себя в провинции
>>1613323>Указатель — это просто число, адрес в памяти.нет, утыроквообще то указатели в с++ типизированные, за исключением специального случая
>>1613632Ну блядь инты и енумы тоже типизированные, но это не отменяет того, что это тоже просто числа.
>>1609284меня кстати всегла это интересовало, есть пример кода, который переварится в СИ но не в крстах?
>>1613728Приведение void* к другому указателю в плюсах через статик каст, а в си просто так кастится.
Дано:std::vector<MyObj > objects;Как вызвать функциюvoid fn(std::vector<MyObjBase >)Без лишних мозгоебли с reinterpret_cast и создания нового контейнера?
Заметна ли разница по времени между обращением к элементу по индексу у вектора и массива? Ну мне дохуя раз надо получается. VS пишет, что много времени уходит на [] оператор. Есть эксперты в чате?
сап. тупой вопрос, но я не могу нагуглить хоть убейте. есть функции strchr() и strtchar(). а какой аналог strrchr для strstr? чтоб нашло последнее появление субстроки в строке, а не первое
>>1614101>>1614106Идея правильная, но хотелось бы этот код оставить в .cpp.shared_ptr же тут ни не поможет?
Что можно почитать по устройству компиляторов/линковщиков и конкретно Visual Studio?Надоело, что процентов 70 сообщений при работе со сторонними библиотеками тупо не понимаю.
>>1614021В дебаг сборках медленнее, в релиз только при изменениях резерва памяти в рантайме, если ты резерв подходящий не сделал.
>>1614260И кактус на монитор поставить зумеры, это вам не джаваскрипт, тут нужно понимать что происходит
>>1614116>хотелось бы этот код оставить в .cpp.Ты не обязан имплементации шаблонов делать в хедере.https://www.codeproject.com/Articles/48575/How-to-Define-a-Template-Class-in-a-h-File-and-Imp
Анончики, не подскажите как в C++ получить максимальную информацию о компьютере? Начиная от битности системы, заканчивая видюхой? Гуглил, ничего толкового не нашел...
>>1614393мне нужна не только это. Мне нужны максимально возможные данные о компе. Понятно, что если гуглить по отдельности, может и сделаю (За 1к строк), но может есть более практичные способы (Где всё храниться в одном месте/либе)
>>1614360Я больше имел ввиду то, что хотелось бы, чтобы этот код не расползался по разным dll и при изменении не приходилось всё заново собирать.
>>1614427Смотрел сколько там данных? Или думаешь я так не гуглил. Там инфы на 0.01% нужной мне. Нужно что-то на подобии wmi python
>>1610507const int L = 7; // L = 8Бля, вот это ты мне мозг сломал сука xDЯ просто мимокрог. Смотреть эту хуйню, или тебе уже не надо?
помогите пожалуйста понять что не так с кодом. если убрать из ифа на втором скрине переменные act_leftpressed и act_rightpressed, ошибка исчезает, это кстати приватные поля того же класса actor
>>1614627Еще лучше использовать стат анализаторы чтобы все варнинги по мере написания кода показывались.
>>1614445Т.е ты сам нихуя не знаешь, какие данные тебе нужны? Земля бетоном. Алсо репортнул тебя на всякий тарищу майору, ты какой то.
>>1614264>>1614319С reserve() нужно будет использовать push_back(), а с resize() сразу можно оператором [] записывать. Что в цикле быстрее?
>>1614751Спасибо! 4 курс, ит-специальность, учил плюсы на первом и втором курсах, но очень медленно - тупо освоил книгу Лафоре "ООП в С++", но потом понял, что она очень старая. Год тупо ничего не делал, этой осенью снова взялся за обучение, но плотнее. Попытался найти работу, но ничего не получилось - 4 отказа после тестового/собеседования. Сейчас понимаю, что знал мало. Немного потрогал кьют в ходе решения одного из заданий, неспешно прочитал все книги Майерса кроме СТЛ, петов на гитхабе не было, только несколько решенных тестовых небольших. Если все объединить, то мой объем знаний можно получить за год интенсивного обучения. Написала эйчар по резюме, которое не обновлял месяца 3, выслала тестовое - сделать клиент-северный чат на сокетах без использования библиотек, компилировать под линукс и написать мейкфайл вручную. Я немного переусердствовал и написал насколько умею и понимаю в ООП-стиле, чтобы было расширяемо и т. д., отправил, позвали на собеседование. На собеседовании, что интересно, вопросов чисто по плюсам не было - тимлид сказал: "мне в принципе всё понятно". Писал насколько могу хорошо - лямбды, смарт-поинтеры, все, что знаю и понимаю из более свежих стандартов в общем. Хотя уже сейчас, глядя на этот код, очень много переделал бы
Мне сегодня приснился сон. Суть его в следующем. Если у бабы сиськи большие, то это аналогично тому, что она хранит данные в самих сиськах, а данные как мы знаем бывают объемные. У мужиков сиськи не объёмные потому, что мужики хранят указатель на данные, а не сами данные.
>>1614770Тащи код сюда. Интересно же как выглядит код, который апрувнули, думаю ньюфаням будет полезно.
>>1614739Быстрее reserve + emplace_back.Во время resize будет создаваться объект конструктором по умолчанию, а потом перезаписываться копирующим =.В случае emplace_back объект будет конструироваться прямо на месте.
Я тут недавно мелькал с тестовым заданием по поводу Понга с ботом. Сдавал его где-то неделю назад, как я понял само тестовое их устроило раз позвали на собес, но на собесе я ужасной чепухи наговорил и мне так и не перезвонили.https://github.com/AI-Decay/Pong-with-Bot
>>1615025? Я скинул гитхаб же, код весь там, должно собираться. Сейчас уже вижу много проблем в этом коде, но я ничего не изменял с момента отправления.
>>1615066В этом и твоя проблема. Надо делать не как можно лучше, а нормально блядь, чтобы удобно было, и писать, и читать, и использовать.
>>1615069Это что то типа парадокса Блаба. Новичок не может знать что такое нормально, для него это и есть нормально. Потом он узнает о новой фиче, и начинает считать ее нормальной, а предыдущую - недостаточно хорошей.
>>1615127Он же написал у мужиков указатели. Очевидно джва маленьких шара и указатель, направляемый в сторону двух больших шаров женских данных.
>>1615022Шляпища. Незнание ООП вижу я. Очень слабая реализация, нет интерфейса. Это даже не уровень лабы.
>>1615144>указатель, направляемый в сторону двух больших шаров женских данныхЛучше, когда указатель является указателем на член класса. Забыл, на каком языке пишешь?
>>1615040> 2020> xmlЛучше никак. Если будешь использовать libxml2, то отруби в нём всё то же что отрубали в xmlsec. Для базового использования можешь взять rapidxml или tinyxml2.
>>1614810Сначала испытательный срок - платят только оклад 24к, затем добавляется бонус 0-40%, который зависит от результативности на проектах, т. е. после исп. срока 24к-33.6к. Не ДС-ы.>>1614840Щас дерьмом закидают как бедолагу вышеhttps://anonymous.4open.science/r/acfc48d1-abf6-480d-a5b2-2d6b729c985c/
>>1615022Типичный код новичка, который пытается имитировать "настоящий" код, старается, но толком не понимает, что делает. Все не так плохо. Но если тебя взять на работу, то вреда будет больше, чем пользы: кому-то придется тебя учить.
Можно ли назвать знания работы с мьютексами и обоспечение потокобезопасности фундаментальными знаниями C++ для джуна?
>>1615022>>1610003Он разбирал многие моменты, которые у тебя коряво написаны, в плейлисте для начинающих
>>1615147А куда я тут мог интерфейс засунуть? Разве что сделать какой-то класс, который бы обобщал все фигуры (которых у меня всего 2)
>>1615183>Все не так плохо. Но если тебя взять на работу, то вреда будет больше, чем пользы: кому-то придется тебя учить.Я думал Джунов обычно и учат по началу.
>>1615346Не, учат интернов, а джун это такой имплементщик, предполагается, что он способен нормально выполнять задачи по данному описанию, ну там создай класс, который ведёт себя так-то, отрефактори вот это и это, чтобы было вот так, добавь функционал такой-то по аналогии с тем-то и тд
>>1615181>anonymous.4open.scienceТы бы еще накрыл AES-ом исходники, а то чето слишком легко смотреть, всего лишь файлы по одному скачиватьЯ б взял теннисиста, чем этого шифрующегося шизика-дауна
>>1615506Вот даун сука, с этой говнохуйни даже вгетом напрямую файлы не вытянутьИдут нахуй: ты, твой чат, создатель этого шедеврального реп хостинга
>>1615585Ну поставь звездочку тогда, шерлок. Тебе же нужно скопировать чужой кот. А за возможность говорят спасибо, а не "ебать клоун"мим
>>1615585Пиздец, нахуя по 100000 хеадеров создавать на каждый пук? Открываешь файл, а там 5 строчек один ебучий енум объявлен и все.
Вопрос по SFML.Почему, когда я применяю к спрайту setOrigin(10, 20), спрайт сдвигается в точку (-10, -20) ?
>>1615485Это я переборщил, тимлид сказал, что достаточно было бы захардкодить>>1615585Ну вот поэтому я и не хотел ссылку кидать
>>1615840>ссылку кидать Ебать ты программист, нахуй. Сейчас (да и раньше) в интернете, если палишь уникальное сочетание символов, то это деанон
>>1615840>Ну вот поэтому я и не хотел ссылку кидать Скинул бы сразу всем было бы похуй. Эффект стрезанд в действии.
Между версиями qt большие отличия? Есть смысл более старую версию ставить, если книжка по ней именно?
>>1617248>2020>найти книжку в интернете по любой версии qt не проблема>есть смысл более старую версию ставить, если книжка по ней именно?Как же мне не понять этих людей
как думаете, насколько корутины будут медленными?в принципе, это довольно прикольно выглядит, только интересно, сколько за это придётся заплатить.
>>1617248Он хорошо учится по встроенному хелпу с примерами и туториалами, ну и стоковерфлоу для трудных мест.
char ch 1, ch2;ist.get(ch1);if (!ist) return;ist.get(ch2);if (!ist) {ist.clear();ist.unget();}return;Я правильно понимаю, что unget() положит обратно ch1? Влияет ли ist.clear() на память потока (последний символ)? Влияет ли неуспешная попытка ist.get(ch2) на память потока (последний символ)?
>>1617365Матерь Божья, ist.clear(std::ios_base::badbit) выставляется. Пусти идиота программировать, и он отстрелит всю ногу.
Анон, дай совет студенту (хотя тут и так одни студенты). Есть вот такой код http://cpp.sh/74jmmДа, это лаба, но при её выполнении у меня появилось аж два вопроса:как сделать 132, 161 и 173 строки хоть немного короче, чтобы умещались хотя бы в 24 дюймовый экран в 100% масштабе?Почему в строках 132 и 137 если для переменных chas, minuta и sekunda написать пространство имён Triad вместо Time, то нихера не работает, а переменным god, mesjac и den вообще насрать, через Triad к ним обращаются или через Date?
>>1617415У тебя ромбовидное наследование.Memories/ \Date Time\ / TriadНу вот компилятор и не знает, ты собираешься использовать Triad который от Time или который от Date
>>1617433А почему переменные god, mesjac и den изменяясь в Date меняются также и в Triad, а с классом Team такого не происходит? Что-то мистика какая-то.
>>1617440В Date ты обращаешься к переменным напрямую: ++godВ Time ты создал Новое поле Date date; и меняешь ЕГО поля date.DenPlus()
>>1617415>как сделать 132, 161 и 173 строки хоть немного корочеберешь и переносишь. Код у тебя тот еще пиздец, конечно. Последняя строка функции SohranVremja что должна делать?>Почему в строках 132 и 137 если для переменных chas, minuta и sekunda написать пространство имён Triad вместо Timeпотому что protected
>>1617443Ааа, а я это говно месяца два назад написал, а пришло время сдавать только сейчас. Спасибо за терпение.>>1617445>Последняя строка функции SohranVremja что должна делать?Хрен его знает. Наверное, рудимент от чего-то остался. Вообще, этот код ещё надо бы чистить и править.
>>1617452Я б честно говоря все выкинул и переписал.Мне кажется что идея у тебя была такаяclass Triad { int a,b,c }class Date : Triad { getDay() {return a} setDay(d) {a=d} ...}class Time : Triad { getHour() {return a} setHour(h) {a=h} ...}class DateTime : Date, Time { Date date; Time time; setDateTime(long long unixtime) { date.setDay(...)} }
>>1617457Ой, в последней строчке я имел в виду без наследования, просто аггрегацию:DateTime { Date date; Time time; ...Правда я не знаю какое у тебя задание, может как раз на наследование... С другой стороны, нужен ли класс Triad...
https://www.youtube.com/watch?v=rHIkrotSwccПиздец, я всегда думал, что unique_ptr зиро оверхед. Даже сам Страуструп так говорил. Какого хуя?
>>1617432Да норм все. Анон просто не знает нормы русского языка, которые говорят, что нельзя употреблять одно и то же слово в отдельной части текста
Сап аноны недавно начал вкатываться в программирование и у менявозник вопрос можно ли как то передать адрес массива который определен в другой функции причем что бы main использовался только для вызова других функций вот код который я сделал для примера
>>1617566МожноПросто делаешь этот массив ДО функции mas и в нее передаешь.Ну напримерint main(){int * mass;int limit = mas(mass);int summ = sum(mass, limit);delete[] mass;заодно и не забудешь удалить его - каждому new[] должен соответствовать delete[]int mas(int& mas) { //тут передаешь массив по ссылке - все изменения распространятся и вовне...mas = new int[n];...
>>1617642Надо знать C++, матан, теорию алгоритмов, дискретную математику и, зависимо от направления, физику. Тебе всё это будет проще в универе каком-нибудь выучить. 4-5 лет и ты проградрист.
>>1617645Никогда не понимал смысла прототипов, логично же сразу в начале программы объявить все функции без маняпрототипов.
>>1617644>C++, матан, теорию алгоритмов, дискретную математику и, зависимо от направления, физикуОхуенный список. Из него реально полезно знать только ВНЕЗАПНО С++. Возможно алгоритмы, чтобы на собесах (и только на собесах) деревья вертеть. Все остальное зависит от предметной области.>4-5 лет и ты проградрист.На этом уже шаге можно искать оплачиваемую стажировку. На которой даже платят деньгами.
Аноны, у меня опять проблемыhttp://www.cpp.sh/5bdotПочему методы класса Date при вызове из объектов в классе Time не отрабатывают? Компилятор как будто их не видит. Использую VS2019.
>>1617668А как передавать по ссылке? Я в ссылках в ООП ещё не особо разобрался, мой максимум это списки.
>>1617669void ChasPlus(Date& date)..void PlusChas(Date& date) { ChasPlus(date); PokazDataVremja(); maks(); min(); }..if (vvod == "ChasPlus") vremja.PlusChas(date);Если я сам не путаю ничего, тоже изучаю только пока.
>>1617642Сложно. Много и главное понимать нужно. Выбери что-то другое, там во многих случаях просто знать достаточно.
>>1617676Не знаю, я не выбирал другое. Почему? Да ни почему. Какие могут быть почему, когда есть c++?
>>1617679Он удобен для написания небольших скриптиков, много чего делается искаропки, учится моментально, в каком-то смысле каждый программист умеет писать на питоне, тк он близок к псевдокоду и тд
>>1617681А мне было бы удобно программировать на Русскомцел главн(){строка хуй;вывод << "Эй, анон";ввод >> хуй;если(хуй == "а?") вывод << "хуй на!";}
>>1617687Но я хочу так в крестах! Чтобы тупые пиндосы учили великий Русский язык лишь бы кодить на крестах!
Вот, сделал цепочку из наследований и всё работает http://www.cpp.sh/2awgnНо почему не работает тут????? http://www.cpp.sh/2awgn
>>1617691Сука ненавижу когда перед и полсе звездочки пробелы, когда она в качестве оператора указателя.
>>1617708Да, это хуита, я лично всегда пишу рядом с типом, int*, а кто-то пишет пробел перед звёздочкой, в этом тоже какая-то логика есть, но мне её не понять, так получается тип "указатель на инт", а так хз что вообще, ещё с констами какая-то такая параша тоже есть.
>>1617705Я хочу здесь http://www.cpp.sh/5bdot понять, почему методы Date не вызываются при компиляции из методов Time, если оба методы наследуются от Triad, а Date является другом Time.
>>1617714Попробуй тут часы, минуты и секунды поуменьшать и посмотри, как не меняются от этого дни, месяцы и годыhttps://repl.it/repls/ConsciousShamefulOctalА при линейном наследовании вида Tried->Date->Time всё нормально.
>>1617717Очень, очень тяжело понять, что у тебя там написано, но если я правильно понял у тебя при вызове ChasPlus меняется переменная date, которая у тебя class Date{...}date;, а не vremja.
>>1617720class Date : protected Triad{...}date;class Time : protected Triad{protected: void ChasPlus() { if (chas == 23) { date.DenPlus(); chas = 0; } else ++chas; }Вот тут ты date меняешь.class Memories : protected Date, protected Time{....void PlusChas() { ChasPlus(); ...}vremja;...vremja.PlusChas()А вот тут ты меняешь vremja, но ChasPlus будет менять не Date, которая в vremja, а date, которая выше была.
>>1617721>>1617723Короче, я напутал в методах-сохранялках даты/время? Сама по себе дата меняется, но я сохраняю не то. Я понял.
>>1617725Да, ну и я бы переделал так, считал бы всё в секундах, ну там addday это добавлял бы к текущему количеству секунд 86400 и тд, а потом как хотел бы печатать брал бы остаток от деления на 86400(это были бы часы/минуты/секунды) и то, что поделилось было бы днями и потом переводил бы количество дней в год месяц день по формуле отсюдаhttps://web.archive.org/web/20170507133619/https://alcor.concordia.ca/~gpkatch/gdate-algorithm.html
>>1617672Ну он там в середине видео пояснял, что unique_ptr генерит 4 лишние инструкции ассемблера, причем не самые быстрые, косвенный доступ к памяти. Вот об этом речь видимо и шла.
Сап, анон. Делаю бенчмарки своего сатана, бенчмарк сделан так: загрузка файла в вектор значений, запуск таймера, цикл по выходным значениям, мой матан (используется Eigen), результат в другой предсозданный до таймера вектор, таймер стоп.В релизе процессор мммаксиум в 30%, как увести его в сотку?
>>1617696А ты их объявил виртуальными?Почитал бы хоть о принципах наследования, а не брался за него сразу, да ещё и за множественное.
>>1617696Блядь. Удали весь свой сраный код и выбери предметную область получше.Для изучения наследования и композиции отлично подходят gui-контролы. Заодно и чему-то реально полезному научишься.
>>1617717Я тебе вчера уже объяснял, почему.>>1617723Потому что в MinutaMinus() ты вызываешь ChasMinus() ЭТОГО объекта, vremja.А в ChasMinus() ты вызываешь date.DenMinus() ДРУГОГО объекта date.
>>1617696Я тебя запутал немного, у тебя объекты были глобальными созданы, т.е. не надо передавать их в функцию.Если я правильно понял твою ошибку, то у тебя дни прибавляются в объекте date, а выводишь ты значения полей объекта vremja.
Перекатhttps://2ch.hk/pr/res/1617857.htmlhttps://2ch.hk/pr/res/1617857.htmlhttps://2ch.hk/pr/res/1617857.htmlhttps://2ch.hk/pr/res/1617857.htmlhttps://2ch.hk/pr/res/1617857.html
>>1617746Нет, в смысле он имеет ввиду например сменить всякие __gxx_personality_v0, __cxa_throw и тд? Ну там сигнатуру поменять, функции убрать/добавить, крч интерфейс сменить или он про другое?