Это копия, сохраненная 5 февраля 2021 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
⚹ https://github.com/sosachbot/cppthreadhat/wiki
Ответы на вопросы:
⚹ https://en.cppreference.com/w/
⚹ https://www.cplusplus.com/reference/
Для указателей: ⚹
Прошлый: >>1750735 (OP)
Можно упороться в variadic templates по приколу, но не стоит усложнять, благо в плюсах есть дефолтные аргументы, которые для таких целей подходят тютелька в тютельку.
Тогда variadic templates, хотя я таких ебанутых функций с полусотней аргументов в жизни не видел.
мимо байтоеб, разраб эмуляторов и гипервизоров
У шинапи хоть сишный интерфейс, без всяких хипстерских фишечек крестов.
Vulkan современный, но там тоже все через структуры. Это не так плохо, как кажется
Будут, конечно. Но не все.
Многие задачи загуглить не выйдет, они обычно связаны с логикой самой программы, а не что-то общее техническое.
Шапка для кого?
А как же ты собираешься вкатиться, если ты настолько непробиваемо тупой, что даже не нашёл эту информацию сам?
>что даже не нашёл эту информацию сам?
А что, спрашивать у живых людей, а не у текста уже нельзя?
Ну там хотя бы можно понять - задумка была в том что бы дать самый низкий уровень абстракции не раскрывая при этом аппаратную архитектуру видеокарты. Отсюда и пердоль с девайсами очередями очередей и прочим этим.
Ты character literal имеешь в виду, например char ⚹c = &('q') ? Потому что это просто промежуточное числовое значение, у него нет адреса. Это то же, что и int ⚹n = &(10).
А строковые литералы обрабатываются компилятором отдельно и сохраняются в памяти в явном виде, то есть адрес у них будет.
в 2к20 уже моветон
Никак. Фейлы неизбежны, чел, а твои способности имеют свой предел. Относись ко всему с долей здравого похуизма и решай свою задачу, если тебе это действительно надо
Я просто сейчас пытаюсь разобраться с указателями и константами. Вот почему, например, пик работает? Ссылка это же просто замена разыменованного указателя. Можешь подробно рассказать как вообще работают указатели на rvalue?
спасибо, за совет;)
Ссылки - это не просто сахарок для указателей, в них куда больше магии.
Lvalue-ссылке можно присвоить временный объект (rvalue), но при этом ссылка должна быть константная. Например, const int &x = 123 тоже будет работать, будто это обычная константная переменная. Если это не примитив, деструктор не вызовется до окончания области видимости ссылки. А у примитива и деструктора не будет.
Уровень твоего развития.
в апи при регистрации класс окна в поле соответствующей структуры записывается указатель на процедуру-обработчик
в своем классе-обертке я попытался в эту структуру скормить лямбду которая захватила this
но стейтфул лямбды к указателю не приводится
какие есть способы достичь желаемого эффекта (доступ к this в обработчике) например через промежуточную функцию или передав указатель на оператор() у лямбды
> но стейтфул лямбды к указателю не приводится
Потому что лямбда - это не функция. Ты не можешь вызывать лямбду по указателю как функцию. Забудь про лямбды.
> какие есть способы достичь желаемого эффекта (доступ к this в обработчике)
Передавай ссылку на свой экземпляр объекта. А вообще завязывал бы ты с ООП, видно же что не шаришь, пытаешься функциональщину лямбду пришить к жопе классу.
Windows позволяет сохранить пользователь ский указатель в окне, что то типа setwindowlong . Юзай простую сишную функцию как обработчик, в ней извлекая указатель и дальше форвард вызов в свой класс
А на кой хуй, на MSDN есть уже начало реализации и на github тоже.
GUI пилят на QT или шарпах
QT вполне себе нормальный GUI. Да и WinAPI сейчас для GUI мало кто использует.
Иди нахуй, долбоёб
>>759410
>Windows позволяет сохранить пользователь ский указатель в окне, что то типа setwindowlong.
Вот только на этот long может оказаться несколько желающих. Лучше хэш hWnd => this. Ну как вариант.
> это QT медленный?
Естественно он медленный. Он даже медленнее WINAPI на GDI+, не говоря уже про нормальный интерфейс на GPU.
Делал тест, типа недогуй. Единственный layout - табличный grid, единственный widget - rectangle. Под виндой можно вообще когда хочешь эти ректы рисовать, вне события WM_PAINT или WM_ERASEBKGND, вне Begin/EndPaind, все автоматически завязывается с vsync, ничего не бликает. Попытался повторить на XLib и охуел. Сразу тащи OpenGL, ну ок, но синхронизация у него работает натурально через ЖОПАэль. Нужна правильная видюха и драйвер.
Такие же, как и для вызова метода инстанса из обработчика прерывания на микрококонтроллерах, очевидно.
А ЖЫРНАЯ лучше
Бонусом задачка для смелых. Что за хуйня ниже написана?
int ✱(✱arr(int, char ✱ const (✱const ✱)⟦10⟧))⟦20⟧;
Это в Си-тред лучше. Массив из 20 указателей на функции, которые возвращают int ✱, а аргументы у них int и еще какие-то ебнутые указатели на указатели на указатели. Кстати, сколько помню, по сишному стандарту, массив в аргументах считается как указатель.
Вопрос с подвохом, и суть в том, что если ты решил на него ответить, то скорее всего ты хикка-задрот-языков, который ничего не смыслит в программировании
Не надо хэш, если у тебя планируется меньше тысячи окон, линейный поиск будет быстрее.
Нет, неправильно.
Ваще не массив. Там ваще нет массивов, только указатели на них.
В данном случае 7.2 вообще ни при чем, он применен не будет.
Вопрос без подвоха. Т.е. это правильная, корректная строчка, она откомпилируется.
✧ ✩ ✪
Всех неравнодушных эстетов прошу пройти опрос о наименовании указателя:
https://xoyondo.com/ap/qwCbzfjgtiYZicQ
✮ ✯ ✰
подвох не в этом
С таким подходом и электрон быстрый. Куда спешить, можно нагружать систему по полной всяким говном, таскать с собой комбайн на все случаи жизни и рисовать только на ЦП. Пока не тормозит на ш5 - гуй быстрый.
Везде нужно искать компромисс.
⚣ ☭ ⚧
https://www.strawpoll.me/20659412
const int ⚣c = NULL;
const int ☭c = NULL;
const int ⚧c = NULL;
☭☭☭ I from Sovietskaja Rodina! ☭☭☭☭
Почему Абу не дает нам нормальных указателей? Может, в /d/ обращаться? Не помню, чтобы за пару лет здесь видел применение звездочки для жирноты?
Двачую. Для math сделали интеграцию с mathjax, а для pr ``` или [code][/code] до сих пор нет
@abu, ti ahuel tam?
int a = 1;
int *b = &a;
[/code]
>это классика
Ебнутый typedef какой-то, примерно как стихи на Perl, лол. ЭТОГО ЗНАТЬ НЕ НУЖНО.
Нихуя. Это статемент!
Да тебе неделю чистого времени дай - и ты разве что методом тыка угадаешь. Лол, а еще кудахчут, что силечка - илиминтарна. Простейшую строку не могут распарсить!
Парсить строки - есть специальный инструмент - парсер. Если ты за него - вот и распарсь эту строку, чтобы я понял, если нет противоположной задачи.
>>759576
Создал тред в /d, налетай
❤️
https://2ch.hk/d/res/763695.html (М)
https://2ch.hk/d/res/763695.html (М)
https://2ch.hk/d/res/763695.html (М)
https://2ch.hk/d/res/763695.html (М)
❤️
Так это от тебя ждут пояснений, что там за семантика у той строки, дурачок.
Давай выхлоп парсера
Тут кроется ответ. Прочитай, будешь всё знать об этой залупе
неважно, я жестко тупанул, думал в таких ситуациях unique_lock работает не так, как на самом деле.
Поскольку такая вещь (✱const ✱) не является объявлением параметра функции (типа то нету), вангую пример на знание того что
(int)smth ≡ int(smth)
Указатель на массив из 20 указателей на функции, возвращающих int, и принимающих инт и массив из 10 указателей на константный указатель на константный указатель на чар
Не подошло.
Все компилится.
Твой сайт говно.
Сейчас бы верить нерабочему васянскому сайту, а не компилятору :3
А указатель на массив интов-то ты осилишь хоть объявить, иксперд с 1 курса парашевыносительного?
Там нед подсказки
Говори уже что это, с подробным объяснением
Ты бы еще тайпдефами объявил, клоун. Уж указатель на массив-то вполне нормально и напрямую объявлять.
Ай мля ты прав. Что то я тупанул.
template<typename T, size_t Size>
using ptr_t = std::unique_ptr<std::array<T, Size>>;
ptr_t<int, 100> p;
Продвигают потихоньку (видос на тему zero cost abstraction, где то с середины) https://www.youtube.com/watch?v=c9Xt6Me3mJ4
Хотя конечно у смарт поинтеров оверхед есть.
На винде vcpkg вроде как берёт всегда последнюю установленную версию msvc, так что gcc в пролёте
:( А есть какой нибудь удобный и понятный способ/гайд по линковке либ для gcc? Пробовал я у gcc -L -l -I как-то вообще игнорит указанный путь. Не хочется IDE ставить, меня возбуждает мысль о писании кода в блокнотах.
Заставить vcpkg работать на винде с чем-то, кроме вижуалки, у меня не вышло, при сборке всегда была простыня в духе "undefined reference to X". В самой вижуалке работает охуенно.
>>759891
Удобного способа подключать либы на C++ не существует. Кроме vcpkg есть ещё conan и ещё десяток менеджеров пакетов, но одни работают криво, а в других не хватает либ. Так что и по сей день самый удобный способ - вручную качать архивы с сайтов либ и подключать, и ещё повезёт, если есть билд хотя бы для x86_32.
Попробуй https://conan.io
Соответственно доступные пакеты можно глянуть https://bintray.com/conan/conan-center и https://bintray.com/bincrafters/public-conan
Лучше васянам, чем себе.
Ну это да, надо разбираться.
>>759911
Он же для СMake? И ещё дебильный вопрос про CMake - это же не компилятор а хрень которая указывает компилятору на либы и как вообще компилировать?
>>759915
Попробую
>>759914
Ну у GCC -I -L -l вроде по сути легко.
Спасибо всем, пойду дальше разбираться. Держите девочек.
CMake - это генератор файлов для разных систем сборок. Например, make-файлов, проекта visual studio (ms build) и ещё куча никому неизвестных. В теории, создаёшь CMakeLists.txt, пишешь в нём пару десяток строчек с указанием путей до либ, запускаешь, и у тебя получится готовый make-файл на несколько сотен строчек, где уже всё учитывается и прописано. На практике всё так себе.
https://www.youtube.com/watch?v=QQZmDWnV618
Если ты теорию изучаешь, то читани у праты по указателям неплохо. В реальной работе нинужно, особенно в современных крестах
В смысле? Большинство библиотек, что я встречал, собираются так: mkdir build && cd build && cmake ..
Тот же vcpkg так делает.
Job Type: Full-time
Salary: $120,000.00 to $130,000.00 /year
Интересно, кого в конце-концов наймут на эту работу?
... я не часто объявления о работе читаю). Да и зарплата редко бывает, все хотят пропустить народ через 100 часов интервью, а потому предложить 100 штук, типа шестизначная зарплата, чувак и ты уже столько времени на нас потратил - соглашайся быстрее!
То, что они указали зарплату, говорит о том, что они думают что это много и выделяет их среди остальных.
> А чо, норм зарплата, для мидвеста )
Это ЛА ... и зависит от Мидуэста, в Чикаго на такую зарплату народ тоже не набежит.
https://kunaifusu.livejournal.com/648138.html
тест
Ни одной такой либы не видел, везде после этого нужно запускать make или msbuild.
Знакомые из джавы тупо на похуй приходят со знаниями Spring сразу на 120к без всяких исключений в списках инициализации и реализаций хеш таблицы на бумажке.
Когда я пробовал так делать, сработало только с msbuild, с mingw-make были странные ошибки. CMAKE_MAKE_PROGRAM указывал.
По стилистике уже понятно, что ты довольно истеричный парень, у тебя проблемы с логикой и восприятием этого мира. Ты типичный пидорахо-бизнесмен, который нихуя не понимает в бизнесе и нормальных отношениях "работодатель-работник". Думаю, программисты, которым ты писал, были того же мнения, поэтому им было похуй, сколько ты предложишь - работать с истеричкой никто не захочет. Мой совет- выкатись нахуй из айти. Продавай щебень, лес, уголь. Но не трогай айти - это явно не твоё.
>Пробовал я у gcc -L -l -I
Если указываешь нестандартный путь (например, в папке экзешки) к динамической SO-либе через -L, то экзешка не запустится. Там надо через переменную LD_LIBRARY_PATH указывать эти специальные пути, либо линкеру ld при сборке флагом -rpath.
Может быть ты пишешь \ вместо / ? Или у тебя пробелы в названиях папок. Пиши -I"C:/My Include Folder" если на винде.
Кроме того линкеру нужно название либы без префикса. Т.е. если либа называется libSDL2, то линковать надо -lSDL2
Какие есть варианты? Несколько лет назад он первым попался мне на глаза, с тех пор и юзаю, хоть он и глючный. inb4: браузер
Я просто раньше где-то уже это видел и подумал, что это где-то автоматически добавляется.
В кукло скрипте. Но, конечно, оно добавляется в ссылку на пост, поэтому будет оранжевым, а не черным.
Понятно, спасибо.
Вернее он типа есть но в другом, внутреннем классе _Tree_val. Я вообще не понимаю как эта хуйня устроена так как мне в страшном сне бы не приснилось туда руки сувать. Кто-нибудь знает как при помощи наебок и кастов или итераторов до _Myhead добраться?? Эта вся хуйня в <xtree>
Объявить такой же класс_2 но с паблик именами и через конструктор копирования обмануть
вообще последние годы я ++ брал только из-за того, что знаю более менее этот язык и можно было делать кроссплатформенное по, которое сразу и на линукс и на винду шлу и на некоторых одноплатниках.
Этож UB
Может есть для людей варианты? Чтоб не ебаться со сборщиком дольше чем пишешь код.
Я бы уж на MSBUILD даже залез, если бы эта хуйня выдавала рабочую статическую либу. Генерирую проект под студию, собираю и пиздец - MSBUILD не хочет это говно принимать, тоже высерает ошибки линковки и гадай что ему не нравится.
libastral какой версии?
Да. Делай отдельный класс.
столкнулся с ситуацией, где при использовании двух разных мьютексов в двух разных тредах (в связке c unique_lock и condition variable) у меня происходит дедлок. Используя при этом глобальный общий мьютекс, все шло как по маслу (оба метода принадлежали разным классам, если что). Вот и навеяло вопрос...
Как написать в одной dll функцию, которая будет грузить ресурсы из другой dll (или exe), с указанием ID этих самых ресурсов?
Основная проблема заключается в том, чтобы получить HINSTANCE одной dll из другой. Была идея сделать параметр по умолчанию, но, например, GetModuleHandle(0) возвращает HINSTANCE exe, а не вызывающей его dll.
Ну хз я бы лучше в контекст это какой-то обернул и снабжал бы им свои классы
Не так:
> 2020
> Легаси
Я бы и рад от всего этого говна избавиться, но имнип там одних строчек только около 20к
Ресурсы - отличная штука, без них приходится костыли изобретать
Когда не было RAII и прочего, можно было случайно проебать очистку ресурса, сделав return посреди функции. Поэтому некоторое время людей учили, что return должен быть только один, в самом конце.
О, так вот откуда это пошло. Слышал эту рекомендацию, но думал, что только ради читаемости.
мимо
Спасибо. Нашёл в комментариях что-то очень костыльное, попробую сегодня. Только не уверен, что тут вернётся HANDLE именно той DLL, которая вызывает эту функцию.
https://web.archive.org/web/20190213021845/https://www.codeguru.com/cpp/w-p/dll/tips/article.php/c3635/Tip-Detecting-a-HMODULEHINSTANCE-Handle-Within-the-Module-Youre-Running-In.htm
Это ещё херня, тут кто-то писал, что в libpng обработка ошибок вообще через setjmp().
Лесенки if-elsif-else - родовая травма всех алголоподобных языков без оператора return.
Но ведь push x; ret медленнее jmp. При return тебе надо в стек писать. Вызов процедуры - это вообще пиздос какой оверхэд по сравнению с простым переходом.
>Но ведь push x; ret медленнее jmp.
Гомпилятор сгенерирует тебе jmp из ветки if на тот же
эпилог функции, потому что возвращаться-то надо.
Кстати, сейчас clang/gcc умеют делают эпилог на месте каждого return, чтобы обойтись без перехода.
>При return тебе надо в стек писать.
В С не надо, результат возвращается на регистрах.
Проклятый интерфейс двача. Нажал не написав пост, и удалить-то его даже нельзя
>>761435
>Но ведь push x; ret медленнее jmp. При return тебе надо в стек писать
Тебе в любом случае где-то нужно будет сделать return. Ты либо его делаешь сейчас, либо делаешь джамп на return.
>Вызов процедуры - это вообще пиздос какой оверхэд по сравнению с простым переходом
Если листовые функции, то вообще нет. Да и в других случаях тоже, потому что сегодняшние соглашения о вызовах достаточно вменяемые в этом плане. ЕМНИП в какой-то статье из серии Lambda the Ultimate упоминался пиздец, который творился при вызове функций в древних компиляторах. Оттуда, наверное, и пошло, что вызов функции очень тяжёлая вещь.
> эпилог на месте каждого return
Что за шиза? У тебя всегда выход из функции через ret, в EIP из стека кладётся адрес возврата.
И то что у тебя в регистрах 4 аргумента ещё ничего хорошего не значит, их ещё компилятору надо туда запихать. fastcall от мягких успешно был обоссан и в 32-битном коде до сих пор stdcall или cdecl в либах. На x64 вынуждено перешли на аргументы в регистрах, т.к. только rax жрёт imm64.
>>761448
> соглашения о вызовах достаточно вменяемые в этом плане
У тебя в любом случае будет пролог, эпилог на мелких функциях компиляторы успешно режут. И call всё ещё медленнее jmp, хотя оба сосут. Если у тебя функция уровня пары арифметических операций, то оверхэд на вызов займет больше времени, чем выполнение полезного кода.
> Оттуда, наверное, и пошло, что вызов функции очень тяжёлая вещь.
Это пошло и продолжается от архитектуры х86, где переход в 5-25 раз медленнее других инструкций. Медленнее перехода только деление. Именно поэтому функциональщина всегда сосёт по производительности у Си-портянок. Так же как и кресты с ООПом сосут у голого Си.
> В рамках того что не экспортируется оптимизатор может спокойно делать всё что угодно, хоть лапшу из джампов, ХОТЬ ИНЛАЙНИТЬ?
Это скорее к GCC относится, это там компилятор делает что хочет. А у майков в этом плане всё более строго, надо явно указывать что делать можно, по дефолту он не станет наглеть. Но полностью функциональные кишки всё равно никто не вычищает.
>переход в 5-25 раз медленнее других инструкций
Посмотрел Агнера, по нему долгий только RETF (но мы ведь все в длинном режиме, так что он не нужен). Обычный RET (он же RETN) в процах 1-4 опсов занимает. Судя по https://blog.stuffedcow.net/2018/04/ras-microbenchmarks/ это действительно так.
> Обычный RET (он же RETN) в процах 1-4 опсов занимает
Ну д, выполнение инструкции. А теперь плюсуй запись в стек адреса, чтение адреса из стека, переход после записи по этому адресу. Вот и имеем 20-30 циклов если предсказание совпало, по твоей ссылке столько и есть, примерно. За это время даже пару раз поделить успеем. Или около 50 операций сложения сделать.
А если промахивается, то там пиздец за 100 циклов уходит.
>Что за шиза?
Просто погугли, что такое эпилог функции. Так вот, их в функции может быть несколько при наличии ветвлений.
>у тебя в регистрах 4 аргумента ещё ничего хорошего не значит
Я тоже считаю, что интел = кал.
Я, может, не то прочитал, но по ссылке указывается, что вся машинерия для call+return занимает в среднем 5 циклов (таблица 1, колонка CALL+RET). Не вижу, откуда ты взял 20-30.
>запись в стек адреса, чтение адреса из стека, переход после записи по этому адресу
Return Address Stack так и предназначен, чтобы не читать из стека который в памяти и удачно предсказывать направление перехода. А запись в стек адреса возврата в самой процедуре невидима, потому что не порождает зависимости по данным и последующие инструкции спокойно выполняются out-of-order.
> вся машинерия для call+return занимает в среднем 5 циклов
Внимательнее смотри что там меряют. Это бенчмарк в вакууме. Там только выполнение голых инструкций последовательно.
> удачно предсказывать направление перехода
Это только в таком абстрактном бенчмарке всё так просто. Миллион описаний есть как это работает в реальных условиях, почитай.
> последующие инструкции спокойно выполняются out-of-order
Чел, плиз. Открой в отладчике любую функцию и посмотри чем там занят проц на ближайшие инструкции. Нам запись тут вообще поебать. Важнее как быстро в больших процедурах его забирать обратно.
>Это пошло и продолжается от архитектуры х86
>Именно поэтому функциональщина всегда сосёт по производительности у Си-портянок.
Этому надо читать AIМ-443
пиздец ну и акцент у челов, не могли нормальных кого то найти чтоли
>Миллион описаний есть как это работает в реальных условиях, почитай.
Приведи одно-два описение с замерами тогда. Желательно на современном процессоре (хотя бы core 2). И всё-таки, откуда ты взял 20-30 циклов?
>Открой в отладчике любую функцию и посмотри чем там занят проц на ближайшие инструкции
Лолшто. Как ты мне предлагаешь внутренние (не архитектурные) регистры через отладчик посмотреть?
>Важнее как быстро в больших процедурах его забирать обратно.
Совсем нет. Как-нибудь потом загрузка со стека реально выполнится, процессор сверит с предсказанным, скажет "ок" и поедет дальше. Спекулятивное исполнение уже далеко впереди будет.
Не могу найти статью, вроде на хабре была, примерно про то, как в гипертрединге два потока выполнялось медленнее, чем один, потому что конвеерам требовался один и тот же модуль чипа и они начинали тротлить чтобы дождаться его освобождения.
>Вы не забывайте что то что у вас по цифиркам тактов выходит, не то же самое что будет в микрокоде самого процессора.
Надо просто в голове совместить циферки throughput/latency команд и знание микроархитектуры. Сразу будет неплохая оценка производительности. И это не 20-30 циклов. Это около 5 циклов на весь эпилог.
Никто не умеет понимать код буста. Дело не в умении и не в желании понимать код буста, и вообще ни в чём. Дело лишь в самом запихивании буста во все проекты подряд.
>>761885
Разве это не причина в будущем писать хуйню тяп-ляп? Правда я иногда просто не понимаю, зачем они на самых первых страницах показывают примерный как я понял код по идее встроенных функций, ну да ладно . В любом случае чтение такого кода как на пикриле для меня пытка и я синтаксически мало его понимаю.
Пчел, тебе не надо понимать, как написана библиотека, читая ее код - ты должен понимать библиотеку по документации и примерам. То, что ты пишешь хуйню тяп ляп и то, что ты не можешь читать код буста - это вещи никак не связанные.
У нас вон вообще правило, что буст тягать нельзя ни в один проект, и я, пожалуй, с этим правилом солидарен в текущий момент. Есть небольшие отдельные либы, которые вполне решают нужные проблемы, а не завозят буст. В случае, если бы я писал сетевое что-либо - я бы наверное пошел искать отдельную сетевую либу, а не тянул буст асио (без проблем переживу просадку в перфе кек)
> Пчел, тебе не надо понимать, как написана библиотека
Так это в доке написано. Хз чему тогда верить.
> В случае, если бы я писал сетевое что-либо - я бы наверное пошел искать отдельную сетевую либу, а не тянул буст асио (без проблем переживу просадку в перфе кек)
Ну мне посоветовали здесь взять boost beast, ну я и взял.
Ну конкретно на твоем скрине ничего такого нет, обычный код. Боюсь представить что будет если ты зайдешь посмотреть их заголовок с препроцессором
Поэтому я спрашивал что почитать
>Пчел, тебе не надо понимать, как написана библиотека
Не слушай этого слабоумного зумерка. Смотреть код популяреых библиотек, в том числе из стандартного набора, должен каждый уважающий себя программист, только так ты научишься писать грамотный код и делать всё по уму. Это отличная возможность быстро развиваться, а не приходить к этому самому сквозь ошибки через n лет. Можно сравнить с человеком, которого научили сложению, но ничего про умножение не рассказали, да когда то он поймет, что 2+2+2+2+2 можно выражать как 2×5, но дойдет ли он до возведения в степень? Дойдет ли он до умножения столбиком?
Учи принципы проектирования, ооп и солид. Главное не паниковать и не бояться перечитывать код по сто раз, до тех пор пока ней поймешь почему сделали именно так. После осознаеия приходит озарение и ты начинаешь не паниковать, а думать о том как всё хорошо устроено и логично, а также о том почему у тебя изначально понимание этого когда вызвало затруднение .
Ты, если с чем-то поспорить хочешь, то и отвечай нормально, а не гринтекстом пукай, не в б же сидим
> сренькбабах, в байтоебском языке следование нормам ООП бывает, мааам ну скажи это нифантастика.
>язык, единственная цель которого добавить ООП в сишечку
>сам труп страуса постоянно кичится тем, что на с++ можно писать хороший ооп код с зиро оверхед
>неостлятор-корзина с двача: нинужна яскозал, вот на си я всё одним полотном хуячид и на с++ такжи нужна!!!
Проиграл с дебила
> неостлятор-корзина с двача: нинужна яскозал, вот на си я всё одним полотном хуячид и на с++ такжи нужна!!!
Так ты как раз себя и своих корефанов-крестоблядей только что описал - в какой проект на гитхабе не зайди, везде си с крестами насрано.
Я такой код начал понимать лет через 10-15 знакомства с С++ (но я на нем и не работал практически).
хз, лично я не пишу вообще в процедурном стиле на крестах, зачем? Если я хочу упороться в процедурщину (или если хочу написать какой-нибудь драйвер на Линукс), то да, Сишка - лучший вариант.
А если плюсы - чистый ООП. ООП удобен тем, что используя эту парадигму, удобнее: а) Скейлить большие проекты, б) Представлять оверолл архитектуру кода. Плюсы позволяют писать чистый ООП (причем для особо требовательных программ можно схитрить и юзать статический полиморфизм, который не трогает vtables и не замедляет программу в рантайме), грех это не эксплуатировать.
Речь про то, что возможность пердолить в процедурном стиле, наследие в виде долгого переходного периода, когда десктопная байтоебля переползала с С на кресты и общий объем легаси-кода вызывает рак кресторазработки, когда с соблюдение бестпрактисов ООП нужно еще днем с огнем поискать, а сеньеры разносят рак со старых проектов в новые.
Использую кресты только для совместимости с ООП-говном. Как тебе такое?
Новые проекты все реже и реже пишутся на плюсах, я уж не говорю про Си, увы :( Клятый раст отбирает всю систем-левел кормушку. А все из-за ссаного левацкого маркетинга про коко-безопасность. Тьфу им в харю!
Вот и пердолят легаси со всеми вытекающими... Красивые кресты с бестпрактисами ты скорее увидишь в репах у любителей-энтузиастов, но никак не в кодовой базе, которая тянется еще с девяностых.
Долбоеб не знает разницу между популярными библиотеками и АДОВЫМ БУСТОМ. Буст - это антипаттерн на антипаттерне через пиздец внутри.
2 конченные конторы, которые занимаются блокчейном, отказали мне из-за того, что, видите ли, они решили с крестов на раст перейти. Ублюдки ссаные. Я во второй спросил: "И что, многие сейчас на раст переходят?". Они сказали: "В лоу лвле или там, где нужен перформанс, если проект пишется полностью с нуля, то да, Раст предпочтительнее крестов для многих компаний". У меня аж ком в горле встал. Обидно за кресты, хоть и продолжаю писать на нем свои пет-
проекты.
>Двухмерная игра "куб сьел квадрат" на SDL или SFML
Что-то подобное уже есть, только на pygame, на плюсах смотрю в сторону 3d на openGL, создать что-то вроде простого майнкрафта, но может есть поинтереснее идеи/инструменты(например не opengl а Vulkan)
Потому же, почему "Казнить нельзя помиловать" не парсится в русском.
> Vulkan
Это далеко не пет-проект будет. Это целый отдел сеньоров будет ебашить без выходных и сна пару лет.
Нахуй ты этот баян раскопал?
О каком первом разе ты говоришь, если, скажем, все инкременты и декременты выполнятся до вычисления выражения, и в обоих разах будет 7, например? А если вспомнить, что это UB, в результате хоть 100 будет, хоть сегфолт, хоть dwarf fortress запустится.
Мб тут сидят челы шарящие за qml, у меня есть stackview приложение, в хедере сделал label с названием текущей страницы, но проблема в том, что пользователь может пойти по такому пути (главная->настройки->темы) а потом возвращаться обратно, и вот чтобы написать сверху корректное название страницы, мне нужно знать какая именно сейчас страница, есть ли возможность это узнать?
Буст это как раз паттерн того как можно делать одновременно поддерживаемый и производительный код, как сам отец-создатель завещал.
Стыдно должно быть, когда такие вопросы задаешь. Ладно там макако-языки, которые с памятью не работают, но при работе с плюсами ты же должен понимать, что переменная i не продублируется в памяти и обращение всегда идет к одной области, далее достаточно знать приоритет операторов и всё становится ясно - увеличивантся i на 1, получаем i=6, увеличивается i на 1, получаем i=7, складывается значение i с значением i, т.е. 7+7, результат записывается в i
Толсто
>если сыч с двача не понял, значит никто не поймет
>буст поддерживают не при помощи людей, а при помози магии
Ты не можешь полагаться на значение переменной, если в том же выражении ты ее инкрементируешь. Результат зависит от уровня оптимизации и чего угодно еше.
Даже переполнение знакового инта - UB. Сложил два больших числа - и вот у тебя уже UB. Охуенный язык, правда?
Труп страуса.
> ((5 + 1) + 1)
Откуда второй инкремент? Плюсики перед переменной - инкремент до выполнения операции с ней. Как у тебя инкремент 5 даёт результат 7, шиз?
Вычисление не до операции, а до выражения шиз. Компилятор, полагаясь на то, что ты только один раз заинкрементишь, может поменять порядок вычисления. А ты его наебал, заинкресентил дважды, получил предсказуемое UB и жидко обосрался.
sequence points, довны
так а какой ответ?
Массив из 20 указателей на функцию, возвращающих указатель на int, и принимающих инт и массив из 10 указателей на константный указатель на константный указатель на чар
Зачем?
Zero overhead abstraction гугли. У нас на работе уже все драйвера на С++17 пишут.
И каково писать код в кернел-спейсе без STL? Понятно, что плюсы в лоу лвле дают жесткое преимущество в лице темплейтов, constexpr, ну и ООП, но все же...
И да, дрова же на винду пишите, я так понимаю? На Линукс писать дрова на плюсах - тот еще анальный секс.
Победитель.
Ты ваще деревянный нахуй ? Тебе ебать уже прямым текстом сказали, что ИТА НИ МАССИВ СУКА НИХУЯ ДОВН ТЫ ЕПТА ТУПОРЫЛЫЙ БЛЯ.
int
main()
{
char ☭const (☭ const ☭x)⟦10⟧ = 0;
int ☭(☭p)⟦20⟧ = arr(1, x);
return ☭((☭p)⟦0⟧);
}
> Компилятор, полагаясь на то, что ты только один раз заинкрементишь, может поменять порядок вычисления. А ты его наебал, заинкресентил дважды, получил предсказуемое UB и жидко обосрался.
Только если в твоих фантазиях. Мой компилятор работает как надо и видит что там написано. Ты, блять, не в карты с компилятором играешь, чтоб наебать его, вытащив из рукава инкремент.
Ладно-ладно, ты меня убедил, можешь запустить этот код и убедиться, что результат, как ты и говоришь, будет 13. Возьми пряник с полки.
А можно делать что-то типа
i = 0;
a[++i] = 666;
и ожидать, что в a[1] окажется 666? Или это зависит ко конпелятора?
да, в этом случае 666 запишется в a[1], здесь нет UB и не зависит от компилятора.
>>762646
>>762647
>>762650
>>762659
>>762677
Хули вы тут нанаркоманили, довны? Вам заняться больше нехуй, дебилы великовозрастные? Слово "стандарт" не слышали? Всем насрать на ваши пердольки в соснольке, тестовые запуски и дизасм, канают только цитаты из стандарта. Ибо компилятор сегодня так компилит, а завтра хуяк — и новая версия вышла, которая диск форматирует. И то, и другое будет допустимо по стандарту, т.е. правильно, ибо для вашего примера по нему BEHAVIOR IS UNDEFINED.
Когда кто-то говорит "UB", всегда подразумевается стандарт. Но тот анон и слышать ничего не хочет и пытается применить логику других языков к плюсам.
Так а нахуя ты тогда втираешь что-то этому долбоебу, если он тупой? Ему же сказали уже про sequence points.
Кстати, когда кто-то подразумевает стандарт, не приводя цитат и номеров параграфов, можно для простоты смело считать этого умника беспруфным петушком.
>А если у функции полсотни аргументов?
делай инициализацию в две ступени
Foo foo = Foo()
.Set()
.Set()
.Set()
.Set();
;-D
(реально так тоже делают)
да, оно и есть, прост забыл
Какой сходить невролог в пик вируса о чём ты?
std::endl вообще лучше не используй
Стандартные потоки говно.
Юзай fmt::print, к примеру -- https://github.com/fmtlib/fmt
вроде оно в стандарт должно скоро войти
>Стандартные потоки говно.
>Юзай fmt::print, к примеру -- https://github.com/fmtlib/fmt
>вроде оно в стандарт должно скоро войти
А можно просто printf
Если буст нашёлся, а автокомплит и прочее не работает, то это к Intellisense, гугли, хз чё за IDE у тебя.
Ещё проверь, что ты линканул нужные таргеты буста со своим таргетом с помощью target_link_libraries
Не нужны, тебе сказали, что ЛУЧШЕ использовать
3)))
Вообще я такой штукой не пользовался, только vcpkg. Проверь битность, попробуй просто boost написать, будет ли она находить что то.
И что? Стд вообще лучше не пользоваться. Там обычно нечто раздутое и пытающееся угодить всем но по чуть чуть. Этакий средний вариант. Узкоспециализированные либы всегда лучше. Это же касается всяких контейнеров, строк и т.д.
sequence points
Что не так, школьничек? Никто в здравом уме не будет использовать std::string для чего то сложнее laba2.cpp в текстовых редакторах нужны ropestring, в базах данных тоже свое.
А имена файлов в редакторах у тебя тоже роупстринги? А текст в менюшках, диалогах и прочем? А строки запросов в поиске и прочем? А в графических редакторах тоже роупы? Или графические — хуйня для школоты? А в играх? Короч хуйни-то не неси, дядь. То, что ты перечислил — узкие области.
Есть много других строк. Например в граф редакторе у меня компайл тайм хешируемые строки. std string так не умеет, она не constexpr
Проще потом будет перелезть на format из C++20 (там скобочки, а в бусте проценты)
https://cmake.org/cmake/help/latest/module/FindBoost.html
Тут примеры снизу. Учи симейк, очень пригодится
Ну есть foo и есть bar, а еще baz
Она же старая очень, не? 10 лет уже. Скажите что читать
Спасибо
Даже не просто спасибо. ОГРОМНОЕ СПАСИБО
А ты чего хотел, чтобы коммунити мгновенно это сделало? Жди года 3.
Ошибка
Перед первым словом.
Бамп
В двадцатых дофига больших фич, которые с 11 года варились: рейнджи, модули, корутины, космические корабли, а концепты и того раньше
Знаю, что слоу, но блядь, какого хера пихать объявление структуры в класс? Это же блядь неудобно, когда у тебя есть многоэтажная херня, тем более такая.
Под интересными подразумеваю разные алгоритмы, оптимизацию разную
Или большая часть - это дрочево Qt, winAPI, MFC и прочем байтоебстве?
Любая программа это набор алгоритмов и оптимизаций, дурик.
Ну деревья бабахаю я и так, просто интересно в каких местах нет дрочева каких-нибудь легаси технологий, под винду, да еще и за низкую зп?
Я сейчас в ДС нахожусь, из интересного видел только хуавей и яндекс. Еще смотрел на разработчиков софта для моделирования, сапры там разные, но работы уж сильно мало.
Ща никто свои велосипеды как я понял не пишет, ну разве для себя, остальное на готовом.
На гитхабе кто то выкладывал.
Ну да, наверное, но сколько лет его еще допиливать будут. У меня на компе не работает.
Сударь, вы не потеряли часом стыд требовать поддержку стандарта, который ещё не приняли?
Так-то в GCC 10 из крупных изменений только модулей не хватает, но серьёзно применять всё это дело лет через пять, дай бог через три можно будет без опаски.
Задали задачку, не смогла решить.
Есть функция на С++. Она принимает параметром указатель на функцию, принимающую параметром void☭ и возвращающую bool.И самая первая функция возвращает bool: true, если функция-параметр возвращает false при передаче ей параметром самой же себя. Вопрос: что вернет самая первая функция, если ей передать параметром саму себя?
Сказали что это неправильно
Потому что цель примера/туториала научить и показать как можно детальней, а не "удобней и быстрее".
Почему бы тебе не спросить это на парах у своего пердподавателя вместо того, чтобы засирать ламповый тредик на двощике? И почему бы тебе вместо того, чтобы считать себя самым умным и задавать "риторические" вопросы космического масштаба и космической же глупости, просто не взять бест практис на вооружение?
Если у тебя два одинаковых имени функции или класса, ты охуеешь.
Спасиб, я думал может разница какая есть.
>>763514
Я ничего не засираю. У какого преподавателя? Почему тут все думают если задаю вопросы по программированию то я учусь\работаю в этой сфере. Для меня это просто увлечение. И с чего ты взял что я считаю себя самым умным? Мне просто интересно было. Ёбнутый.
Он решил что это продолжение вчерашнего троллинга. Это рили слишком банальный вопрос.
Да там изначальное задание какая-то херня.
Вы стоите на самой низкой ступени развития, вы ещё только формирующееся, слабое в умственном отношении существо, все ваши поступки чисто звериные, и вы в присутствии анонов со знанием стандарта позволяете себе с развязностью совершенно невыносимой подавать какие-то советы космического масштаба и космической же глупости о том, как удобнее неймспейсы использовать. Вам нужно молчать и слушать, что вам говорят. Учиться и стараться стать хоть сколько-нибудь приемлемым членом социального общества.
Кстати, я смог написать (чисто ради интереса).
Естественно, без c-style cast там не обошлось.
Может быть, кто-нибудь придумает лучше.
bool f(void ☭vp) {
bool (☭ff)(void ☭) = (bool(☭)(void ☭))vp;
return !ff(vp);
}
int main() {
return f((void ☭)f);
}
шта?
g++ laba1.cpp -g -o laba1
g++ - надмножество компилятора gcc для компиляции плюсового кода.
laba1.cpp - твоя лаба на плюсах, которую ты хочешь скомпилить, студентик
-g - флаг, который добавляет символы отладки в бинарь, чтобы ты не отлаживал чистый асм в итоге
-o - флаг спецификации имени исполняемого файла
laba1 - имя исполняемого файла твоей лабы.
Запуск - ./laba1
Формат бинарных файлов в Линуксе - ELF (executable and linkable format), погугли его структуру, гораздо менее заебистая и костылированная, нежели у виндовых бинарей.
>Ну и почему сегфолт возникает, как вы думаете?
Компьютер видит, что на нем пытаются решить проблему останова.
> Формат бинарных файлов в Линуксе - ELF (executable and linkable format), погугли его структуру, гораздо менее заебистая и костылированная, нежели у виндовых бинарей.
Красноглазому дауну с комплексом неполноценности лишь бы на винду насрать
> менее заебистая и костылированная
Именно поэтому надо под каждый дистр собирать эту дрисню или тащить с собой столько зависимостей, что электрон позавидует? Действительно всё для людей.
> g++ - надмножество компилятора gcc для компиляции плюсового кода.
Нет, т.к. плюсы - это не надмножество сишки, а в лучшем случае надмножество некоторого её подмножества. Даже набор UB у них разный.
Тогда тем более.
LH!This post cannot be read in DOS mode.
Сделано для девелоперов, ибо винда для программиста - анальная боль и мучительные страдания, благо до майков дошло это.
Красноглазые дауны пилят полное дерьмо, которое еле еле забороли в пакетах под луниксом, а под винду оно просто дерьмо.
Спасибо микрософту.
Сделано через жопу, кстати. Гуй работает криво, systemd задизейблен, докер устанавливается с бубном, с case insensitive пиздец.
Была бы хоть рабочая альтернатива, хотя бы велосипед от MS. Но хуй.
Вообще, в WSL2 многое обещают переделать.
> "Дерьмо", которое крутится на 90% серверов в мире, на 100% роутеров, на 100% суперкомпьютеров, на всем IoT, Андроид (там Линуксовое LTS ядро и подрубленный SELinux), клауды, вся эмбедщина, вся робототехника, автономные машины, а также все вменяемые RTOS тоже на основе Линукса. Линукс - literally костяк почти всех компьютерных технологий в мире и костяк всего Интернета. Нет Линукса - нет Интернета.
> Винда, которая господствует только на десктоп сегменте благодаря агрессивному маркетингу и своевременному впариванию говна в хлебала потреблядей, проиграв во всех остальных сегментах рынка, жидко обосравшись в рейтузы, ибо они производят зондированное лагающее говно для типичных потреблядей с 1985 года.
Пиши еще, виндаун, ты забавный)
Что через жопу то? Точно такое же ядро запускается под гипервизором. https://github.com/microsoft/WSL2-Linux-Kernel
Ебать ты клоун, иди хоть глянь актуальные статы. IoT - 30% винда, Server Os - более 50% винда, Desktop - 90% винда. ~60% тырпрайза за бугром - винда. И это еще даже Windows X не вышла. Через годика два винда будет преобладать вообще везде. Легаси линукс не нужен.
Ядро-то работает, полноценные эльфы запускаются. Проблемы с сервисами в основном.
Дурачок не понимает, для чего нужна каждая операционная система, и искренне считает, что винда всем насильно засунута только благодаря маркетингу. Я в шоке.
Попиши код на роутере, полудурок. А я буду его писать в студии под виндой.
Visual studio code и под линупсом работает, дебс. А сама студия в дупу не нужна, да еще и со своим кривым мсбуилд.
щас бы текстовый редактор на электроне равнять с профессиональным инструментом разработки
Я же написал: >>763867
Для гуя надо отдельную прогу ставить, некоторые проги работают, некоторые срут в консоль и падают, ещё куча варнингов про непрааильную версию mesa. Чтобы починить, нужно хитро переименовывать либы в /usr.
Докер просто так не работает, нужно гуглить "как установить докер на всл" и читать огромные статьи, где пишется, что для установки ещё и докер десктоп нужен.
systemd как таковой есть, но через него ничего не сделать. Сервис не запустить, в автозапуск не добавить.
Ну а с case insensitive ничего не сделать, пока это работает поверх NTFS, а не в виртуалке.
Съеби, зелень.
>щас бы текстовый редактор на электроне равнять с текстовым редактором на сисярпе 20-летней выдержки
Поправил.
Сук, вспоминаю шестерку, летавшую на моем Celeron 300 и плачу в подушку.
Бамп
>Гуй
Нахуй он на серваке? Запускать фотожоп под вайном? У тебя уже есть охуенный виндовый гуй в самой же винде, хули тебе еще надо?
А ДЕ линуксовые один стыд, что планшетопараша гном, что убогая поебень в духе крысы или, боже упаси, лхде. КДЕ тока более-менее норм, но тоже не дотягивает.
>с case insensitive пиздец
Мак ни разу не видел? Кстати, макось - это, в отличие от прыщеоси, НАСТОЯЩИЙ юникс.
>>763881
>Винда, которая господствует только на десктоп сегменте благодаря агрессивному маркетингу
Ох лол. Пердольное чмо, которое даже блокнот под три системы или ардуино-хуитку под несколько плат никогда не поддерживало, судит о качестве огромных систем вроде винды. Почему же тогда винда до сих пор не сдохла, если она такая нехорошая, а линукс такой хороший? Я тебе как яблочник могу сказать, что во многих аспектах винда как минимум не хуже яблока, не говоря уже о прыщепарашках (хотя вендо-ноуты и вендо-моники то еще говно. насчет surface не знаю.)
> Нахуй он на серваке?
Какой нахуй сервер на винде? Это ты выше про 50% серверов писал? Можешь не отвечать.
> Мак ни разу не видел? Кстати, макось - это, в отличие от прыщеоси, НАСТОЯЩИЙ юникс.
Это все знают, при чём тут мак вообще? Речь именно про лялех, а не юникс как таковой.
Еще панчи будут?
У мака файловая система по умолчанию кейс инсенситив, прыщедаун.
>Какой нахуй сервер на винде?
Ты тупой, блять? Зачем нахуй линуксовый гуй под WSL? Попердольки без перезагрузки устраивать? WSL ради докера пилят в первую очередь, чтобы отказаться от виртуалочки.
>Какой нахуй сервер на винде?
Энтерпрайзный блядь. С Active Directory, Skype и прочими приблудами реального бизнеса, сидящего в офисах.
Скачай пиратский SDK для PS4,
Скачай UE4
Скачай Unity
Во всех трех студия - стандарт для разработки.
не хипстоблокноты с репопомойками плагинов от васянов, не высеры джетбрейнс, не делфи эмбракадеро
И это только геймдев.
> высеры джетбрейнс
Тащемта студия без решарпера - это как ворд без шрифтов или эксель без таблиц
>Вот нужно мне написать допустим сервер и как это?
Берешь какое-нибудь говно и читаешь:
https://habr.com/ru/post/217437/
> Visual Assist
Кал говна, который показывает ошибку ещё до того, как ты закончил писать выражение и потом ещё несколько секунд подсвечивает корректный код красным.
Ооо. Я тоже такой целью задался. Начал с ученья плюсов. Мне целых 5 книг посоветовали. Думаю сначала Липпмана прочесть, потом многопоточность на плюсах, и затем буст учить.
Если ты реально ничего не знаешь и хочешь глубинных познаний, то почитай про обычные блокирующие сокеты (connect,bind,recv,send), сделай с ними обычный сервак типа 1 тред = 1 соединение. Туториалов полно. Потом сделай с неблокирующими, используя селект/полл/IOCP с пулом тредов/форками и всеми пирогами. После этого всякие асио, libevent и другие библиотеки станут очевидными и можно перейти к их изучению. Какой-нибудь отдельной книги про всё это не знаю, хотя наверняка такая есть.
Там хотя бы не заставляют писать бойлерплейт для тамошнего аналога BigDecimal, при том что могли бы основной рабочий тип (для бабла) в примитивы языка добавить, со всеми операторами.
Чел, мне покс на язык, я про их IDE.
А если говорить про языки, то в контексте "высеры джетбрейнс" имеет смысл обсуждать вот это, а не жаву https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/java.math.-big-decimal/
Двачую. Они просто не видели как работает поддержка инфраструктуры в тысячи объектов и десятки тысяч ИТ-устройств. Когда не ты лично следишь за этим, а всякие подрядчики и хуй знает какие ещё дауны. Если нет гуя, то тебе либо сломают все нахуй, либо заебут вопросами.
>Копипастишь примеры из учебников
>Нихуя не работает, куча ошибок
Почему такая ерунда?
Ошибки распознавания текста?
Устаревшая версия чего либо?
Примеры подразумевают что объясняется только какой то один аспект, а все остальное надо дописать самому/взять из предыдущего?
двачую этого господина
да я в общих чертах писал примитивную хуйню один сервер один клиент, а вот как что-нибудь серьезное сделать, х.з.
хуйня, вакансий ~ нихуя нет
Pragma once или include guards.
Тебе надо что-нибудь почитать про то, как работает мозг, почему человек может думать и откуда берутся мысли, чтобы подумать, что мне, может быть, читать эти твои мануалы нахуй не нужно, а нужно мне просто взять и пользоваться?
Зачем гуглить, если есть яндекс? И решения я таки не нашёл, хотя искал. В решении типа "консольное приложение" проблема сохраняется.
По разному. Часто не переваривает заголовочники функции, иногда ругается на фигурную скобку и сидишь такой тупишь не знаешь что делать
Ну тогда я рекомендую закончить с программированием, раз мануалы читать тебе нахуй не нужно
Поставь нормальную IDE с плагинами и проблема скобочек исчезнет навсегда.
>одним полотном
Нет, надо 5-строчными методами, которые связаны глобальными переменнымиполями класса.
На каком языке кодишь?
Дядя Боб, уходи
Для начала надо понять, что инклюдить файл -- это то же самое, как если просто взять весь его текст, и вкопипастить в место инклюда.
Я кстати считаю это киллерфичей С++. Ведь можно так вставлять нагенерированные куски файлов. В других ЯП так не получится
Указывает на скобку но ему не нравится что чего-то не хватает перед ней или перед ней что-то не правильно.
Покажи сам код, придурок, тут нету экстрасексов.
И скинь заодно скрин кода в книге. Не копию текста, а именно скрин. Вдруг в самой книге хуйня (такое бывает), а не просто криво распозналось.
Чтобы найти дырку твоей мамаши среди жировых складок.
Лучше бы нормальную интроспекцию и std::embed завезли
По той же причине, почему можно использовать поля класса до их объявления. Компилятор сначала сканирует все имена в классе и затем только на втором проходе начинает обход по их определениям. А вне класса нельзя, потому что совместимость с сями.
> совместимость с сями
А как бы это помешало совместимости с сями? Код, который нельзя было в сях, теперь можно было бы в плюсах. Не запретить же что-то сишное, а только сделать предварительные объявления необязательными.
мимо
Все равно наврал: f()
Не понятно тогда, чего бы не позволить объявлять функции где угодно в файле.
Чтобы хоть какая-то совместимость была. Лишь бы не писать биндинги FFI.
Класс все равно нужно парсить целиком перед кодогенерацией, а файл--необязательно. Поэтому правильное поведение на уровне файла не стали делать.
У тебя оба варианта не будут работать как ты думаешь. Во втором варианте у тебя несоответствие типов.
тебе в обычном коде (не системщина сишная и не qt) - нахуй все это не нужно. Value семантики достаточно
В твоих примерах вообще никаких присваиваний нет, о чем ты? А перегрузки по типу возвращаемого значения нет.
Я не так выразился конечно, да. В смысле что происходит переопределение возвращаемого типа функции, и для указателей все почему то работает. Те ну это же разные типы A и B? Почему это все компилируется, а для A и B - уже нет?
Почитай про ковариантность
Через некоторое время привыкнешь.
Есть идеи какие системные процессы могут эту хуйню вызывать, мож в них заинжектиться?
Тебе надо раскурить как записывать тип для указателей на функцию.
Посмотри мой пример с годболта и сделай так же.
возвращаемый_тип(*)(типы_аргументов_через_запятую)
Спасибо
Не думаю, что это хорошая идея. Звучит чуть ли не как потенциальное UB, хотя не факт.
Вот тут пишут, что на некоторых архитектурах такое вообще не будет работать (наверное, намёк на гарвардскую, где код и данные нельзя смешивать), хотя там про сишку: https://stackoverflow.com/questions/36645660
Абсолютно верно. Такой синтаксис записи указателей на функцию. Можно немножко себе помочь, и сделать ченить в духе
using sig = int(⚝)(int, int);
auto func = reinterpret_cast<sig>(pointer);
Почему я не могу написать это так? Это высосанное из пальца ограничение языка с невозможность агрегировать конструктор, или есть реальная причина, почему мне нужно отказаться от подобного синтаксического сахара и указать имя анонимной структуры?
Спасибо большое. Правильно ли я думаю, что такая хуйня могла использоваться для передачи управления в вредоносный код. Да и сейчас по идее можно так сделать, но нужно заранее в бинарник в часть с кодом записать нужный код
Learncpp лучше а не сиди тут
Например? Я под проблемами подразумеваю конфликты. У меня задача стоит сделать два таких параллельных процесса, которые создаются родительским процессом.
Ты обязан проинициализировать значение Union
При открытии файла во втором процессе скорее всего будет ошибка доступа. Я так понимаю, тебе нужно подождать, пока кто-то пишет/читает?
Для тебя уже всё придумали:
boost::interprocess::file_lock
QLockFile
Не будет ошибки, если не запрещать доступ к файлу при открытии. Можно даже одновременно в один файл писать, главное не закрывать к нему доступ со стороны других процессов.
> Можно даже одновременно в один файл писать
А зачем? думаю, это как-то связано с потоками в ФС?
Можно Машку за ляжку, а у нас итт — разрешите
> Как?
std::string str((std::istreambuf_iterator<char>(std::ifstream t("file.txt"))), std::istreambuf_iterator<char>());
комбинация снейк кейса, двойных двоеточий, круглых и угловых скобок это наверное самое мерзкое что можно было придумать
Использование имени типа не допускается.
Самое мерзкое - это форматирование разрывом строки и отступами.
Я уже сам нашёл.
[Перекат]
>>1765587 (OP) >>1765587 (OP) >>1765587 (OP) >>1765587 >>1765587 >>1765587 >>1765587 >>1765587 >>1765587 >>1765587 >>1765587
>>1765587 (OP) >>1765587 >>1765587 >>1765587 >>1765587 (OP) >>1765587 >>1765587 >>1765587 >>1765587 (OP) >>1765587 >>1765587
>>1765587 (OP) >>1765587 >>1765587 >>1765587 (OP) >>1765587 (OP) >>1765587 (OP) >>1765587 >>1765587 (OP) >>1765587 (OP) >>1765587 (OP) >>1765587
>>1765587 (OP) >>1765587 >>1765587 >>1765587 >>1765587 (OP) >>1765587 >>1765587 >>1765587 >>1765587 (OP) >>1765587 >>1765587
>>1765587 (OP) >>1765587 (OP) >>1765587 >>1765587 >>1765587 >>1765587 >>1765587 >>1765587 >>1765587 >>1765587 >>1765587
> int&r?
Можно изменять значение того, на что указывает r.
> const int &r
Нельзя, но зато можно присвоить временный объект.
Спасибо
На кой хуй тебе весь BOOST, все равно не выучить, да и смысла не несет. Все что тебе нужно, это когда тебе будут давать задачу, ты будешь понимать что средства для её решения должны быть в boost, не более.
Я пока просто открыл доку beast. Понял, что знаний не хватает. Выстроил вот такой план >>764174
Ну я вроде хоть что то по плюсам знал, поэтому липпман пока не сложно идет. 400 страниц за 1.5 дня. Хотя потом наверное тяжелее будет. Но мне кажется что многопоточность из этого всего самая сложная, хотя хз.
Я же говорю, с плюсами до этого кое как был знаком. Что то пролистывал, просто глазами сканируя, чтобы нового не пропустить. Где надо, я читал вдумчиво.
Кстати там ошибочка вышла. В программе, в которой я читаю, в книге 2000 страниц, вместо 1200. Поэтому мои 400 это 200 нормальных
Почему? Ладно, if там точно не нужен, но вот присваивание nullptr после удаления очень даже нужно. Я лично с таким сталкивался в таком виде
delete ptr;
...// много кода
delete ptr; // critial error - попытка удалить чужую память
Собственно вот что происходит если вызвать второй раз delete
это double free пчел
В некоторых ситуациях можно исполнить произвольный код в программе, где есть подобный баг.
Это прям классический говноС++, от которого все плачут. Используй контейнеры и умные указатели.
Как?
Ну typedef в рашке-парашке же запрещен.
Зависит от реализации аллокатора памяти в куче, на это нет однозначного ответа. Ну и митигации вставляют палки в колеса.
Но общий примитив таков: двойное освобождение памяти при определенных обстоятельствах дает возможность получить указатель на ранее выделенный кусок памяти при последующих аллокациях.
Результат - у тебя есть 2 указателя (А и В), которые указывают на один и тот же адрес. Допустим, ты контролируешь указатель В и можешь писать по этому адресу произвольные данные. В самом плохом случае, указатель А, который ты контролируешь через указатель В, используется как указатель на функцию в программе. При перезаписи указателя на функцию ты можешь перенаправить поток исполнения в произвольный исполняемый участок памяти, когда атакуемая программа вызовет функцию по этому модифицированному указателю. Если этот участок памяти указывает на твою заранее подготовленную полезную нагрузку в виде, например, ROP чейна, то происходит произвольное исполнение кода (программа вместо того, чтобы вызвать функцию foo по указателю, прыгает в адрес, контролируемый взломщиком).
При возможности удаленно послать полезную нагрузку в программу можно открыть удаленный шелл и вуаля - ты внутри другой системы.
Но эксплуатация double free очень сильно зависит от аллокатора, которым пользуется программа (и даже от его версии порой), и считается одним из самых сложных багов для эксплуатации.
> Результат - у тебя есть 2 указателя (А и В), которые указывают на один и тот же адрес. Допустим, ты контролируешь указатель В и можешь писать по этому адресу произвольные данные. В самом плохом случае, указатель А, который ты контролируешь через указатель В, используется как указатель на функцию в программе. При перезаписи указателя на функцию ты можешь перенаправить поток исполнения в произвольный исполняемый участок памяти, когда атакуемая программа вызовет функцию по этому модифицированному указателю. Если этот участок памяти указывает на твою заранее подготовленную полезную нагрузку в виде, например, ROP чейна, то происходит произвольное исполнение кода (программа вместо того, чтобы вызвать функцию foo по указателю, прыгает в адрес, контролируемый взломщиком).
Всмыслке? Функции же помечены как исполняемый код. Туда же писать нельзя. Или я что то не понимаю
В примере привелся случай, когда в куче есть объект/структура, в которой есть указатель на функцию (что не такая уж и редкость, особенно в крупных программах на С++). В кучу можно писать и оттуда можно читать. В таком случае, в куче может храниться адрес на функцию, который можно переписать, если есть соответствующий баг, который позволяет это провернуть.
Если ты можешь перехватить поток исполнения программы и направить ее в произвольный адрес - это уже минимум пол-победы.
В большинстве ОС по дефолту есть ASLR (рандомизация адресного пространства), но этот механизм можно обойти, если в программе есть баг на произвольное чтение (можно спиздить адрес из кучи/стэка/код сегмента, когда как, все очень зависит от ситуации). В тот момент, когда ты можешь писать данные в произвольные участки памяти и знаешь куда прыгать - можно надежно исполнить произвольный код в 98% случаев.
Так как стэк/куча давно неисполняемы, используются code reuse атаки, именно поэтому я упомянул про ROP chain, а не про тот же шеллкод (хотя в 2к20 и его можно исполнить, но нужно знать OS internals (подсказка для линуксоидов - mprotect syscall, дальше сами думаете)).
В тредах уже обсуждался курс от Яндекса практикума?
Хочу после фронта стать нормальным человеком
Но заточен он под 86 архитектуру, ну и собсно не понял я: а где эта зависимость? Может кто носом тыкнуть? было естественно предположить что где-то ассемблер спрятан, но чет не нашел. Мож либа какая х86 онли?
Или либо в 18 плюсовой, либо в сишнный
У них там требования - поддержка AVX2
По codeblocks подскажите: если мне надо приложению создать GUI то надо ставить wxWidgets ?
Если не хочешь писать на голом WinAPI, ставь wxWidgets. Например по инструкции отсюда:
https://jenyay.net/Programming/Wx
Если поставить SHARED=0, то wxWidgets будет компилироваться в exe-шник, и тогда не надо, как в Qt, таскать dll-ки.
И да - на CodeBlocks+wxWidgets релизы получаются намного меньше по размеру.
Cockblocks дерьмо, wxwidgets дерьмо, отличные советы
Это копия, сохраненная 5 февраля 2021 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.