Это копия, сохраненная 28 апреля 2021 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
⚹ https://github.com/sosachbot/cppthreadhat/wiki
Ответы на вопросы:
⚹ https://en.cppreference.com/w/
⚹ https://www.cplusplus.com/reference/
Для указателей: ⚹
Прошлый: >>1860500 (OP)
Zig лучше чем С
Не всем дано совладать с силой
Единственный нормальный язык.
Когда-то думал, что все начинают изучать кодинг с C/C++, а затем открыл для себя двач.хк/пр и увидел вопросы "а почему функция print() в питоне такая сложная, помогите(((".
> что все начинают изучать кодинг с C/C++
У меня в школе паскаль была, но в унике сразу с плюсов начали.
Почему бы просто не написать delete _p?
std::span, заебался таскать велосипед
designated initializers наконец-то в стандарте
template parameter list для лямбд вместо ебли с using T = std::decay_t<decltype(zalupa)>
Кнут писал с пруфами, что в некоторых задачах goto является оптимальным. Александреску не авторитет тащемта.
>std::span, заебался таскать велосипед
Удваиваю. Тоже таскаю с собой шаблонный велосипед а-ля array_view.
std::format офк. Как блять в здравом уме вообще могла придти идея использования стримов которые мало того, что писать не удобно так еще и по производительности проигрывают сишным printf.
Мое любимое это strstr()
В плюсах почти все проигрывает Сишке по производительности. Без углубления в дебри, Сишный компиль банально генерит меньше машинного кода, ибо сам язык гораздо проще и примитивнее плюсов.
>>871651
Пчеликс, это очень сложный вопрос.
Под эксепшены должна быть заточена вся архитектура модуля\софтины. В последнее время я вот стараюсь их использовать и рекомендую всем использовать в учебных\самопальных проектах.
Но если у тебя в проде уже есть положняк уровня "никаких эксепшенов", как, допустим, в том же гугле - то увы.
так не надо пихать эксепшены в hot лупы. А во всем остальном их можно использовать.
> А во всем остальном их можно использовать.
А потом код работает медленнее джавы. Пиши сразу на питоне, хули.
да кто тебе это сказал? Щас во всех компиляторах почти Zero Cost эксепшены, когда они не кидаются. Причем этот оверхед отсуствует только если у тебя эксепшены полностью отключены, либо каждая функция помечена как на ноэксепт.
Сам процесс КИДАНИЯ\ЛОВЛИ конечно медленнее, но другое дело, что исключение - это именно исключение, и кидаться должны очень редко. Это серьезных холиварный вопрос про архитектуру приложения, а вот срач за перф тут - правда хуйня.
Звучит как оправдание говнокода, который подпирают эксепшенами как костылями чтоб игнорить ошибки.
> кидаться должны очень редко
Никому они не должны ничего. И в любой либе ты можешь получить тонну этого говна за воротник.
Примерно всегда. Во-первых, они пиздецки усложняют флоу кода, во-вторых, чаще всего просто весь кидающий эксепшены код заворачивают в трай-кетч, и ложат хуй пока работает (а потом кто-то, возможно и ты, будешь ебстись, разгребая стектрейсы и логи, чтобы узнать что кто-то просто хуй клал), в-третьих — они тормозят.
Короче, ошибки-значения лучше во всём, но в плюсы ADT не завезли, поэтому чтобы таким заниматься придётся писать кучу бройлерплейта, так что увы и ах.
>Звучит как оправдание говнокода
Пчел, то есть, когда все вокруг
— сидят на всякой нагенеренной мышкой xml-like залупе для проектов/интерфейса/итд которую невозможно не замерджить ни поправить без ебли;
— юзают жирные форматы для передачи данных когда есть куча готовых бинарных форматов (которые зачастую даже удобнее если платформы больше 1-й);
— юзают говно мамонта когда уже есть сотня альтернатив, причём половина проверена в бою;
— согласны с политической ситуацией кекус;
— итд.
тебя такие костыли не смущают, а эксепшены — прям пиздец? Это типичная хуйня для сокрытия проблемы, поэтому и используется.
>они тормозят
Экспешены по-моему тормозят только если сотая вложенная функция кидает исключение и стэк анвайндится на много кадров назад, чтобы попасть в подходящий кеч. Условно говоря (хоть и ситуация оторвана от реальности), если throw и catch находятся в одном и том же стэковом кадре, то рантайм замедления вообще почти не будет (ибо в таком случае не раскручивается стэк).
Гугл запрещает своим плюсокодерам юзать эксепшены, но в гугле плюсы только в адовом хуйлоуде (и в хроме), поэтому там это оправдано. Но везде ли надо высасывать максмум производительности, кладя хуй на читаемость и поддеживаемость кода?
Гугл запрещает использовать эксепшены, потому-что у них говноеды, которые не умеют в RAII во всем адовом легаси.
Как я уже упоминал, в hot loop'ах само собой это все не используется.
Вот этого поддвачну. Стоит просто отделить код, который должен работать быстро, и код, в котором могут возникать исключительные ситуации. Первый проектировать как работающий всегда корректно и полностью обмазать noexcept-ом и ассертами упало? давай корректные данные или иди нахуй, из второго аккуратно подливать/забирать данные для первого, всякую валидацию делать тут же.
Если тебя потом попросят портировать твою либу на микроконтроллеры то будет неприятно переделывать.
а если софт чисто юзерспейсный и не предполагается портирование на слабые железки?
>Но везде ли надо высасывать максмум производительности, кладя хуй на читаемость и поддеживаемость кода?
>>871682
>Во-первых, они пиздецки усложняют флоу кода, во-вторых, чаще всего просто весь кидающий эксепшены код заворачивают в трай-кетч, и ложат хуй пока работает (а потом кто-то, возможно и ты, будешь ебстись, разгребая стектрейсы и логи, чтобы узнать что кто-то просто хуй клал)
ТРЕД НЕ ЧИТАЙ @ СРАЗУ ОТВЕЧАЙ
Ну ты-то можешь не писать, я просто объяснил, что это такая же конъюнктура как и в других областях как программирования так и жизни в целом — такое говно существует и ты будешь его есть потому что диды ели.
Ну тогда можешь начать писать бройлерплейт из обвязок ко всему остальному миру, не юзающему исключения (и в большинстве случае плюсы вообще, лол), а потом такие же только уже для связи твоего софта с внешним миром (и прокидывать коды из эксепшенов, кекс).
>а дрочить ошибочки как в чистой Сишке?
Нигде.
expected / optional / result
exceptions are for exceptional situations
(or self contained situations)
(or intentional multilayer error propagation)
Ну бойся
Исключения можно юзать только с повсеместным юзанием смартпоинтеров/деструкторов.
Ты не представляешь, какое дерьмо шлепает средний говноед из НИИ и\или вчерашний студентик
Нормальная обработка ошибок спасёт от утечки памяти при краше. А с эксепшенами только два раза один код напишешь.
Это только если оборачивать 100500 строк в один try.
Что такое "краш потока"? Если в потоке выброшено исключение, то все деструкторы вызовутся, если в потоке будет сегфолт или повреждение памяти, то все, приехали, тут уже ничего не поможет.
Динамическая типизация код делает некрасивым
Рефлексия зло. Понаклепали сисярповых либ на рефлексии, а потом их на любую платформу с ahead-of-time компиляцией не заюзать (например на айфоны)
Так нужна статическая рефлексия. Что мешает компилятору сгенерировать таблицу полей класса с их названиями и смещениями?
Можно только через макросы, но там пиздец костыли приходится юзать. Вот сейчас я использую самописную хуйню через макросы. Для моих структур она работает, но если нужно сериализовать структуру из библиотеки какой-нибудь, то все соси хуй. Нужна поддержка именно на уровне языка.
А я делал конвертацию из тюпла в структуру и обратно
Как там в 2018? Про .NET Native что-нибудь слышно? Вроде в 2019 должны придумать.
Вот бы ещё decltype и typeid могли дать реальный тип...
>Что мешает компилятору сгенерировать таблицу полей класса с их названиями и смещениями?
Слоупоки из комитета
без исключений в языке не обойтись
тк конструкторы и перегруженые операторы не имеют другого способа вернуть ошибку
об этом рассказывал страуструп в "дизайне и эволюции" еще 30 лет назад
по похожей причине, кстати, и появилась перегрузка - так как требовалось конструировать объекты классов разными способами, значит нужно несколько конструкторов, значит нужна перегрузка, значит нужен общий механизм перегрузки, а значит нужно запиливать перегрузку и функций-членов и свободных функций
когда страуструп делал первоначальный дизайн языка он исходил из логики что для решения частной проблемы нужен общий механизм, иначе это будет "костыль"
> иначе это будет "костыль"
Так это и есть костыль. Если у тебя в конструкторе кидается исключение, то деструктор не вызывается и ты сосёшь немытый хуй. Сами конструкторы говнище. А у нормальных пацанов ошибки через Optional работают.
Не знаю, не слышал. Полистал, там есть ограничения, что логично.
>Если у тебя в конструкторе кидается исключение, то деструктор не вызывается и ты сосёшь немытый хуй
Вызовутся деструкторы для всех инициализированных на момент выброса членов класса.
>что для решения частной проблемы нужен общий механизм
Это главная ошибка в софтверной разработке чего либо. Убивал бы нахуй. Если null был ошибкой на миллиард долларов, то вот эта ебучая овердженерализация всего на свете - это ошибка на все деньги ёбаного мирового банка.
Имхо в данном конкретном случае это не плохо, иначе ты бы охуел от количества фич, которые существуют только чтобы использоваться в единственном месте.
В чем вообще доёбка? Типа надо было сделать что перегрузка есть - но только для конструкторов, исключения кидать можно - но только из операторов?
На то время альтернативой было: errno; возвращать через ссылочный параметр; возвращать в результате 0 или true. Так что да, общий механизм это охуенно. А то что не распознали его недостатки, так это как доебываться почему сразу не изобрели какую нибудь Джаву еще в 50-х - тут только на опыте можно узнать.
>Если у тебя в конструкторе кидается исключение, то деструктор не вызывается и ты сосёшь немытый хуй.
как правильно обрабатывать исключения в конструкторах, написано в каждом учебнике по с++..
к примеру, 10е правило в книжке майерса "эффективное использование с++, 35 новых способов.."
или в книжке саттера "сложные задачи на с++", задача 2.13..
не соглашусь, в контексте дизайна языка как раз следует использовать одно из главных правил проектирования инженерных систем - если есть частная проблема, то для хорошего решения возможно потребуется общее решение
>тк конструкторы и перегруженые операторы не имеют другого способа вернуть ошибку
Очень обидно кстати.
Писал несколько либ с перегруженными операторами, которые потом работали в ядре и не только, приходилось стараться, ведь -fno-exceptions
Ждём, когда джаву в тырпрайзе вытеснит сярп или пщ, и тогда коболами будут называть уже их, лiл.
[Project]
FileName=KF.h
Name=KF_Project
Type=1
Ver=2
ObjFiles=
...
Ууу, ну всё тебе пизда. Если прямо сейчас выдернешь комп из розетки, может ещё отделаешься заменой диска. А лучше беги от него на безопасное расстояние.
Бля, я конечно всякой херни в жизни насмотрелся, но такую жесть первый раз вижу..
C пекарней все норм. Только h файл придется переписывать (((((
Помню писал я как то утилиту конвертирующую файл в другой формат. Ну и по запарке указал целевым файлом имя исходника.
Вставай в очередь.
Кобол ещё куда ни шло, настоящая джава - это PL/I от айбиэм.
Блоу, сука, зарелизни что-нибудь уже.
Когда уже запилят компилятор с ИИ-оптимизатором машинного кода? Чтоб наконец смогли писать как на питоне, а ИИ генерировал оптимизированный код.
Читаю про процесс компиляции в C++ и не могу понять.
Допустим, у меня есть laba1.cpp:
#include <iostream>
int main()
{
std::cout << "Hello world" << std::endl;
return 0;
}
Сколько объектных файлов получится из этого файла после препроцессинга, компиляции и ассемблирования? Один? Тогда нахуй нужен линковщик?
а как вернуть ссылку через std::optional?
>у нормальных пацанов ошибки через Optional работают
И как потом обрабатывать ошибку которая произошла? Например в винапи там хуева туча разных кодов. По идее нужно что-то типо optional только вместо bool флага (есть значение или нет) нужно хранить код ошибки.
Скорее всего, нужно что-то вроде https://github.com/TartanLlama/expected
Только вот непонятно, когда оно будет в стандарте.
>ИИ
Ты что из этих? Ну, из любителей решать алгоритмически неразрешимые задачи статистическими методами?
Так всякие наркоманы обдолбятся сойлента и пилят ИИ для написания кода из естественных языков, но почему-то не делают более очевидную вещь - высокоуровневый код в ассемблер.
Получается один обьектник, который линковщик слинкует в exe\elf файл.
Откуда нули? Вернее это-то я понимаю, откуда они берутся после того как я весь вектор переписал?
Я имел в виду, нахуй он нужен в этом конкретном случае, то есть отличается ли итоговый исполняемый файл от объектного файла.
Конечно отличается, лол.
Зависит от компилятора.
Теоретически, препроцессор создаёт новый файл после препроцессинга, компилятор делает из него файл с кодом на языке ассемблера, ассемблер создаст из него объектный файл, а линкер сделает из объектного файла бинарник. Но в разных компиляторах это всё может быть объединено в одну стадию так, что на вход у тебя исходник, а на выходе сразу бинарник.
Как сделано конкретно в G++ - хуй знает. Возможно, он реально создаёт каждый раз новый файл, но ты их не видишь, потому что они в какой-нибудь папке temp.
Прокидыванием ошибок, как в Go и сишке. И кучей if (result != SUCCESS) { ... }
Хочешь сказать, что одна маленькая goto с комментарием для ясности или специальная конструкция throw try catch хуже нагроможденного вездесущего if? И как ты планирешь с его помощью впринципе разделять ошибку и обработку ошибки?
Даже так лучше, чем ебучий забор из скобок посреди кода. Лучше функцию в if оборачивать, чем разрывать код. Это же настоящий goto, прыгающий по коду к catch.
А твоё, аватарфаг?
try { func(88888, 993) }; catch(int) {...}
вместо
func(88888, 993);
сильно напрягает? И throw try catch всего-навсего прыгает при ошибке в определенное место , так что это не ухудшает читаемости.
Спасибо.
ну, примеры того, как проектировать подобные вещи есть в стандартной библиотеке
оператор квадратных скобок генерирует исключение, но есть функция at которая возвращает ошибку при выходе из диапазона
оператор new имеет перегрузку с флагом nothrow_t..
при проектировании своих классов можно поступить примерно так же
ткак сделано во втором случае можно сделать и с конструкторами, те предусмотреть два способа конструирования класса - с генерацией исключения в конструкторах в случае неудачи, либо с вариантом двухэтапной инициализации (с функцией init или с флагом sucsess, на выбор)
те можно сделать универсальное решение при желании, достоинство с++ в том что он предлагает средства на уровне языка для того и для другого
Причём немного ебли только при ловле, сам проброс охуенно удобен. Точно лучше, чем перегружать сигнатуры функций возвратом ошибок, которые никто потом не проверяет.
с другой стороны, конструирование объектов классов прямыми вызовами конструкторов это прошлый век, ибо давно уже придуманы разнообразные фабрики классов, паттернов создания штук пять навскидку любой кодер на с++ вспомнит, причем с реализацией как в динамике, так и на статике..
причем они включают в себя и то что нужно делать в случае неудачи создания объекта..
Надо как в Zig хотя бы делать:
const number = parseU64(str, 10) catch |err| pizda(err);
Или аналог крестов:
if (parseU64(str, 10)) |number| {
doSomethingWithNumber(number);
} else |err| switch (err) {
error.Overflow => { ... },
error.InvalidChar => unreachable,
}
Для человеческого освобождения памяти при ошибке:
const foo = try tryToAllocateFoo();
errdefer deallocateFoo(foo);
> прыгает при ошибке в определенное место
Так и goto в определённое место прыгает. Ещё как ухудшает, когда у тебя внутри функции скачет куда-то.
>оператор new имеет перегрузку с флагом nothrow_t..
Это-то да, а вот из T& operator+=(const T& rhs); ошибку возвращать некуда. Кроме эксепшена.
Да и для new пришлось свой nothrow tag делать, так как stdlib не было.
Особенно кекнул с #if STDLIB #include <new> else define your own placement new
в книжке gof, к примеру, это третья глава "порождающие паттерны"
а у александеску аж три главы отведено на то как сделать подобное, но на статике
>T& operator+=(const T& rhs);
пишется рядом дублирующая функция-аккумулятор и все
не так красиво будет, но альтернатива есть альтернатива
для операторов кстати есть еще третий способ сигнализировать об ошибке - а именно все тот же флаг sucsess, который выставляется в удачу или неудачу при ошибке
Не понимаю чё там сверху, но объективно, в отличии от goto всегда понятно откуда (из соседней функции) и куда (в соседний catch) передается ход программы, ясно почему (ошибка) ясно что делать (в catch), ясно какая ошибка (выбирается определенный catch) и после работы с ошибкой, программа продолжает идти с логичного места как и должна была, будь всё хорошо.
> откуда
> почему
А если ошибка прилетает из глубины? Возвращаемое значение обязывает сразу обработать ошибку, а catch может из глубины кишок поймать говно.
Допустим у нас есть Много функций вложенных друг в друга, у каждой из них есть throw, и соответственно вызываем мы каждую функцию подобным образом:
try { func(88888, 993) }; catch(int) {...}
Тогда говёна с глубин не придут, а выйдя из своей функции с throw сразу попадут в try и catch соответсвенно, где можно написать какая функция ошиблась и как то обработать ошибку. Если нужно подняться на определенный уровень, например на самый высокий к вызову, для ошибки достаточно написать уникальный вызов хз как называется и тогда она развернет всё до самого верха и активирует нужны catch где всё будет понятно.
В реальности такого не будет, у тебя будет портянка кода по который ты будешь скроллить вверх вниз пытаясь найти к какому же траю относится катч.
> мы каждую
Ключевое во всём этом. Это должен кодер гарантировать, но ты никогда не узнаешь наверняка что там, не прочитав исходник или стэктрейс. Речь была про читаемость и вот где вся проблема. Ты предлагаешь верить в то что оно как надо сделано, звучит как полная хуйня. Опять же, возвращаясь в Zig, там язык гарантирует что подобной хуйни не будет и выполнение кода не уйдёт хуй знает куда, хуй знает откуда - ты делаешь обработку ошибки сразу и явно передаёшь её куда надо.
Чё??? Если нельзя узнать что в функции, то можно организовать проверку в вызывающем коде. Про zig я вообще не понимаю причём он тут и я с ним вообще не знаком.
> можно организовать проверку в вызывающем коде
Предлагаешь писать проверки просто чтоб наверняка? Оборачивать всё этими кишками как в сишарпе, просто для уверенности? Надо на этапе написания кода знать что не будет эксепшенов из глубины функции. А то этот goto может вообще из зависимости либы прыгнуть в мой код, а я как должен узнать заранее что такое может произойти? Я ведь надеюсь что эксепшен прилетит из вызываемой функции, а по факту это просто вангования.
Так в том и суть, что он локальный, а не глобальный. Один из основных принципов там.
Линковщик ещё добавит c и c++ runtime (твой main отнюдь не точка входа, посмотри стектрейс) , импортные либы из sdk, сгенерит pdb
Дак язык сам по себе простой. Хули тут учить?
>BOOST_HANA_DEFINE_STRUCT не поддерживает инициализацию сразу же в объявлении поля.
>Boost.PFR ну а это вообще хуйня, можно пройтись только по значениям полей, а имена полей оно не определяет (т.е. в json ты не конвертируешь с этим).
Я тебе говорю не про хелло ворлды, а про реальный код.
Джаву в интрыпрайзе, уже успешно убивает сам её разработчик - оракел.
Причем в прямом смысле, сначала убил Java EE, сейчас вот собирается и рантайм добить.
А что взамен предлагает хоть? Опенсорс-параши?
Что за магия на пике? Перегрузка оператора является дружественной функцией шаблонному классу? Зачем std::move заворачивать в return?
Ну так это и есть единственно верный путь.
В плюсах такое же пилят к 2029 насколько я слышал.
>дружественной функцией шаблонному классу?
Это чтобы перегруженный оператор видел внутренние поля объекта.
>std::move заворачивать в return?
Ты, наверное, хотел сказать return заворачивать в std::move?
Затем, чтобы временно созданный объект не гоняли туда-сюда, а оптимизатор сразу записал результат в исходный объект.
>Перегрузка оператора является дружественной функцией шаблонному классу?
Hidden friend idiom. tl;dr нужна, чтобы не засорялось пространство имён.
>Зачем std::move заворачивать в return?
Хз, по идее это только мешает NRVO.
> Затем, чтобы временно созданный объект не гоняли туда-сюда, а оптимизатор сразу записал результат в исходный объект.
Хотели как лучше, отстрелили себе ногу по самое ебало. В c++17 такая хуйня гарантирует отсутствие copy elision, следовательно можно сделать вывод, что автор книги - долбаёб.
Тут не работает НРВО, ты какую-то произвольную ебалу в ретюрн написал а не имя переменной. Всё правильно обёрнуто. *= возвращает T&, значит это lvalue выражение, делаем мув, получаем рвалью.
После checked exceptions в джаве ни один язык больше не связывался с этой ебаниной. Но я вижу у крестов свой путь.
Прокидывание ошибок в говноланге - это по сути те же checked exceptions.
Во всех более менее современных языках ошибка возвращается в виде тупла [err, result] = call_func(...)
Тут просто предлагается использовать для возврата err уже существующий канал - там где данные по исключению.
Получаем плюсы от обоих подходов (не забудешь обработать err)
Это который появился до жабы, питона и пхп? Да, очень современный язык.
Какой же Стивен Кинг охуенный. Мало того что много годных книг написал так ещё и на крестах кодит.
Да какая разница, лол.
Полный интернет пруфов.
Начиная с С++17 нахуй нен адо
Да, действительно. "r = s" вернёт Field_<T>&, что не попадает под copy elision. Нужно сделать
r = s;
return r;
Тогда всё ок
Одинаково
Пошёл нахуй отсюда, шиз.
{
public:
Foo(int);
};
int main()
{
Foo bar();
return 0;
}
Почему этот код успешно компилируется и не выдает ошибку на этапе Foo bar()? Ведь у нас нет конструктора по умолчанию. Что он вызывает?
Перетолстил.
Конструктор создаётся автоматически если ты его не задаёшь.
А, блин, отвечу сам на свой вопрос, это же не шарп. Тут конструктор по умолчанию вызывается просто через Foo bar; Я просто пьяненький
Да, уже понял, спс. Просто с шарпом перемешалась каша в голове
Так как раз таки не скомпилируется.
Foo bar(); — объявление функции, а не переменной. Наследие от сей. Не пиши так никогда и всё будет хорошо.
Спасибо
Вот жеж мудак на пикче. Высрал свою книгу по шаблонам, другой мудак впечатлился и высрал на них относительно объёмную прогу-сервис на стандарте с++03. А я потом с этого кода охуевал. При том, что решать поставленную задачу шаблонами не было никакой необходимости, банальная прикладная приложуха.
Получается, что Керниган и Ритчи - самые главные мудаки? Почти весь говнокод в мире алголоподобных языков можно отследить к их книге.
class Values
{
private:
int m_value = 5;
};
и
class Values
{
private:
int m_value;
};
public:
Values() : m_value(5);
{
}
};
Желательно, как можно подробнее
Почти одно и то же.
Второй пример выполняется после первого, если в наличии оба.
Позволяет иметь "дефолтное" значение, а потом другим конструкторам иметь "более приоритетные дефолтные" значения.
В первом примере работает копирующая инициализация, то есть в строке int m_value = 5, сначала создается интовый объект 5, а потом его значение копируется в m_value, или в случае с инициализацией членами класса компилятор сразу даст m_value значение 5 без порождения лишних объектов?
Просто я где-то видел, что лучше всего использовать только списки инициализации, и если ответ на мой вопрос в абзаце выше будет "да", то тогда для меня очевидна выгода списков инициализации -- нет порождения лишних сущностей, напрямую инициализирует объект. Если же ответ, будет "нет", то, выходит, нет разницы, каким способом инициализировать члены класса?
В обоих случаях инициализация объекта происходит напрямую, без порождения лишних сущностей.
>Второй пример выполняется после первого, если в наличии оба.
Тогда почему следующий код не печатает сообщение "Hello" дважды?
class Hello
{
public:
Hello()
{
cout << "Hello" << endl;
}
};
class Test
{
public:
Hello h;
Test() : h()
{
}
};
Если в конструкторе в списке инициализации инициализируется поле, то инициализатор места объявления игнорируется
Если не инициализируется, то используется инициализатор места объявления
Это что-то вроде дефолтного значения
[[nodiscard]] отменили?
Красная строчка вот это подсвечивает
1027D:xxxxxxxxx\main.cpp[Error] no match for 'operator>>' (operand types are 'std::basic_istream<char>::__istream_type {aka std::basic_istream<char>}' and '<unresolved overloaded function type>')
Это значит, что ты не указал, что такое oper и что ты вообще хочешь.
Но если предположить, что ты студент, то oper у тебя это char, то ты должен вот эти твои плюсики и звёздочки обернуть в одинарные кавычки. К тому же ты не сравниваешь этот твой oper со знаком деления, что всегда вернёт тру вроде.
блин спасибо я вправду просто одинарные ковычки не указал...
Бля что ж оно не выходит из if? Если оставить одно условие, допустим oper != "+" то всё работает, а если два и больше то тут хоть || хоть or соединяй просто постоянно по циклу гоняет.
я уж думал двощи 2 кусочка кода за 1 картинку приняли, а там и вправду одинаковые были. вот
Спасибо вот тебе в благодарность контакт человека знакомого с Костей Еременко https://vk.com/id4013063
Как зовутся эти разные названия в темплейтах? И есть ли вообще какая-нибудь разница между ними? Если да то как их все нагуглить?
Параметры шаблона
Как угодно. Руководствуются здравым смыслом и семантикой. Посмотри как в стандартной либе (но там ещё с подчёркивания начинают, так в стандарте положено) и в бусте называют
Т.е. int v = packBits( true, true, false, true, true ) в v будет записано 27
Думаю надо будет создать класс, принимающий биты и выдающий инт, но это какой-то оверинжиниринг. Если у тебя константа то что не просто литерал? 0b11011
Строго говоря - никак, потому что фолды работают с операторами. Тебе придется как-то переопределять оператор и возможно заворачивать булеаны во вспомогательный класс.
Можно сделать почти фолд
Первый - а как часто вы использовали подобные вещи?
Второй - а на сколько реально надо закапываться в stl?
Использую регулярно.
>а как часто вы использовали подобные вещи
Мне вариант ещё тогда бустовый было удобно делать, когда один формат парсил, и там строки, числа и другие структуры были.
>на сколько реально надо закапываться в stl
Условные lower_bound и make_heap тебя спросят максимум на собеседовании, но основные операции (erase, remove(_if), find(_if), transform, for_each, sort, copy(_if) и другие) надо уметь хотя бы хорошо читать. Но STL в основном логично построен, похожие операции возвращают и принимают похожие вещи, так что это не слишком сложно. ЕМНИП вот хороший доклад: https://www.youtube.com/watch?v=2olsGf6JIkU
не видел ни одного юзкейса std::variant, который бы меня впечатлил и побудил использовать в проде.
а STL надо знать как свои пять пяльцев
Ну вот, например, в ВоВ интерфейс можно подписать слушать разные игровые события. Соответственно, у этих событий есть свои аргументы.
https://wow.gamepedia.com/Events
https://wow.gamepedia.com/API_Frame_RegisterEvent
Вот как бы нечто такое выглядело в коде? Можно, конечно, передавать массив строк, а затем пусть функция-обработчик события преобразовывает строки в нужный аргумент.
Чтобы они валялись в памяти непонятно где, а лежали последовательно, хорошо с точки зрения подгрузки в кэш.
Это и без полиморфных аллокаторов достигается бтв.
Он еще и хуево оптимизируется в плане возврата/переупаковки по сравнению с растом
Ошибки-значения лучше, когда они идиоматичны для языка и переупаковка их нормально оптимизируется компилятором. Если в плюсах везде использовать std::variant<Norm, Huevo> и пробрасывать, получишь миллион копирований/перемещений.
Ошибки-значения лучше, когда они идиоматичны для языка и переупаковка их нормально оптимизируется компилятором. Если в плюсах везде использовать std::variant<Norm, Huevo> и пробрасывать, получишь миллион копирований/перемещений.
Я пробовал, посмотрел, во что это компилируется, больше не буду.
Аллокаторы не гарантируют тебе что соседние элементы будут рядом в памяти.
ScopeGuard'ами.
В США вполне себе нужны и оплачиваемы
Пробовал, не работает
1 это int. Выражение при вычислении приводится к самом у широкому типу, знаковый считаеться более широким чем беззнаковый (хотя в них может быть одиинаковое количество чисел). (a - 1) - преобразуется обратно в беззнаковый при присваивании, (b-1) выводится как есть, тоесть как знаковое.
То есть выводится что-то, но пустое место без символов
Выводи два соседних символа.
Тому что арифметика знаковая, но в первом случае ты засовываешь результат в беззнаковую переменную а не UB ли это?
У меня есть куча кода с static const, есть смысл все делать constexpr? Или для компилятора это все одно и тоже?
А как правильно - constexpr или constexpr const?
С ним в данном случае тем более нет смысла - он все уберет
const можно использовать не во всех контекстах, в которых можно использовать constexpr.
Потому что у тебя логика странная.
Ты почему-то из "для компилятора есть разница" делаешь вывод "получается разное в дизасме", а я этого не говорил.
Я это к чему спрашиваю, это как с inline. По стандарту написано что все методы описанные внутри своего класса должны быть inline, но все равно серьезные дядьки из гугла/милкософта/etc пишут руками как на пикче (этого я тоже не понимаю)
Такой же вопрос избыточности или нет возник и с constexpr. Тем более что я тут погуглил, и оказалось что есть моменты, где без constexpr const просто не будет компилироваться (указатели на constexpr)
Вот про inline - четко и ясно написано. И все равно люди пишут >>875481
Не, я бы понял если бы речь была про forceinline. Но тут inline
А я например с помощью main вычисляю говноучителей в ютубе - кто не знает, эта единственная функция (точнее все семейство из почти десятка вариантов) в которой разрешено не писать return
Пиши const constexpr const __attribute__((const)), не ошибёшься.
Говорят, в следующем стандарте завезут constanter_const_cast<>
Там написано не то, что они должны быть inline, а то, что они уже inline и ничего писать больше не нужно.
Нормальный анализатор кода выдаст тут предупреждение
>Пиши const constexpr const __attribute__((const)), не ошибёшься.
Я вот не понимаю, нахера в С++ вводят кучу необязательных классификаторов? По типу, ну может быть оно будет таким, как написали... А может и не будет
Потому что кресты древнее говно мамонта, в котором дизайн трещит по швам и собран из костылей чуть менее чем полностью.
Не читай это, просто скипни. Это настолько убьёт мотивацию что ты зашкваришься и уйдёшь в жопаскрипт.
Я это пропустил, когда читал. Это невозможно читать без предварительной подготовки. Затем формальные грамматики тыкал отдельно.
Просто названия синтаксических конструкций, ничего сложного.
хз я школьник но у нас с++ вроде проходим не такие уж и лёгкие алгоритмы такие как дерево отрезков или таблица пар
>Пчел...
13 лет назад был С++ 03. В котором уже было про inline методы внутри классов. Так что не аргумент. И это не настолько давно - я в те годы как раз загорелся идеей стать программистом и трогал всякие делфи (и даже видел такое чудо как делфи.нет)
Что происходит при объявлении указателя на класс Node<T> head как поля класса List?
При создании объекта класса List c параметром Node<T> head, вызывается конструктор Node, а затем в класс List передается указатель на только созданный объект Node?
нет, ничего не произойдет, у тебя там указатель, и он может вообще на другой нод указывать
Это реализация односвязного списка и она работает. Все через указатели ведь.
Ты тупой какой-то.
Может, у них практика такая, чтоб можно было потом эту функцию легко перенести из class scope в namespace scope в хедере. Тогда inline не придётся дописывать. А может автор кода аутист. Зачем нам разгадывать его мотивы? Ты это как авторитетный кусок кода принёс, потому что он в гугловской кодовой базе? Охуеть просто. А может ему нравится быть explicit вообще во всём, вот такой он у мамы дотошный.
>>875545
>А я например с помощью main вычисляю говноучителей в ютубе - кто не знает, эта единственная функция (точнее все семейство из почти десятка вариантов) в которой разрешено не писать return
Для вычисления достаточно самого факта, что это на ютубе (кроме конференций). return из main — не аргумент
>13 лет назад был С++ 03. В котором уже было про inline методы внутри классов.
Было хуй кобылы.
Нормальные практики написания кода даже сегодня не везде проникли, а многие даже опытные программисты пишут в таком же стиле, в котором они писали 20 лет назад. И стандарт тут не причём.
Ассерт умеет только падать, когда данные уже попорчены. Такой себе хендлинг.
Ассерты изначально предназначены для тестирования кода на этапе разработки, типа юнит-тестов. Если ассерт свалился, значит, в логике программы ошибка. Ассерт - это то, что не должно выполняться никогда, вне зависимости от введённых данных. Обработка ошибок - это другое, она предполагает, что эти ситуации возможны. А ассерты для покрытия ситуаций в духе "квадратный корень положительного действительного числа вернул отрицательное значение".
Но ведь иногда случаются ошибки, при которых программа не может продолжать исполнение и вынуждена упасть.
Значит хуево тестируете на пререлизном этапе, что еще можно сказать
if(...) return -1/exit("...");
Примеры?
> чтоб можно было потом эту функцию легко перенести из class scope в namespace scope в хедере. Тогда inline не придётся дописывать
Бляяяядь.
Анон, помни, такой дебич может сидеть за соседним столом
Я просто предположил, гайдлайны в разных компаниях могут быть сколько угодно ебанутыми.
Я юзаю либу imgui, там чекбоксы\открыто-закрыто окно и тд реализуются через указатель на bool
пчел, компиляторы уже давно умнее кожаных мешков в плане оптимизации кода. Компиль сам заинлайнит нужные функции.
да он типичный студентик:
- Ряяя новый стандарт, бест практикс, александреску скозал...
- Уёба, ты когда таску закроешь?
- ...
>>873633
>>872946
>>872924
И это в 200-м то году в крестах еще остались аутисты, котороые не используют std::expected, обернутый в корутины для монадных операций?
https://github.com/toby-allsopp/coroutine_monad
Это не гайдлайн, это проблемы при разработке архитектуры. Если вдруг у твоего нанимателя появятся деньги на рефакторинг этого дерьма, то об inline ты точно не забудешь. а в шаблонах он нахуй и не нужен
>>876053
Да не нужен он там, это писали деды до того, как на рынке появились более-менее вменяемые анализаторы кода. Типичный дед --> >>876126
Сейчас бы пердолить абстракции из костылей, получая производительность как в нормальном языке с функциональщиной из коробки.
>пердолить абстракции из костылей
из этого и состоит профессия программиста, ну хотя еще из дейли митинов там всяких
>нормальном языке с функциональщиной
ну хотя я уже понял что программистом ты никогда не работал, а только кукарекаешь на дваче
> получая производительность
норм там производительность
>производительность
https://github.com/facebook/folly/blob/master/folly/Expected.h#L1332
собственно вот, в кор перформанс критикал либе пейсбука, так что сосай бибу, кукаретик
Это нелегитимные перекаты.
Сам сосни без пруфов. Гейбук даже руби использовал, так что сосать всё же тебе надо.
не заплачь только чмоня, а то серьезные дяди твою тонкую студенческую душонку обидели. И вообще иди laba2 с хаскеля на си переписывай, а то препод не примет, скажет дурачок
Так, молодежь не читала Ахо и не использует yacc?
Это просто названия нетерминалов. Им тут же даётся грамматическое определение.
В с/c++ уже все обернуто в монаду (любой блок кода), поэтому у тебя масло масляное.
>Что значит "терм"?
(опционально терм */%) Первичное вырежение
>Что значит "первичное выражение"?
Число либо (Выражение в скобках)
>Чем оно от обычного отличнается?
Тем что выражение это (опционально выражение +-) терм.
Все же написано.
1. Речь шла не об этом варианте применения inline.
2. Если уж ты об этом заговорил, то и gcc и clang учитывают inline при принятии решения, инлайнить функцию или нет.
3. Компилятор переиграть в нетривиальных алгоритмах достаточно легко.
А я и не спорил ни разу, че ты
еще проще:
- деление на ноль - это ассерт, и не должно происходить никогда (но в дебаге стоит проверить)
- чтение поврежденного файла на диске - это ошибка, бытовая ситуация, и должна обрабатываться всегда (даже если просто падает)
- отсутствие строчки в конфиге - это варнинг, должен обрабатываться и исправляться, но не падать
>Да не нужен он там, это писали деды до того, как на рынке появились более-менее вменяемые анализаторы кода.
Вот именно, что не нужен. Этого ответа от тебя полтреда и добивались, ебанько.
Двачую. Наконец понял, что за манера разговора - душный студентик, который только что дочитал Страуструпа.
Требуется вычислить его контрольную сумму crc32, вообще ума не приложу как это сделать
Тебя не смутило, что терм это первичное выражение, первичное выражение это выражение, а выражение это терм? Там цикличное определение. Чтобы разорвать цикл нужна воля.
Я это и подметил, тут ошибка в том что я думал, что ход анализа почему то как на пик 1 шел из-за этого те 2 правила ниже не работали б. А вот как обработать тот же пример 2+3 но еще и 5, ведь 2+3 засчитается как выражение, а в синтаксисе терм первичное выражение, а выражение * первичное выражение нету
сломалось все из за *, но думаю все равно понятно
не я именно про 2+35. нету ведь для такой ситуации правила. есть только термпервичное выражение.
... есть только терм*первичное выражение.
Так может подскажешь? Хотя бы идею как вообще это рассчитывать, все что нашел в Гугле это лютый пиздец, вообще не применимый к моей задаче.
а чё 3 не проваливается в выражение, а остается в терм. Как будто он ждет пока к нему придет первичное выражение, как будто знает об умножении. Как ход вообще идет? значение и оператор получается. в данном случае 2+ потом 3* потом 5. Так как тогда ход анализа идет? Если как на пик 1 получается пик 2, где все сторопится когда 5 лишний раз преобразовывается в терму, а если как на пик 3, то тогда 2+ не проходит по условию потому что 2+ пока что просто терм, еще в выражение не преобразовавшийся.
Конкретный алгоритм устанавливается в условиях задачи, самое простое - просуммировать все числа массива и взять 4 младшие байта результата (и.е суммировать можно прямо в уинт32)
Конкретная задача такова, есть микроконтроллер российского гавнопроизводства, я написал прошивку для него, у этой прошивки с помощью обычных онлайн калькуляторов можно посмотреть контрольную сумму, то есть там используется полином crc32 ieee, моя задача прочитать память МК, в которую и была записана прошивка, это будет как раз массив uint32_t massiv[size]. Далее мне нужно вот к этому массиву применить расчет crc с использованием полинома crc32 ieee, для того чтобы я мог сравнить то что должно было быть записано в МК, с тем что там записано по факту.
Ну нехуя ты умный. опиши тогда это выражение этой грамматикой можешь хоть деды хоть уасс использовать
Я не писал компиляторов, но предложу что там перебор.
Т.е. если не сработало с термом, пробуем с выражением, и так далее.
Это называется "жадность", и довольно болезненный вопрос в грамматиках, регулярных выражениях и вот этом всем.
Ты встретил 2. Это число.
Ты встретил +. Есть правило которое требует слева выражение, справа терм.
Слева число которое может быть повышено до выражения.
Справа терм. Начинаем набирать терм.
Встретили 3, это число, это терм.
Встретили ⚹, опа, а там рекурсивное правило.
Ведь и 3 терм, и 3⚹5 это тоже терм.
Почему складывать? Я понимаю как получить КС на бумаге, например от 8бит информации применяя полином 3 степени к примеру, тут все соизмеримо, но мне нужно применить к 30кб информации полином 32 степени, вот тут я не понимаю как это должно работать. Были мысли взять КС отдельно от каждых 32бит (это по сути один элемент массива) и потом сложить их все, но будет ли это верно?
сразу скажу что я не разбираюсь в вопросе, но у меня есть подозрение, что и сегодня можно на асме писать куски кода которые будут в разы быстрее отрабатывать, за счет того что будут напрямую использоваться векторные расширения, новые наборы инструкций, плюс программирование с учетом попадания в кеш и прочие оптимизации..
>crc32 ieee,
5 секунд в Гугле
https://github.com/Duet3D/CoreNG/blob/master/asf/common/services/crc32/crc32.c
> то и сегодня можно на асме писать куски кода которые будут в разы быстрее отрабатывать
Не имеет смысла в плане трудозатрат.
> напрямую использоваться векторные расширения
Только если вдруг компилятор сам не сможет определить, куда их применить в конкретном случае, что случается достаточно редко.
> новые наборы инструкций
Каким образом?
> плюс программирование с учетом попадания в кеш и прочие оптимизации..
Хуяции. Если ты свою laba2.cc напишешь ассемблерными вставками, лучше в кэш оно укладываться не станет. Это решается разработкой схемы доступа к данным с учетом особенностей кэширования, и то только для конкретного случая, если бенчмарки показали чаще всего просто в качестве превентивного предотвращения false sharing куда-нибудь прихуяривают паддинг в 64 байта
> сразу скажу что я не разбираюсь в вопросе
Хуле пиздишь тогда?
>Не имеет смысла в плане трудозатрат.
Потому что ты так сказал?
Мне вот платят именно за это, когда нужна производительность.
Мы про случаи "изначально писать ассемблерной вставкой". Если ты начинаешь хуярить это сразу на асме, не спрототипировав и не померив производительность в обычном варианте, то земля пухом.
Попробовал объяснить своими словами и понял что сам не понимаю как Crc32 работает.
Ну в общем там какой то аккумулятор, в который по биту засовывают и ксорят )))
>хоть деды <...> использовать
Он имел ввиду дедовский способ, руками написанный рекурсивный спуск. Реально, анон, почитай лекции по формальным грамматикам и парсерам, проще будет.
По твоему вопросу: грубо говоря парсеры в каждый момент времени держат несколько вариантов развития событий. И если в какой-то момент попадается символ, который не вписывается в текущее правило, они пробуют другое правило. Если всё равно что-то не так, они отходят на шаг назад и уже там пробуют по-другому. И так, пока не распарсится вся строка до самого конца.
Ладно анон, отложу это на потом. Поясни пожалуйста, парсеры в интернете так и работают: с помощью грамматик находят нужные элементы в html странице?
int main()
{
int a{3};
int b{2};
int c = &b;
cout << c << " " << b << endl;
--с;
cout << c << endl;
return 0;
}
Выводит
0x61fe0c 2
40
почему 40, а не 3?
Потому что это невалидный код в C++.
UB
UB UB гроб кладбище пидор
>line (575,400,575,100)
Ну это явно координаты точек
Перейди на объявление этих функций, там должно быть понятно хотя бы из имён переменных.
Или ищи доки на твою либу.
Каждый раз, когда вижу в плюсовом коде <string.h>, задумываюсь, имелся в виду <cstring> или <string>.
Он шпарит по методичке написанной ещё при совке. Естественно там о либах плюсовых ничего ещё не было
Ебаный ад
Фиг знает. Может компилятор вообще не сэмитил запись переменной "a" в стек и держит только её значение в коде.
Как я понял - line (x1, y1, x2, y2)
Где x1, y1 координаты левого верхнего угла
А x2, y2 координаты правого нижнего угла.
Не знаю что ты там хотел написать, все звездочки съело.
Если ты пытался передвинуть указатель на типа "предыдущий" массив, то это так не работает - между ними может быть целая страница памяти, например.
Смотря какие у тебя задачи.
Есть CImg. Есть разные либы для рисования, собственно, 3D. Есть куча либ для 2D если тебе так важно рисовать все линиями и кружочками.
В конце концов есть софт для процедурного рисования командами, но не си++.
Тот же OpenSCAD.
Visual Studio что-то не зашло, возможностей больше, но машина у меня слабая.
3-д модельки это не основная работа, это скорее исключения, так что не вижу смысла куда переходить.
Пердачую модули и std::format. Лично я жду, когда в стандарт уже завезут нормальный мультиплексированный ввод-вывод, но это произойдёт не в двадцатых плюсах, а когда Networking TS доведут до ума.
Это верно. Часть инструкций процессора невозможно из с++ использовать напрямую. Особенно это болезненно, если ты всякие кодеки дрочишь под эмбед.
>>876552
stl макака в режиме отрицания? В прошлом треде тебе приводили пример на ASM + SIMD для обработки картинок. Работает в 2-2.5 раза быстрее чем тот же код без вставок на c++.
у тебя не 3d, а 2d.
Обычно дело обстоит так:
Оконная координатная система имеет начало (0,0) в левом верхнем углу экрана. Ось X вправо, ось Y вниз.
Отрезок/линия задаётся двумя точками в этой системе координат.
line(x1, y1, x2, y2).
Я вычисляю 100к+ цифровых подписей в секунду, на чистых плюсах без ассемблерных извращений больше 10к не вытянуть при тех же алгоритмах.
У меня вопрос. Вот есть либа для рисования геометрии opencsg, например. Насколько я понимаю, это только инструмент для визуализации. Если мне туда физику на модельку прикрутить надо, как в CAD/CAE софте.
Как дальше работать с этой геометрией? Ведь все эти либы только для визуализации, как я понимаю, а перевести их в сетку с ячейками и получить дальше какой-то динамический массив в виде ячеек необходимо? Есть такие инструменты?
Так а что тебе нужно то?
Вся геометрия для CAD и им подобных систем - OpenCASCADE.
Нужна физика - Bullet
Визуализация расчётных сеток (и операции с ними) - Vtk
Всё это пилилось лет 15 и там овердохуя всего. Но не хайтек и работает не очень шустро.
Генераторы расчётных сеток и решатели я не знаю какие есть нормальные в исходниках. Обычно их жопят в уголок и никому не показывают.
1.В матрице A[n][n] отсотировать строки так, чтобы элементы последнего столбца были упорядочены по неубыванию. Обязательно надо создать функцию, которая меняет местами строки, номера которых переданы как формальные параметры.
С горем пополам написал такой говнокод, однако работает через раз:
void sort_rows(int matrix, int row1, int row2, int columns) {
int temp;
for (int k = 0; k < columns; k++) {
temp = matrix[row1][k];
matrix[row1][k] = matrix[row2][k];
matrix[row2][k] = temp;
}
}
int sort_matrix(int matrix, int rows, int columns) {
int last;
for (int i = 0; i < rows; i++) {
last = matrix[columns - 1];
for (int k = 0; k < rows; k++) {
if (last < matrix[k][columns - 1]) sort_rows(matrix, i, k, columns);
}
}
return matrix;
}
Кучу раз переписывал, но работает все ужасно, никак не могу понять саму суть сортировки матриц.
Хм, а чем это обусловлено, ведь и там и там одна операция чтения памяти. Надежда на то, что компилятор заинлайнет обе функции в одно и не придется тратить ресурсы на вызов другой функции? Кстати, а если условие не одно, а несколько (AVX -> SSE -> default) то через свитч тоже быстрее будет?
Дешевле ориентироваться на актуальное железо и не ебать голову и посылать нахуй любителей калькуляторов 10-летней давности на 775 сокете.
Дешевле всего перестать трахать голову и написать как проще, а необходимость оптимизаций проверять бенчмарками и профилированием.
>Надежда на то, что компилятор заинлайнет
Дя. Ты ж на плюсах пишешь, у тебя 99% кода должно быть в h.
Если нет, то 1 может быть быстрее.
У Агнера Фога в https://www.agner.org/optimize/optimizing_cpp.pdf секция 13.5 про это. Но вообще, если ты используешь SIMD, то время исполнения функции у тебя в любом случае будет намного больше времени на выбор нужной имплементации, так что я бы не заморачивался.
CSG это "конструкторы" форм из более простых форм путем сложений/вычитаний/пересечений
Но в твоей либе четко написано что она меш из них не конструирует, а пользуется приемами типа z-buffer
Так что тебе надо искать именно либу которая работает с мешами, или хотя бы делает их из CSG.
Можно к этому моменту завафлить архитектуру или структуры данных.
Вообще, современный оптимизон он в первую очередь про ублажение кеша и про эффективные структуры данных, чем про эффективные датадробительные инструкции.
Ладно.
какая же боль
Да, добавится __asm { }
ну чето хуй знает, теперь я думаю что еще сильно меньше. Зависит шрифта конеш
Насколько помню, там очень мало памяти было, поэтому на ассемблере был написан небольшой интерпретатор, а остальное на некотором DSL. На крестах вряд ли это было бы выполнимо вообще.
Попенсорс обычно для csg вычислений использует CGAL.
>маленький пример кода и ошибка из грёбаной Boost.Hana
Я тоже могу несравнимые вещи показать рядом.
Ну-ка.
Я нарисовал цилиндр, но там походу должен был быть вытянутый шестиугольник который я бы уже сделал в 3-д.
Так вот, можно ли сделать из цилиндра вращающую модель в консоли? Или там только из шестиугольника можно? В цилиндре 10 точек насчитал (несколько не посчитал), а если я бы сделал шестиугольник там бы было в 20+ точек.
По копиляции или выполнению? Делал замеры внутри программы? Сравнивал релизную версию с релизной?
По выполнению, одинаковый исходный код, замеры внутри программы, у MSVC /O2 /Ob2 /Oi /Ot /GT /GL, у Clang -O3 -march=native -flto=thin.
Попробовать понять алгоритм и написать самому с нуля.
Ну а есть вероятность что я пойду на работку устраиваться и меня заставят прямо в линухе возиться? Линукс в целом знаю, но пердолиться не охото.
Да это не проблема, я почти Бьярна дочитал. Да и нужно заранее и постепенно инструменты учить в случае чего.
Пчел, между дочитал бьярна и выучил С++ несколько сотен тысяч строк кода и еще десяток книг минимум
я тож так думал, дохуя всего прочитал, писал пет проекты, потом взяли на работу джуном и резво ПУК СРЕНЬК.
Это тоже стоит, да. И что? Вряд ли это обеспечит такой прирост, только если вся программа не состоит из легко векторизуемых циклов.
Без кода и бенчмарков ты хуй простой
Ну-ну.
Ох дружок, у тебя эффект Даннинга-Крюгера просто зашкаливает. Мне это особенно смешно, потому-что был таким же. Все изи схватывал, понимал, а потом на первый собес пришел и ответил еле еле на пару вопросов из 20. Настолько плохо, что мне прям на собесе сказали, какие книги почитать еще, даже не "мы вам перезвоним".
Да вполне возможно.
Да, даже спустя кучу времён ты будешь узнавать какие-то мелочи или нюансы и говорить "вау, вот это ж нихуя себе", хотя, казалось бы, уже очень много знал и так. Но так вообще со всеми вещами в жизни, в любой отрасли и профессии. По крайней мере если ты реально стараешься углубляться и развиваться.
Я вот имел уже лет 5 опыта на плюсах прежде чем узнал, что const в namespace scope implicitly static, а не extern, в отличие от С. И потом каких-то таких мелочей с годами было ещё много. И будет ещё.
Всё у меня ок. Максимум раздутое чсв из-за того что я за 2 месяца вката уже успел 2 друзьям недопрогерам помочь писать диплом с 0.
inb4: UB
Ну не стек же.
static_cast lol
print(a+b)
Ты мне сразу рассказывай в чём подвох, нечего время терять.
Ну как минимум - Майерс, Саттер
Если файла нет, то софтина должна создать новый. Ну вы поняли.
Хочу написать скриптик который это делает. Какие подводные? Я же не знаю в какое время приложуха(на сиплюсплюсе) хуярит логи, открывает/закрывает файл. Хочется и чтоб логи не проебались.
Так вот, вопрос не столько по C++ а по потокам файловым. Можно ли в файл в который периодически пишут взять и двинуть командой mv?
Ну как минимум - Маркс, Сартр
Используй syslog\ETL логирование нативное платформенное. И на платформе прям конфигурируй логротейшены и прочее.
>syslog
Я ж не сеньор помидор. Есть софтина которая пишет в файлик логи. Чё я её переписывать стану? Я хочу скрипт для себя сделать чтоб не было 2gb логов.
Или типа будет лажа если сделать mv debug.log currentdate_debug.log?
Окей, тогда просто подключи spdlog, и он сам за тебя все сделает.
Тащемта из-под студии можно подключиться к wsl2
По идее проекция круга на плоскость (то бишь камеру) это в общем случае эллипс. Если умеешь рисовать эллипсы, значит по идее можешь рисовать вращающийся цилиндр если применить немного линала.
Нахуя вам блять эти книги, мы в 80 живем без интернета чтоли? Делаешь проектик, натыкаешся на что-то непонятное, гуглишь, читаешь какую-нибудь статейку и все. Пиздец, щас бы сидеть 500 страниц наяривать какой-то хуйни без практического применения.
То бишь соединить каждую точку по x, y, z? Я не понимаю как это должно выглядеть.
Жвачую, а потом хуярят костыли, там где есть проверенные методы
Очень высокий, плюс treat warning as errors
https://www.scratchapixel.com/lessons/3d-basic-rendering/perspective-and-orthographic-projection-matrix/building-basic-perspective-projection-matrix
Гайд по преобразованию 3D-векторов в положение точек на экране.
Если у тебя консоль, то сделай таблицу буква : цвет, то есть . это очень неяркий, а B довольно яркий.
Если линии нужны антиалиазинговые, то погугли разные алгоритмы для отрисовки линий.
Я сеньор 25 лет
#pragma warning(disable:errno)
В линуксе есть встроенная хуйня для ротации логов. Вроде logrotate называется.
В столбик?
А теперь ещё раз, включив мозг.
Сап байтоебач.
Есть функция на Си и ее интерпретация на асме, пик тотали рилейтед.
Казалось бы, компилятор должен выделить 16 байт под буфер и 4 байта под флаг, и тогда стек должен выглядеть как на рисунке 1, но нет, он выглядит как на рисунке 2. А именно -- флаг, 12 байт непонятной хуйни, 16 байт буфера, 8 байт указатель (типа в регистре он их оставлять не хотел) и еще 8 байт выделенных хуй знает зачем. Больше всего меня беспокоят 12 байт между флагом и буфером, т.к. от этого зависит, как будет работать эксплойт через переполнение буфера.
Через компилер эксплорер код прогнал, гцц и клэнг выдают примерно то же самое. Пока что нагуглить смог только canary value, но не уверен, что это оно.
Си-тред на 10 тредов ниже.
-O2 не забыл?
Список инициализации для конструктора уже был в самом первом стандарте, т.е. C++98? Не могу найти.
Начиная с C++11 появились non-static data initializer, а именно int a = 1; в структурах, классах. Как они реализованы? Внутри себя они представляют использование неявного (создаваемого компилятором) списка инициализации?
а, погоди, что я несу вообще.
Как таковые, списки инициализации существуют давно. В C++11 появился класс с таким же названием initializer_list.
https://en.cppreference.com/w/cpp/language/constructor
> Not to be confused with std::initializer_list
Ты путаешь вот эти два вида инициализации.
struct S {
int a = 1; // since c++11
S() : a(2) {}; // since nobody can remember
};
Поэтому тебе такой вопросик: какое значение будет иметь a?
Не, я ничего не путал, формулировка вопроса была корректная. Про
>int a = 1; // since c++11
я знаю, это называется in-class initialization.
>Поэтому тебе такой вопросик: какое значение будет иметь a?
a будет иметь значение 2, т.к. список инициализации имеет приоритет над in-class initialization.
На мой вопрос уже ответили
>>879100
Как называется эта проблема на пикриле (как ее правильно гуглить), и как она решается?
Это же пиздец. Почему вообще разрешается создавать одноименные классам функции? Сразу на ум приходят ситуации, когда ты в своем большом проекте сделал тысячу классов, потом подключил стороннюю либу, а там определены функции с такими же именами. И что, придется переписывать исходники проекта/либы? Очевидно, что должно быть какое-то нормальное решение
Так а в чём пиздец то? Типичный проект состоит из собственного кода и thirdparty, поэтому от коллизии имён ты никуда не денешься. Обычно код заворачивается в namespace.
namespace func {
void A(){}
}
struct A {};
A obj;
func::A();
Про неймспейсы я сразу подумал, но тут был вопрос, скорее, касательно самого синтаксиса. Просто я к тому, что в плюсах есть много неинтуитивных и не совсем логичных вещей. Например, чтобы вызвать стандартный конструктор класса Foo при определении переменной, то нужно писать Foo a; А если я хочу, например, в функцию f(Foo q, ...) в качестве аргумента передать локально созданный экземпляр класса Foo, инициализированный конструктором по умолчанию, то при вызове надо писать f(Foo(), ...);. Можно же было реализовать это в языке по-нормальному, чтобы было интуитивно, т.е. f(Foo, ...); без круглых скобок. Короче, бугурт
Компилятор интерпретирует один язык с точки зрения другого, скажи, что это не так, зануда.
Так че ты пастой с википедии не высрался, а просто нет, скучно с тобой.
Смотря кем. Если дворником, то иди в жек, там всем похуй на твои знания. А если кодером, то попробуй выучить ЯП какой-нибудь.
Смешно. А теперь напряги извилины и на основании названия треда в котором я запостил свой вопрос сделай вывод куда я хочу устроиться.
Что же выбрать: мультиплатформенное решение по производительности стоящее на 2 месте или костыльное низкопроизводительное говно привязанное к 1 говноплатформе?
Не надо жирничу отвечать, просто игнорируй.
>Ты что-то написал? А что?
Простенькую гуишную дб, плеер для iptv, минималистическую копию спотифая, компилятор без оптимизаций в принципе, просто копию tcpdump. Ну и по мелочи для собственных целей.
>А что готов писать?
За что заплатят хорошо то и напишу.
Ты сейчас про линукс, на котором сидят 2,5 шиза и про мак ос, которым для работы!! надо? Шинда сейчас монополист на рынке всё лучшее на ней, а более худшего не нужно, понимаешь?
Но тем не менее Вулкан показывает лучшую производительность, чем DX12. Плюс Вулкан банально приятнее.
А вот OpenGL действительно нахуй не нужен. Разве что для мобилок ES дрочить. Ну или для поддержки древнего железа как резерв.
Что ДХ12, что Вулкан адский ад, если твоя цель реально сделать игру, а не нарисовать треугольник за неделю.
Ну если не хочешь углубляться, то есть отличные фреймворки с абстракциями над Вулканом/DX11/DX12. Смысла всё так же нет в OpenGL в 2021. Лучше bgfx какой-нибудь использовать, чем говно мамонта ковырять просто потому что оно легче.
Ты троллишь или правда не в курсе что огромную долю современного игроговна можно запустить в опенгл моде?
> f({});
Что это за пиздец? Что означает такой синтаксис, а именно пустые фигурные скобки в качестве аргумента?
Сильно меньше, чем ты думаешь. И этот ОПЕНГЛ никто не тестит, и не гарантирует, что оно работает
Пчел, давно все игры на мобилах. Андроид, Айфон, может слышал?
С твоими знаниями только в НИИ.
То же самое, что и f(Foo()). Воспринимай это как список инициализации для конструктора аргумента функции.
struct Foo {
Foo(int a, float b) {}
};
f( {2, 1.0f} );
Для доисторического говна без DX11. Хотя сейчас любую игру можно в Вулкан обернуть через dxvk.
Пиздец мочух косоглазый, удалил пост с ответами, а пустой оставил.
99% всех твоих поинтеров должны быть unique_ptr. Шаред поинтеры нужны в очень редких случаях.
Какое-то странное многопоточное шарево, или когда у тебя у тебя адовое легаси без четко очерченного лайфтайма обьектов.
Я буду честен - мне за все шесть лет писанины на С++ ниразу не приходилось использовать шаред поинтеры, т.к. везде было достаточно юника, который иногда даже мувался.
Т.е. владение и лайфтайм были понятны.
Ок, спасибо.
shared_ptr значительно дороже
>>есть микроконтроллер российского гавнопроизводства, я написал прошивку для него, у этой прошивки с помощью обычных онлайн калькуляторов можно посмотреть контрольную сумму, то есть там используется полином crc32 ieee, моя задача прочитать память МК, в которую и была записана прошивка, это будет как раз массив uint32_t massiv[size]. Далее мне нужно вот к этому массиву применить расчет crc с использованием полинома crc32 ieee, для того чтобы я мог сравнить то что должно было быть записано в МК, с тем что там записано по факту.
Так вот, все работает, crc32 рассчитывается, но возникла проблема, как оказалось онлайн калькуляторы не используют чисто полином ieee, там какие то мутанты, поэтому единственный вариант это смотреть значение crc прям во время работы программы.
Ещё раз по порядку, я запускаю программу, там есть переменная которая хранит рассчитанную crc, затем я должен добавить в эту программу define с текущим значением crc, который я только что увидел, это и есть как бы эталон, но вот проблема, как только я впишу туда значение эталона crc, после перезапуска программы crc естественно изменится, так как новая строчка кода появилась.
То есть: пусть значение crc32 без добавления строчки с эталоном это Х, У значение crc32 с добавленным значением эталона. Я врубаю прогу, получаю Х, это значение Х я вписываю в эталон и при запуске значение Х меняется на некий У. И в программе я сравниваю Х с У и получаю нихуя, потому что У я не могу знать заранее, как и Х, я их узнаю только после запуска.
Вопрос: есть ли способ как-то заранее учесть в программе это, может есть какие-то алгоритмы?
Ало, я этот пост написал спустя час от прочтения темы.
Есть абстрактный класс А, содержащий описание виртуальных функций.
Есть наследник B, реализующий эти функции конкретным кодом. По условию задачи, реализация может быть разной, в этом и смысл.
Есть некий главный класс, который должен работать с реализацией типа абстрактного класса А, но должен быть универсальным по отношению к конкретной реализации.
Проблема в том, что в с++ я не могу объявить поле класса типом абстрактного класса А, а потом присвоить этому полю экземпляр конкретного типа B. И по другому никак, т.к. такая архитектура - требование задачи.
Как, собственно, решить этот вопрос, чтобы это было красиво и true way?
Нет
Пока что лидирует Metal.
Придумал такое решение. В главном классе поле объявляется как указатель на абстрактный класс, а в конструкторе этому указателю присваивается адрес конкретного класса-наследника с реализацией. Вроде работает, но это достаточно true way?
Потому что снижает производительность в большинстве случаев, только на DX9 можно получить немного фпс, это же обётка поверх DX. Его сейчас и так под всякие решейды везде в некроиграх подкладывают, для совместимости и нормального захвата буфера глубины. Правда там ещё пердолинг присутствует, т.к. это всё пилилось под Линукс для вайнопердоль, а Винда уже вторична.
Никогда
Этот функционал в костыльном варианте только в студии есть
> undefined reference to `deq<int>::deq(int, int)'
то, где сам код, а не просто сигнатуры методов
Я вообще в автоматическом режиме классы создавал, иде вроде всё сделало правильно. Да и раньше проблем не было
Что сказать то хотел? Если сделать как пик ошибок нет, если определения функций вынести в cpp то ошибка
Какой релиз, это гцц под линух.
Я напишу в лабе просто что это паддинг для алигнмента, мне в C треде уже помогли.
>Какой релиз, это гцц под линух
-O1 или -O2. Хотя бы -Og. Так всего 16 байт выделяется, как и можно было ожидать. Можно ещё добавить -fno-builtin, чтобы строковые функции уж слишком не оптимизировались. Без оптимизаций GCC может оставлять кучу фигни для отладки.
>паддинг для алигнмента
Паддинг для char? Лолват?
да, именно так
ну, к примеру, это причина классической проблемы хранения полиморфных объектов в контейнерах stl, из-за этого приходилось либо хратить указатели или смарт-пойнтеры или использовать другие контейнеры, из того же буста
дак это вечная дилемма: код по настоящему напичканый макросами или шаблонами, очень плохо отлаживать дебаггерами, плюс на нем ломается любое ide, плюс нечитаемые сообщения о ошибках
получается что на полную возможностями ide и отладчика можно воспользоваться только если пишешь plain с или приплюснутый си
Что тут, блять, может быть интересного? Установка бита в определённую позицию.
Читай про varint
Не читал, но вроде Hacker's delight про это.
Алсо, https://graphics.stanford.edu/~seander/bithacks.html
проверка чётности интов
Байтоебство. Бинарные протоколы, ембеддед. Арифметика с фиксированной точкой
>-O1 или -O2. Хотя бы -Og.
Мне нужно именно объяснить работу эксплойта с переполнением буфера, дан уже готовый бинарник и надо работать с ним. Да и уже с -O1 не выйдет этот эксплоит (нужно перезаписать переменную flag переполнив буфер, с -O1 она даже не на стеке).
>Паддинг для char? Лолват?
-->
>>1879192 →
В C треде я предположил, что это потому, что гцц выделяет место под одну переменную и тут же пытается выровнять стек по 16 байт, вместо того, чтобы выделить сразу все переменные и потом выровнять стек. Ну и там пэддинг не для массива чаров получается в таком случае, а для всего остального.
>выровнять стек по 16 байт
Вот на это похоже, да. Значит остался вопрос, зачем остался пропуск в 12 байт, хотя он мог спокойно записать туда заспиленный аргумент в strcpy. Ответ: хрен знает, оптимизации же выключены, любые тупости первоначальной кодогенерации не будут потом удалены.
Переизобретение лисапедов + оторванные от реальности задачи == говно говна == пустая трата времени.
а на собеседовании всем будет похуй на твои проекты, и спрашивать будут только литкод
Соус - собесился в гугл, пару дружань собесились в фейсбук
Что? Все собесы во весь FAANG именно такие. Всем похуй кто ты, и что писал. Это интересно хоть как-то будет после нескольких раундов решения задач с литкода.
Могу ебать, иду писать. Если хочешь - оставь свой ник, как напишу проект на несколько лярдов президентов и стану известным оставлю референс для тебя.
Алгоритмы коррекции ошибок.
Я тебе даже 1 акцию зашлю.
Попробуй включить just my code в настройках проекта
Лучше сначала поищи статью в блоге MS по сабжу, там разжевано всё
Так на стек трейс кликни
По-разному.
Там и стаднартной библиотеки-то часто нет в нормальном виде, а бывает и плюсов нет.
Иногда выкатывают свои простые реализации.
Ну и smart pointers решают не все проблемы, а те, которые решают, не всегда в эембеде существуют.
Ладно я скачал её, просто нажал пки и открыть в новой вкладке, а как установить в dev-c++?
Оверхед же. Да и создавать что то в динамике такое себе.
неработает!!!!!!!!!!!!!!!!!!!!!!
В критическом вообще динамическая память не используется, а в какой нибудь чайник думаю сейчас можно и джаву запихать чтобы вообще все - смарт поинтер.
Как вы заебали со своим ДЕВ С++, КОК БЛОКС и прочей некрохуйней. Откуда вы блядь эту дрисню вообще берете.
Есть студия, Есть слион, есть Вскод на худой конец, нет, находят какой-то анальный клоунский пиздец и начинают ебаться в жопу, вместо того, чтобы писать на С++
> некрохуйней
> Откуда вы блядь эту дрисню вообще берете.
Понятно же, что в методичке к laba1 указано, что нужно качать dev-cpp, borland c++ builder, visual studio 2005, либо ничего не указано, и тогда пикрил.
Студия платная только когда ты занимаешься коммерческой разработкой с оборотом более ляма в год и более 5 разрабов в команде.
Слион можно украсть без проблем.
Поставить шлион, переделать няшный мсбилд в сблев сифозной обезьяны под названием симейк, писать код.
Ну или поставить виртуалку с линуксом и кросскомпилировать через студию\винду.
https://github.com/libarchive/libarchive/blob/master/CMakeLists.txt
Сможешь вот это задекриптить, например?
> Блин. Ну это не удобно же. Мне нужно знать на какой строчке моего кода произошла ошибка
Открой окошко со стеком и посмотри на пару строк ниже
1280x544, 0:09
>The libarchive project develops a portable, efficient C library
>Сможешь вот это задекриптить
vcpkg install libname
понял, не можешь. Ну, я тож не могу, вот по-этому и смейк хуйня
> переделать няшный мсбилд в сблев сифозной обезьяны под названием симейк
Двачую.
Шмек лучше для библиотек, для собственных проектов лучше vcxproj + property sheets
А почему смейк лучше для библиотек? Потому-что он нативно работает с вцпкг и конаном, как единственный правильный способ устанавливать библиотеки!
создал два массива текст боксов из одного в другой нужно передать букву, но они неохотно это делают
TCHAR buffer15_20[1][20][15];
TCHAR buffer_ed[20] = { L"" };
HWND hEdit[20][15];
HWND hEdit_ed[20];
HWND text15_20[15][20];
HWND text20[20];
for (int i = 0; i < 15; i++) {
for (int j = 0; j < 20; j++) {
text15_20[j] = CreateWindow(L"EDIT", L"0", WS_CHILD + WS_VISIBLE + WS_TABSTOP + ES_READONLY + WS_BORDER, 8 + 29.7 i, 8 + 31 j, 27, 27, hDlg, NULL, hInst, NULL);
}
}
for (int i = 0; i < 15; i++) {
for (int j = 0; j < 20; j++) {
text20 = CreateWindow(L"EDIT", L"0", WS_CHILD + WS_VISIBLE + WS_TABSTOP + WS_BORDER, 8 + 29.7 * i, 650, 27, 27, hDlg, NULL, hInst, NULL);
}
}
for (int i = 0; i < 20; i++) {
hEdit_ed = GetDlgItem(hDlg, (LPARAM)text20);
GetWindowText(hEdit_ed, buffer_ed, 2);
}
for (int i = 0; i < 15; i++) {
for (int j = 0; j < 20; j++) {
hEdit[j] = GetDlgItem(hDlg, (LPARAM)text15_20[j]);
SetWindowText(hEdit[j], buffer_ed);
}
}
тупо не видит дескрипторы или функции get и set не работают с массивами?
создал два массива текст боксов из одного в другой нужно передать букву, но они неохотно это делают
TCHAR buffer15_20[1][20][15];
TCHAR buffer_ed[20] = { L"" };
HWND hEdit[20][15];
HWND hEdit_ed[20];
HWND text15_20[15][20];
HWND text20[20];
for (int i = 0; i < 15; i++) {
for (int j = 0; j < 20; j++) {
text15_20[j] = CreateWindow(L"EDIT", L"0", WS_CHILD + WS_VISIBLE + WS_TABSTOP + ES_READONLY + WS_BORDER, 8 + 29.7 i, 8 + 31 j, 27, 27, hDlg, NULL, hInst, NULL);
}
}
for (int i = 0; i < 15; i++) {
for (int j = 0; j < 20; j++) {
text20 = CreateWindow(L"EDIT", L"0", WS_CHILD + WS_VISIBLE + WS_TABSTOP + WS_BORDER, 8 + 29.7 * i, 650, 27, 27, hDlg, NULL, hInst, NULL);
}
}
for (int i = 0; i < 20; i++) {
hEdit_ed = GetDlgItem(hDlg, (LPARAM)text20);
GetWindowText(hEdit_ed, buffer_ed, 2);
}
for (int i = 0; i < 15; i++) {
for (int j = 0; j < 20; j++) {
hEdit[j] = GetDlgItem(hDlg, (LPARAM)text15_20[j]);
SetWindowText(hEdit[j], buffer_ed);
}
}
тупо не видит дескрипторы или функции get и set не работают с массивами?
Нет.
тебе в какой-нибудь петушиный тред, зеленый
Жиза
Язык программирования C++. Лекции и упражнения Прата Стивен
Как она?
Да всё я уже спиздил mvs в нем с гайдами проблем нет
Эта которая C++ Primer Plus? Лет 10 назад ничего была, я как раз по ней изучал язык.
До встречи в питонотреде через 2 недели.
Я пробовал printf("%02x" но оно чот не так выводит. Покажи как правильно пожалуйста.
Там внутренний профайлер есть. А вообще - https://docs.microsoft.com/en-us/windows-hardware/test/wpt/
Я имел ввиду как не выносить участки кода в функции чтобы померить производительность
Читай стандарт, неуч. Знаковое переполнение - это UB, а при UB компилятор волен делать что угодно.
Проиграл
но ведь он прав
Вот тоже думаю, об этом. Бля пиздец. зарплаты так быстро растут что я уже не успеваю следить за ними, и сколько надо просить при устройстве.
Пчел, присваивание - не арифметическая операция, следовательно никакого переполнения тут в принципе быть не может.
Пчел перечитай вопрос анона. У него уже переполнение произошло.
читал недавно в треде что "клиент и сервер хуйни" является годным упражнением. что конкретно нужно делать нужно?
> За сколько отсоритруется вектор размером 3000^2?
За nlogn
> Если это просто инты. А если это вектор объектов?
За nlogn
Замерь.
Почитать про socket/bind/connect/send/receive, сделать.
Потом сделать через select/poll/epoll, сделать
А дальше можно и фреймворками типа асио обмазаться
К инту кастуй и ширину 2 ставь
Хуйня твои советы. Чтоб нормально что-то освоить нужна интересная задачка, а не вот эта вот хуета как в вузике - дрочите теорию и упражнения в вакууме.
Я не говорил, что в вакууме нужно делать. Но без хотя бы чтения man socket ты далеко не уйдёшь. RTFM.
Ну напиши шахматы с мультиплеером для начала, вот тебе идея ебать
Спасибо !
Что по времени? Ты понимаешь что ответ разный при запуске на малинке или на топовом рузене?
В его защиту, std::print на основе std::format ещё не завезли
Бери ёбаный стрингстрим и аллоцируй память триллион раз подёргивая локали, блять
Скорее всего, его нахуй выпнут с любой работы за этот ебаный суржик сишный.
Лол, в его коде printf — наименьшее из зол.
И правда наркоман. Но давай подробностей, мне стало интересно
Не винапи говно, а ты не умеешь документацию читать. Почти всегда в нем надо использовать wchar_t utf-16.
Если выглядит как говно, значит говно.
Вообще тройка WinApi, MFC и COM это самое худшее, что можно увидеть в мире плюсов.
С пар капчуешь?
1 неделю можно бесплатно, так что может кто просмотрит бегло, что там да как. Все таки цена не радует и платить за говно-курс не охота
Эмм, а printf по твоему святой дух юзает вместо аллоцирования памяти?
нет, я в своих проектах fmt использую, чего и тебе желаю.
Но в варианте сишного говна и иостримс - все таки иостримс, хоть это и аксиома эскобара
Почему? cout - это объект класса ostream, вывод производится через метод перегруженного оператора <<, который принимает rhs аргумент следующим образом: если это rvalue - по &&, если lvalue - по константной ссылке. Где здесь триллион аллокаций?
быстрофикс по поводу rvalue - просто принимает его копию, но rvalue - это литералы без адреса в памяти (std::cout << 4, например), поэтому энивей похуй.
Ты сейчас неиронично защищаешь prрешетоntf?
Просто и без задней мысли качаешь community версию прямо с сайта мс
Что тебе мешает сразу проаллоцировать sstream нужным размером?
У меня куплена professional от работы. Так и не понял, чем она отличается от коммунити, которая дома. По-этому просто скачай бесплатную и не еби голову.
Собственно действительно непонятно чем
https://visualstudio.microsoft.com/vs/compare/
Раньше, давно, помню в express нельзя было аддоны ставить, но это вроде уже много лет назад не так.
Короче говоря, для range-based for хочется небольшую оберточку чтобы индекс перед циклом не писать и не инкрементить его в теле
В range-v3 есть что то типа
for (auto const&& [idx, value] : your_container | ranges::view::enumerate) { }
std::size_t
Можно наверное свою обертку намутить на шаблончиках
Если ты задаешь такие вопросы, то тебе никакие рекомендации никаких книг не помогут
А ещё интересно было бы вкатиться в системы сборки. Стоит предо мною дилемма, cmake или bazel. Вроде Базель намного проще удобнее и современнее, но смаке используется везде и на него наверняка документации побольше.
Ну хуй знает. Форматный вывод в потоки это еще более ебанистическая залупа, чем даже сами потоки.
Что угодно, включая snprintf, лучше чем пятистрочный пердолинг с ио-флагами и модификаторами (которые еще и имеют меньше возможностей, чем тот же принтф)
Они конечно говно, но
1. Винапи это C, плюсы тут ни при чем
2. MFC придумали до вменяемой стандартизации плюсов, отчасти поэтому оно такое как есть. Не нравится не ешь. Есть Qt, есть шарпик.
3. COM. Он велик и ужасен, но часто без него никак. Смирись.
Ну и доки всё же лучше читать. Потому как смотря на тот скрин видно не хитровыебаную проблему, а незнание char, wchar_t, TCHAR, и того с чем винда нативно работает.
Ну там скалярное произведение, хуе-мое. А вообще по шести точкам можешь хоть полный перебор на О(N!) делать.
Тем что у тебя скорее всего ещё msdn подписка. Ну и тонкости лицензирования. Вот в Enterprise да есть клёвые фичи, но и без них прожить можно
http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Res-mix
Начинай читать отсюда. тлдр: "мы в комитете обосрались так сильно, что не хватит бумаги подтереться"
А в следующем-то сколько появится! Иди нахуй, долбоёб. Если ты не можешь осилить поиск книги в интернете, то программировать тебе ещё рано
Пример: вектор пар {1000, 2000}, {2000, 4000}, {6000, 10000}, число, задаваемое при поиске - 3000. Цель - при вышеперечисленных данных, вернуть итератор на пару {2000, 4000}, ибо 3000 находится между ними. Пытался написать через функтор, лямбду - возвращает неверное значение. Буду рад, если подскажете можно ли это красиво и чисто написать, не хуяря от руки кастомный бинарный поиск?
Я и говорю.
>Ну так правильный то вариант - fmt все таки, а не выбор из двух стульев.
Да, но она пока ещё только в виде отдельной либы, так что всем сосать.
Поинт не в этом
подключаешь gumbo query и вперед.
Хард мод: сетевой стек, модель слоев OSI, протокол TCP/IP, HTTP(S), значит обработку строк, эллиптические кривые для SSL, WinAPI раз у тебя папки, а не директории, многопоточность, ты же не собираешься сидеть до второго пришествия.
Почему ты считаешь что это работа для lower_bound? Его семантика именно бинарный поиск
>Пытался написать через функтор, лямбду
Какая разница через что писать, лол?
Упрости задачу и напиши сначала для вектора просто чисел, типа ищешь 3000 среди 1000, 2000, 3000, 4000
json\curl
Вроде в Poco есть HTTP. Но если хочешь хардкора, то для этого Boost.ASIO с Boost.Beast
А так я бы сделал на питоне с requests
>Винапи это C, плюсы тут ни при чем
Да, типичные для C именования в стиле CamelCase и в стиле МНОГАРАНДОМНЫХБУХВ.
>MFC придумали до вменяемой стандартизации плюсов
Qt появился 25 лет назад. Ламповый 4.0 вышел в 2005 задолго до modern c++11.
>COM
Без ATL/WTL ты на нём просто охуеешь писать.
>незнание char, wchar_t, TCHAR
А ещё: CHAR, WCHAR, TCHAR, LPSTR, LPWSTR, LPTSTR, LPCSTR, LPCWSTR, LPCTSTR. Смотри не перепутай.
От widget наследуется класс MenuBar файл, правка, вид и тд. У этого класса есть метод добавления пункта меню: текст кнопки и имя каллбека.
Соответственно, чтобы всё работало как задумано нужно добавлять пункт меню, а затем добавлять калбек.
Стоит ли сделать так чтобы при добавлении можно было сразу добавить калбек (этот уже не будет связан с базовым классом и им будет управлять производный класс)?
Никак. Плоскость/грань задаётся тремя различными точками, не лежащими на одной прямой.
А похуй. Уже придумал как
Сейчас все на удалёнке сидят. Из "условий работы" в большинстве случаев остались только деньги и ДМС.
Из отечественных контор всё как обычно: Яндекс, банки, Лохсофт.
Есть куча зарубежных жирных контор типа Хуавеев, но ты туда сразу не вкатишься.
Однако, как мы оба знаем, грань параллелепипеда представляет собой четырехугольник, все вершины которого лежат в одной плоскости.
Видимо в задаче и надо найти такие четыре точки в исходном списке или показать что их нет.
Грань вырожденного параллелепипеда, который возможен при его постановке задачи, не четырёхугольник.
std::string str("Hello world!");
printf( "%s", str.c_str() );
Функция str.c_str() вернет указатель на нуль-терминированную строку. А сама эта нуль-терминированная строка где хранится в это время?
так str - это ж вроде вектор чаров внутри, разве нет?
А что ты хотел услышать? Внутри std::string находится указатель на строку с 0 в конце. Он и возвращается как const.
Ну параллельны я понимаю как. А вот как понять различны они или нет?
Наверное, они параллельны, если у них коллинеарные нормали. А разные - что точки с x=0 и y=0 дают разный z.
http://www.cleverstudents.ru/line_and_plane/parallel_planes.html
И переписать на языке программирования.
Ты тестовое на младшенького в гейдев пишешь?
Подсказка: тебе помогут векторное и скалярное произведение. (a,b,c) это вектор нормали к плоскости.
Какое нах тестовое, сейчас же сессия у студентиков, пора срочно сдавать лабы и курсачи, иначе не допустят, и мамка будет ругать.
>Да, типичные для C именования в стиле CamelCase и в стиле МНОГАРАНДОМНЫХБУХВ.
Венгерская нотация, наследие древности.
>Qt появился 25 лет назад. Ламповый 4.0 вышел в 2005 задолго до modern c++11.
MFC появился 28 лет назад. С++ хоть сколько-то стандартизировали 22 года назад. К сожалению, МС забила на MFC году так в 2003-2005 и стала продвигать .NET, оставив с++ без вменяемого GUI (и средств его разработки). Сколько-нибудь значимое изменение - в 2008 году купили слепок кода у BCG, но дальше развивать не стали. Сейчас двигают UWP - но многих вещей на нём не сделать.
>Без ATL/WTL ты на нём просто охуеешь писать.
Тут согласен. Да и с ними тоже можно охуеть (когда пишешь компонент, а не используешь).
>Смотри не перепутай
Ну тут всё просто (см первый ответ). Но мой посыл был про то, что надо использовать _UNICODE и -W версии функций. И не кастить wide строки к char (а если очень хочется - то не к разным codepage а конвертить в UTF-8 через WideCharToMultiByte например)
>может функция c_str() конструирует временный объект?
Нет, потому что
The elements of a basic_string are stored contiguously, that is, for a basic_string s, &⚹(s.begin() + n) == &⚹s.begin() + n for any n in [0, s.size()), or, equivalently, a pointer to s[0] can be passed to functions that expect a pointer to the first element of a null-terminated (since C++11)CharT[] array.
Смотри
https://en.cppreference.com/w/cpp/string/basic_string/c_str
https://en.cppreference.com/w/cpp/string/basic_string/data
Нет.
Внутри std::string есть m_size и m_pointer. Если строка длинная (больше, чем sizeof(m_size) + sizeof(m_pointer)), то в куче выделяется память и туда записывается текст в конец которого ставится /0; m_pointer указывает на эту память. Именно он и возвращается c_str() или data(). Если строка короткая, то имеет место small string optimization. За правильную реализацию не скажу, но возможно как-то так: Первый бит m_size указывает, что строка короткая или длинная. Следующие 7 бит хранят длину строки. Сама строка записывается поверх памяти [m_size]+[m_pointer] со 2 байта (m_size и m_pointer лежат в памяти на стеке последовательно). В конце пишется /0. Соответственно функции c_str() и data() возвращают указатель на 2 байт m_size.
Но в любом случае никаких буферов для конвертации в C строку не создаётся.
Поправьте, кто в теме.
В целом ты прав, а в частности в каждой реализации может быть по-своему (+ доп извраты в Debug) и меняться от версии к версии, впрочем, MS например заморозили ABI на v140 тулсете и пока не меняют, но собираются - для реализации каких то новых фич придется сломать бинарную совместимость.
А ты довольно немногословен
Может хоть расскажешь почему стоит использовать скнс, который ещё менее популярен чем Базель, значит ещё больше проблем с внешними проектамм
Мне надо написать приложуху, которая будет пиздеть с разными устройствами по сети.
Собирать с них данные и передавать другим классам, которые их неким образом обработают.
Так вот. Сейчас есть класс Device от которого отнаследованы несколько классов, которые непосредственно пиздят с железом. При этом внутри класса Device есть классы, предназначенные для хранения устройство-специфических данных. Классы для хранения точно так же наследуются в классах, предназначенных для работы с конкретным железом.
По идее, подход не совсем правильный, и классы для хранения данных нужно вынести отдельные файлы, чтобы в другом проекте, gui-приложухе (куда эти данные попадают с сервера), использовать только их, а не тянуть ненужные классы для работы с железом по сетке (они по факту нужны только на сервере).
В итоге, получилось так, что написано криво и надо бы это переделать. Но меня уже давно напрягает то, что многие проблемы проектирования являются неочевидными и становятся видны только после того, как ты написал код или в процессе.
К чему я всё это: посоветуйте литературу, которая разъясняет, как проектировать иерархию классов/наследования, как грамотно придумывать взаимодействие между ними и всякое такое. На своих ошибках учиться больно уж геморно и времязатратно.
Посмотри книжки по:
- рефакторингу (Фаулер "Refactoring - Improving the Design of Existing Code")
- паттернам проектирования (Гамма и ещё 3 мудака "Design patterns")
- операционным системам (Танненбаум "Modern operating systems")
Сильно не упарывайся, просто вникни как на каждом уровне решаются архитектурные проблемы.
Советовать не буду, но про Базель я от тебя впервые слышу, а скунс хотя бы в несколько опен сорс проектах попадался.
Вот такую штуку советовали (но пока не нашел времени почитать)
https://github.com/donnemartin/system-design-primer
Кошмар, еще и на Питоне и про веб, да?
Там наверху ссылочка есть
https://github.com/voitau/system-design-primer/blob/master/README-ru.md
string это класс, у него есть мембер - указатель на char, а также какой-нибудь unsigned long buff_len, который хранит инфу о длине аллоцированной строки. Метод c_str возвращает указатель на начало этой строки в памяти. На вопрос где это находится - в куче, ибо размер строки неизвестен заблаговременно в компайл тайме. Деструктор класса string потом удаляет выделенную память.
Long story short - за кулисами это работает как в сишке (если посмотреть на реализацию внутри класса string), просто ввиду присутствия ООП в плюсах, сию сырую ебанину можно обернуть в класс.
Какой string? Где? Тебе же написали выше - implementation defined. Там может хоть на лету создаваться, язык такого не запрещает. Язык определяет только интерфейсы, интерфейс говорит что при вызове c_str() ты получишь нуль-терминированную строку, все.
Если тебе интересно как сделано конкретно в gcc там и смотри сам
https://gcc.gnu.org/onlinedocs/gcc-4.6.2/libstdc++/api/a00770_source.html
Да, у него есть поле в классе - указатель на чар, он и указывает на начало строки в памяти.
M-Way Tree - это оно?
Например, хочу передавать строку в функцию: в одном случае имя текстуры, а в другом текст. Т.е. будет две перегрузки.
А какие технологии наиболее популярны? Qt, Boost или что-то другое?
Никак, есть несколько 3рдпати либ, но они кал.
Тебя ебать не должно что тебе там слышится
не, сильные алиасы это крутотенюшка, другое дело, что они не стандартизированы, и никто не знает, как их правильно готовить. Но, оверолл, я бы с удовольствием пользовался, будь оно в стандарте
>оставив с++ без вменяемого GUI (и средств его разработки)
можно писать для UWP на стандартном с++ 17 с использованием winrt, это будет чистый с++, не расширение с++/cx
другое дело что никто этого не делает, лол, тк шарпик есть
>оставив с++ без вменяемого GUI (и средств его разработки)
При всей моей любви к сиплюсплюсу, гуи я буду писать на шарпе на Avalonia. Потому-что так проще и быстрее, хоть я и шарп знаю сильно хуже.
int counter_p = new int(7);
std::cout << counter_p << ' ' << counter_p << std::endl;
delete counter_p;
std::cout << counter_p << ' ' << *counter_p << std::endl;
На выходе получаю
0x7f9131c05900 7
0x7f9131c05900 7
Непонятно именно последнее. Память мы освободили ведь, почему нет ошибки? Т.е. даже компилятор не ругается и варнингов нету.
Звездочки съел. Сначала адрес, потом знаечние вывожу
А, уже дошло. Мы просто память системе вернули, только я думал, что указатель обнулится в таком случае.
Клоун, пидрас, троль, мразь, ублюдок, гнида, падаль, тварь, чудище, уебок, чмоня, лошок, ебаный ты чел, где этот выход находится??????????????
Андифайнед бихевиор на то и андефайнед
Клоун, пидрас, троль, мразь, ублюдок, гнида, падаль, тварь, чудище, уебок, чмоня, лошок, ебаный ты чел, какой еще библиотеке?
Тебе базу учить еще годик. Просто пиши код, старайся применять модерновый подход.
Адрес указателя и значение. Кстати, хуй сасать будешь?
>прямо сейчас объясняете как получается такой вывод без всяких умных слов
Открываешь исходники ядра и читаешь про файловые дескрипторы, а именно про stdout. Ну что ты как маленький.
Там уже нечего учить. + Я исписался. Уже 2 проекта на гите запилил, 100 звёзд суммарно получил. И Майерса этого вашего прочёл. Дальше что делать?
>Мм, работу искать?
Да не, рано ещё. Мне не поверят если я к своим 3 месяцам вката плюсану до требуемого кол-ва в вакансии. Ну и Крюгер этот ваш вроде не мучает - понимаю что многого ещё не знаю, наверняка загнусь на собесе, нужно хоть какую-то технологию освоить на более-мене серьёзном уровне.
Попробуй boost.asio освоить, напиши йоба чат, который держит 100к коннектов.
Как вариант еще - qt, но тут надо смотреть, что в твоем городе больше требуется на джунов.
>boost.asio
>qt
Как раз их в проектах и юзал, лол. Но ничего серьёзного без лютого чтения доков. Чат мб попробую. Сейчас на выходных по приколу opencv по туториалам копаю, но наверное буду qt осваивать.
>тут надо смотреть, что в твоем городе больше требуется на джунов.
Да я из Московии, тут вакансий хватает. Думал сначала тут вопрос задать прежде чем оттуда что брать.
>>885692
Не, пока не стану. Там деанон сразу будет, сори.
Ну а в архив и на файлообменник?
Это снова я.
Я не понял, как удалить void pointer? Неужели его надо преобразовать в тип, накоторый он ссылается и удалить только тогда?
Ты его через new не создавал, вот и delete нехуй писать, норкоман, блядь.
А что ты удалить то собрался? Переменную?
Чё сложно-то так?
Vcpkg + doctest, хули ты как маленький
Разве что в геймдев идти, который в России в парочке компаний и в десятке инди студий с копеечной зп?
Я РНН а кресты это мое хобби.
Устроился джуном в родном Киеве за 30к местных рейхсмарок в то время когда на всякую жсо, хпх и жава/шарпопарашу зп у похожих вакансий начинаются от 8-10к.
Бля моча банит за хохлов не приятно конечно! Аж роутер перезагрузить пришлось! Ну а по твоей теме, на плюсах же самое серьезное и интересное пишется. Нахуй блять эти ебаные сука месенджеры кому нужны будут через пару лет.
Какой язык - такой и тулинг. Несколько реально используемых компиляторов, несколько способов подключения либ, много зависящих от реализации фич, плохо скрываемая низкоуровневость - попробуй в таких условиях написать универсальный менеджер пакетов хотя бы.
Для TDD пользуем GTest от гугла. Также docker, nodejs, npm, react, .NetСore. Такие вот мы крестовики-затейники.
Есть довольно много сытных мест помимо /gd, если ты крестодед.
>шоб можно было TDD ебошить как нормальнеый чел
Условный Catch2 или Google Test проще простого установить же.
Я долбаеб просто. Пишу гуи на qt. Ну и так, по мелочи
Сажа, отклейся
блять.
Есть алгоритм на C++, там много файлов и h, и cpp, но графику гораздо удобнее прописать на python.
Как можно вызвать функцию в которую вложено дохуя других функций из питона?
Учить CLI нет ни времени, ни желания надо сдать проект в уни. Про C API знаю, но можно ли там, допустим, написать функцию, которая принимает аргументы из питона, форматирует их и вызывает нормальные cpp функции, без переписывания их всех?
как установить треду размер стека?
pthread_attr_setstacksize не помогает?
лучший gui - отсутствие gui
Пока не допилят нормальную версионность, нет. У нас в разных проектах разные версии, свои сборки с недефолтными флагами, и свои либы.
где почитать про внутреннее устройство map, set, multi, unordered?
Нам версионирование нужно только во внутренних либах, просто впилили говноскриптик, который создает новый пекедж и меняет vcpkg.json в проекте. Приятно.
Но ваще версионирование они обещали в этом месяце.
TUI.
нахуй иди, со своим страусом и сатисом
Ну вот да, в этом и главная проблема всего десктопа в линуксе.
Вообще нет, компилятор-то один и тот же. Иди профилируй.
> нет, алгоритмы чини
Там невозможно что то радикально изменить. Я посчитал примерно, какой минимум действий надо сделать и собственно его сделал
> или параллель
Так вроде нельзя на олимп проге
Значит есть какая то подъёбка, которую ты не учёл
Нет. Далеко не всегда. Там даже пишут часто, что жюри не гарантируют решение на всех языках программирования, а только на одном конкретном. Обычно это плюсы. Но может быть еще что то.
mplayer под i3
Конечно есть, в Гугле забанили?
How to parse an array through a back index injector? So that without front indexing the console, but directly directly to the cache? Maybe it's in the standard library?
Если он умеет asm->c++. Но я о таком не знаю
Обфускаторов нет, но есть методы защиты от реверса которые вполне себе работают.
ну если ты настолько шиз - скомпилируй, потом декомпилируй обратно через HexRays.
Можно ещё ради смеха через movfuscator пропустить.
Денува.
Зачем?
Иди нахуй уже.
Boost еще
Проприетарщики должны страдать
Да вроде сдедали фри урезанную
Это ведь будет выглядеть как если ты меняешь scale по х или у, его смотри.
какое новое значение bucket_count выбирает unordered_map когда решает сделать rehash?
в чём разница между deque и list?
deque - лист из векторов
Дебилушка, ты бы хоть полный текст ошибки вывалил, а не этот огрызок студийного парсера
Да
Умножение
Сдвиг
Ты обратился по адресу. В этом треде собрались настоящие профессионалы, способные обоссать кого угодно, независимо от качества и даже наличия кода. Кстати, пошел нахуй.
ебать спасибо нахуй, а это совместимо со стандартом c++17? а то не хочу быть обоссаным не по стандарту
Уже всё сделал без акка, вон даже поделился годнотой. Ебал я в этой конторе что-то заводить ещё.
Пердолинг ради пердолинга или написание кода. Что же выбрать...
Имакс лучше
по срокам: до утра 24.12.
0.2.20 Выдача банком кредитов
Описание предметной области
Вы являетесь руководителем информационно-аналитического центра коммерческого банка. Одним из существенных видов деятельности Вашего банка является выдача кредитов юридическим лицам. Вашей задачей является отслеживание динамики работы кредитного отдела.
В зависимости от условий получения кредита, процентной ставки и срока возврата все кредитные операции делятся на несколько основных видов. Каждый из этих видов имеет свое название. Кредит может получить юридическое лицо (клиент), при регистрации предоставивший следующие сведения: название, вид собственности, адрес, телефон, контактное лицо. Каждый факт выдачи кредита регистрируется банком, при этом фиксируются сумма кредита, клиент и дата выдачи.
Классы объектов
Виды кредитов (Название, Условия получения, Ставка, Срок).
Клиенты (Название, Вид собственности, Адрес, Телефон, Контактное лицо).
Кредиты (Вид кредитов, Клиент, Сумма, Дата выдачи).
Развитие постановки задачи
Теперь ситуация изменилась. После проведения различных исследований выяснилось, что используемая система не позволяет отслеживать динамику возврата кредитов. Для устранения этого недостатка Вы приняли решение учитывать в системе еще и дату фактического возврата денег. Нужно еще учесть, что кредит может гаситься частями, и за задержку возврата кредита начисляются штрафы.
>Вы являетесь руководителем информационно-аналитического центра коммерческого банка.
>кто-нибудь за 500р сделать сможет на C++?
Проорал на всю квартиру
Всё честно. Тут работы на полчаса работы. Примерно столько же получает за полчаса синьор c++.
Такую парашу никто на c++ делать не будет. C++ - язык для написания кодеков, операционных систем, браузеров.
1920x1080, 3:35
За полчаса тебе сделают только подобное видеорилейтеду.
Тут недели две уйдет только на сбор требований и составление ТЗ, выбор стека.
Не подскажешь где такое сделать? Ник и емейл не подошли, при попытке создать с этим емейлом вообще повисло к хуям.
ну чего, эту хуйню никто не напишет?
вам же легко, час работы, ну два.
в кфц на 500 сходите: вечером просрётесь.
а я работу утром сдам, все в плюсе.
если есть желание, напишите: vk.com/id535378572
Когда у меня work time я не пользуюсь social network
Никому не интересно чтобы потом высрался недоучка из за которого самолеты падают.
чел ты... мне просто нужно сдать эту работу, я ваще в айти ваше не собираюсь, шутник блять.
Ссылка на кусок курса https://youtu.be/6Gl09VEwVeQ
Пролистал бегло, ну там сложность примерно уровня hello world.
Давай за бесплатно
плачу 450р, тг @Sibir_yazva51
Больше чем за 100 не буду.
А operator<< кто за тебя писать будет?
>cout >>> listperson [0];
Уно
>https://ravesli.com/urok-133-peregruzka-operatorov-vvoda-i-vyvoda/
Дуо
>https://ravesli.com/urok-138-peregruzka-operatora-indeksatsii/
Трес
Пидорасы на макаках. Короче сделай так: cout << listperson [0];
Я безумно хочу перекат.
Дождался бы хоть 1024 поста
Щас в перший раз за несколько месяцев зашел на хабр и внезапно обнаружил, что мне с нихуя дали возможность пригласить одно тело. Не пойму за що. У меня всего одна статья с 29 голосами и рейтинг 8. Активность на хабре около нулевая последний год. У кого сейм?
ПЕРКiT
https://2ch.hk/pr/res/1888941.html (М)
ПЕРКiT
https://2ch.hk/pr/res/1888941.html (М)
ПЕРКiT
https://2ch.hk/pr/res/1888941.html (М)
ПЕРКiT
Заодно зацените, это я сам написал (почти)
Похоже у тебя шрифты системы ебнутые какие то. Это не к плюсам вопросы, а к винде
считай циклы, чем больше вложенных циклов, тем хуёвее
>>871503
Одна из немногих причин использовать goto:
https://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html
https://eli.thegreenplace.net/2012/07/12/computed-goto-for-efficient-dispatch-tables
А ты вовремя ответил
Это копия, сохраненная 28 апреля 2021 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.