Вы видите копию треда, сохраненную 3 мая 2020 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
• https://github.com/sosachbot/cppthreadhat/wiki
Ответы на вопросы:
• https://en.cppreference.com/w/
• https://www.cplusplus.com/reference/
Прошлый тред: >>1598511 (OP)
А у меня такая есть.
С одной стороны, везде СИ блядь, драйвера, память нахуй с другой - кресты с их отличными плюсами, шаблонами там, абстракцией и всей хуйней. В реальных задачах на мк хорошо выделяется часть, которая железная и часть, в которой сама суть работы.
Мой говнокод и алгоритм:
https://rentry.co/picomputation
П. С. Вычисляющий это число в десятичной системе, а не в шестднацатеричной как в формуле Бэйли — Боруэйна — Плаффа.
Дебаггером пройдись, что ты как маленький
Написал тетрис, зацените
ну там же написано, что современный и молодежный)
чуть исправил, спасибо (у тебя p не из вектора берётся, поэтому он все числа подряд вывел)
Ну так в задание же вроде сказано вывести все простые числа до 100
да эти setlocale еще со времен мамонтов в примерах учебников висят, вот их и копируют везде
Можно просто
vector primes {2};
for (int i = 3; i <= 100; ++i)
__if (find_if (begin(primes), end(primes), (int x){return i%x == 0; }) == end(primes) )
____primes.push_back(i);
malloc в C++ до 20ого стандарт - undefined behavior. Выкинь и перепиши нормально.
И какие блять ITOA когда ты пишешь на С++ - либо from_chars, либо to_string
Двачую, я когда анону картинку с решением кидал, то за auto еще терзал себя, что зря вписал, а он тут ему find_if предлагает))
Ну так то да, у нас обычная практика обучения крестам - дать подмножество из си плюс основы ООП, хотя знание стл, какбэ тоже часть языка, хотя бы 99 стандарта даёт реальный буст производительности кодера, уровня абстракции и понятности кода.
А на 17 вообще сказка, заметили там наверху что вектору тип не нужно прописывать?
>1) const в глобале = static const (только в C++)
Допустим у нас есть header.h: const int h = 5;
Если мы его включим в несколько .c файлов без защитных директив, то линковщик С выдаст multiply definition, а в С++ все скомплится на ура. А все потому, что в С++ h является локальной в каждом файле, куда подключен header. Если нужно использвать const int через extern, то при определении переменной, надо писать extern const int h= 5
>2) В C++ нет VLA.
int foo (size_t n, size_t m[n]); // Не скомплится в С++
Хотя не все комплиторы работающие с С11 могут в VLA, а вот для C99 поддерживать обязаны.
3) А еще в Си вместо темплейтов есть _Generic:
int print_int(int d) {
printf("%d\n", d);
}
#define print(d) _Generic((d), int: print_int)(d)
main() { print(123); }
4) Ну и конечно же Compound Literals. Онли С совместимый код белоу:
char foo = (char []) {"x", "y", "z"};
int i = ++(int){1};
В очько себе засунь свой wchar
https://docs.microsoft.com/en-us/windows/uwp/design/globalizing/use-utf8-code-page
Что те непонятно в "подмножество из си"? Это часть си, не весь, кресты не обязаны это реализовать, всё-таки разные языки под разные вещи.
ЗЫ я имел дело с например сишными проектами для вертолетных автопилотов и никогда там такого не видел, мож плохо искал? Хотя могли делать под конкретные компиляторы канеш.
Динахбил.
У если сишные автопилоты не используют _Generic, это не значит, что в языке си не _Generic, что за импликация от частного к общему?
>find_if (begin(primes), end(primes), (int x){return i%x == 0; }) == end(primes)
Как это называется? Как почитать?
https://pastebin.com/GSkV5Si3
itoa это функция перевода в любую систему счисления, а не в стринг.
А что у нас класс строк для utf-8 завезли чтоб без всякой ебли изкарбоки? Нет. Ну и нахуй этот utf-8 тогда.
Все равно хуйня, результат варируется от n0 пиздец как сильно, установил в 1
конечно, c++17, на дворе вообще 2к20
Чтоб как таблицу умножения знали
Зачем, ведь есть VA/Resharper C++
Спасибо анончик, давно искал подобную таблицу.
Нет смысла. Читай свежатину.
Чел, советовать целую книгу с теорией человеку, который спросил про сложность этой задачи как минимум тупо.
Ну и код они в том числе замедляют.
Допустим, у меня есть очередь, один поток постоянно проверяет пуста ли очередь, если нет, то выводит на печать первый элемент и удаляет его.
И есть поток (метод класса, если объектов много - то поток не один), который добавляет элементы в очередь.
Куда нужно ставить lock и unlock, чтобы все безопасно работало?
Ну для твоего случая есть condition_variables,
ты захватываешь мьтекс, который wait освобождаешь и лочит, когда ей приходит уведомление, а затем чекает: если предикат норм, то выход и исполняем код, а если нет - освобождаем мьютекс и ждем следующее notify
condition_variable cond;
Queue q;
...
void pull_from_queue() {
...
unique_lock<mutex> lock(mtx);
wait(lock, []{ return !q.empty() };
...
}
void add_in_queue() {
q.push_front(...);
cond.notify)one();
}
Собсна так синхронизация потоков и делается, через онли мьютексы тебе придется задержку создавать, чтобы дать захватить мьютекс функции, добавляющей в queue элемент, и все это в while
>мьтекс, который wait освобождаешь
мьютекс, который в wait освобождается и лочится, когда cond приходит уведомление
быстро фикс
Спасибо.
Ну так не будет больше этой поеботы в кроссплатформенных приложениях. One u8string to rule them all
Бамп вопросу
Стандартная библиотека крестов он называется XDD
С рейнджами это выглядит ещё короче и понятнее.
Как то вот так.
А чем wide строки не подходят для кроссплатформенности? Вся винда же работает на них и поддерживает кучу разных языков.
Это же ублюдочный стандарт с переменной длиной кодировки, до 4 байт. Utf16 наше все.
Endianess
Нет, эксепшены не влияют на оптимизации.
Единственный случай, про который я слышал — это спецификации throw() в имени функции могут как-то запороть оптимизации, потому что компилятор вставит проверки на типы брошенных исключений. Но эти спецификации уже задепрекейтили, так что пофиг.
С частотой в одну секунду на сокет приходит сообщение, отправка может произойти в любой момент времени
Сокет храниться в классе
Может, через дефолтный bool - флаг?
Сразу видно что вышку не освоил
Вроде как без noexcept в конструкторе перемещения компилятор не реализует perfect forwarding, если я верно помню. Хандельянц из PVS-Studio об этом вещал в лекциях своих.
Вот это походу и есть единственное место. Ну или в библиотеках разных могут быть безопасные версии каких-нибудь алгоритмов, если не бросаются исключения
Как же я блять говна поел, ребята, полный пиздец. Есть ли какая-то альтернатива этому дерьмищу? Оно же блять страшное как моя жизнь.
Как блять это вообще случилось-то, хлопцы? Что за нехуй?
Какие вообще альтернативы этому пиздецу есть? qmake что ли? Почему этот пиздец существует, я не могу. Блять, да по-моему свой скрипт на питоне, выдающий конечный мэйкфайл проще написать чем в этой хуйне ебаться...
Ему уж 50 лет скоро, ты что хотел? qmake какой-нибудь да, альтернатива. Существует, потому что диды не готовы перелезать ни на что новое. Ты вот какой новый софт в этом году освоил? А в прошлом?
> Существует, потому что диды не готовы перелезать ни на что новое.
Да бля, деды, идите нахуй.
> Ты вот какой новый софт в этом году освоил? А в прошлом?
Ну год тока начался, в прошлом стал активно работать с OpenMP и MPI(со вкусом буста, на чистом MPI писать я в рот ебал).
Ну это только для меня новое, а так-то конечно всё что вам надо было написано дедами. Но вот справиться с жму аутотренингом никак не могу. Ненавижу всей душой.
Неблокирующие сокеты.
Нет
А в utf16 сурогаты
Большую часть весят статик либы и pdb
Вот например у меня функция, которая делает простые вычисления в цикле (по сути просто сложение), а потом результат в виде массива отправляет в другую функцию и дает ответ. Но делается это оче долго, потому что массивов много, а если распараллелить наверное есть шанс ускорить работу. Я могу заранее задать отправную точку, откуда надо считать для каждого потока, тут проблем нет в общем, но дальше у меня вызывается следующая функция, где массив обрабатывается, и вот я не могу понять, у меня функция отдельно для каждого потока вызывается и выполняется или просто как-то последовательно? Просто из той функции у меня тоже какие-то функции вызываются и тд говнокод. Есть шанс, что это само по себе нормально работает? Я пока в тестовом режиме запустил, чет медленно всё происходит хотя я еще вывод не пофиксил, но все равно хуета. Просто пытался гуглить, там какие-то member functions, это оно или нет? Я просто хочу, чтобы у меня каждый поток делал то же самое, что и вся программа, в принципе даже можно ее несколько раз запустить, но тогда там непонятно с использованием ресурсов пеки шо будет, пока вот на 6 потоках запустил, вроде пишет 100% проца используется.
Бля, чел, подробнее давай. Асио или нативные сокеты ебёшь? Чё за дефолт bool флаг?
Если асио, то ебуш async везде
Какого нэхуй массива? Натив или вектор?
То есть у тебя целая куча массивов(массив массивов?), и ты хочешь чтобы у тебя сложение происходило одновременно?
Ну бля, дедпул тредпул делай.
А вообще, на gist/pastebin залей. Это чё, тест на работе юниорской?)))
Че за кал на втором пике, уже есть кондишн вариабл и прочее говнище
Это по учебе кста. У меня всего один вектор получается, и там в нем делается +1 к последнему элементу и дальше сдвиг, если нужен (там короче как прибавление единицы к длинному числу в N-й системе счисления, разряды которого в каждой ячейке), потом еще проверка на повторы ну может еще чего прикручу. В принципе может я там хуету написал, но я думаю мне все равно распоточивание понадобится, даже если всё переделывать придется. Потом готовый вектор отправляется в функцию, и потом цикл начинается заново, к этому же вектору снова прибавляется 1, снова отправляется в функцию и тд. А функция просто возвращает 1 или 0.
И эт самое, я там еще постоянно вектора отсылаю, вроде ж как-то можно через rvalue их не копировать каждый раз, а как-то просто быстро передавать, я там правильно написал через move?
https://pastebin.com/Gj8KJ6Ds по морде только не бей
Назови нормально переменные, комментарии поставь, что это за говно ебучее ты скинул? Скидывать такой код на ревью = плевать в ебало ревьюеру, я бы на месте учителя тебе в рот насрал.
Там просто контекст знать надо... Ну бля, мне сложно сходу на англицком выдумывать кратко и емко что конкретная переменная делает даже на русском. Ну а вообще как нормально чисто без осознания смысла, а по распоточиванию? Говорю, я могу почувствовать, что говно высрал и переделать способ получения вектора, и ту функцию могу тоже переделать, но структура та же останется. Мне вот именно почувствовать как с потоками работать в такой ситуации.
эх если бы в std::set были индексы
Не трогай кучу и мувсемантику, пока не разберешься в плюсах нормально. Делай всё на стеке, если явно не требуется другое.
Дело в том, что класс AAA большой. Если просто писать
container.data = test;
то будет использоваться copy assignment. Копирование объекта же дольше длится чем просто мувнуть его? Я знаю, что объект test после мува становится пустышкой. Короче, я создаю объект test, делаю что-то с ним, затем пихаю его в контейнер (который кроме этого еще другие поля содержит), и после этого test мне больше не нужен в этом скоупе. Поэтому я подумал, что может быть мув семантика хороший вариант? Или всё-таки лучше аллокация на куче?
Да я уже понял, но там мало настроек как-то. Вообщем установил clang-format плагин, пердолю настроечки. В идеале закос под Windows NT style хочу сделать.
Тебе же говорят - не лезь, если не разобрался.
Как минимум, задумайся, что лучше - создать объект на месте в куче или вызвать конструктор, а потом переместить объект куда-то?
Хотя, теоретически, компилятор увидит, что ты дурачок и
Object a();
smt.a = std::move(a);
Превратит в
smt.a = object(a);
>объект test после мува становится пустышкой
Посмотри, что такое std::move, там просто рвссылка навешивается, специально, чтобы выбрался не копи конструктор, а мув и если ты мув конструктор или там оператор присваивания не сделаешь таким, чтобы он мувал, то никакого мува не случится.
Также был бы рад каким-нибудь годным ресурсам для начинающих. Всем спасибо.
Ничто не мешает мувать объект со стэка. Например
std::vector<XXX> aaaa(100500);
foo(std::move(aaaa));
Абсолютно валидный код.
Это ответственность разработчика класса предоставить правильный мув-конструктор.
Оба хуже. Первый делает непонятно что, второй течет ресурсы и приводит к битым указателем.
Поскольку ты не очень понимаешь, что делаешь, то напиши
class AAAA
{
std::unique_ptr<XXX> data;
}
мув-конструктор сгенерится автоматически если ты не определяешь своих конструкторов.
C++ за 21 день, Конора-Макфлая
Страуструп, книги Майерса и Саттера, может быть Вандервуда, потом всякие статьи по современным стандартам.
В С++ нельзя просто взять и вкатиться
Какие доводы использовать C++ вместо pure C? Си простой, компактный. C++ монструозный, одна только спека сколько там сейчас страниц, 3000?
Пока графика не нужна.
>>11130
Мне не нужны тысячи абстракций на все случаи жизни. Я все равно их все никогда не освою. И я сторонник минимализма. Керниган писал, что Си хорош тем, что это маленький язык, им можно быстро овладеть, и реально знать и использовать все возможности языка. В C++ такое невозможно. Даже создатели языка не знают всех его особенностей. А уж экосистема там наверное вообще гигантская. Зачем нужен комбайн с миллионом функций, если будешь пользоваться только десятком?
Ты не териотезируй, ты пиши код. Когда ты поработаешь над достаточно большим проектом, сам поймешь зачем нужны шаблоны, классы, виртуальные функции, исключения, конструкторы-деструкторы и прочее.
>Пока графика не нужна.
>Какие доводы использовать C++, если мне в моей песочнице ничего из С++ не нужно. Отвечайте быстро!
Никаких, ты прав. Вообще не понимаю, зачем пользоваться языками программирования, если я могу и руками пасьянс разложить.
Кто нибудь проходил специализацию от Яндекса на курсере "Искусство разработки на современном C++"? Стоит ли проходить платно? Один месяц стоит 4900 руб. Курсов 5 штук. Думаю один курс за месяц можно и не пройти. Тем более последующие курсы наверняка сложнее предыдущих. Выходит что пол года нужно времени, если не больше. Итого минимум 30000 руб. Стоит оно того?
Я еще не совсем понимаю что входит в платную подписку. Задачи точно входят. Но задачи, их же можно самому порешать. Там же название задачи написано, можно нагуглить условия. В общем, если кто проходил платно, расскажите что там к чему, годные курсы или нет.
>Зачем нужен комбайн с миллионом функций, если будешь пользоваться только десятком?
Фи, амикошонство, люмпенпролетариат!
Я боюсь погрязнуть в теории. Ведь фич очень много, придется все это изучать, потом практиковать. Боюсь что долго придется осваивать конструкции языка.
>>11139
Лишние абстракции это зло. Вы сейчас прёте против этого закона, что противоречит программированию как инженерной дисциплине. Реальные доводы будут, факты какие-то, хотя бы развернутое мнение, собственный опыт? Я не для троллинга или срача спрашиваю. Мне хочется понять вашу мотивацию. Свою я высказал. Пока побаиваюсь C++ из-за его монструозности. Может это только предрассудок, не знаю.
Ну да, ты к чему это? В своём посте я вроде не писал ничего про стек или не стек, ты точно мне ответил?
Чем больше приложение, тем больше там вылазит всяких моментов, которые на чистом С никак не контролируются.
Лишние абстрации это лишняя сложность. Обычно это случайная сложность, когда проектировщик не нашел способа, не смог сделать простым. В инженерии борьба со сложностью ключевая цель. Иначе смысл инженерии теряется. Принципы KISS постулируют это. И не только они.
>Чем больше приложение, тем больше там вылазит всяких моментов, которые на чистом С никак не контролируются.
Можно пример? Хочу понять чего это касается, ручного управления памятью, недостаточным уровнем абстракции, недостаточным количеством инструментов или библиотек для разработки, или может что-то еще?
>В инженерии борьба со сложностью ключевая цель.
Ещё раз: ты это где-то прочитал или из своей головы вещаешь?
https://www.google.ru/search?newwindow=1&hl=ru&tbm=bks&sxsrf=ALeKk01W0sVUhgdb8M8FHI9N4Qe9kuQc2Q:1582353350113&ei=xstQXqzMBrKEmwXj2bPYDw&q="борьба+со+сложностью"&oq="борьба+со+сложностью"&gs_l=psy-ab.3...46683.48503.0.49002.2.2.0.0.0.0.132.262.0j2.2.0....0...1c..64.psy-ab..0.0.0....0.-q4b9HHEjMQ
>Принципы
Ты путаешь принцип с законом. Принципы могут быть разные, каждый со своими достоинствами и недостатками. Например, вот широкоизвестное эссе о принципах построения опенсорс программ: базарном и кафедральном. Оба принципа используются и по сей день.
Нет шаблонов и перегрузки -> код нужно копипастить 100500 раз и называть func_int, func_double, func_char, да, для него. На самом деле наверняка это решается через касты к воид звёздочка и обратно,но тут возникает множество опасностей отстрела ноги.
На С++ можно писать в стиле С, если хочется, но при этом пользоваться всякими дополнительными плюшками, типа перегрузки операторов, RTTI, и т.д.
>Принципы KISS
Так именно из этих соображений появились абстракции, да, в маленьком проекте кажется на чистом си писать проще, но потом оказывается, что плюсы сколь угодно масштабируются и в миллионнострочном проекте писать на плюсах не сложнее(имея некоторый опыт), чем в лабе1. А в си код начинает схлопываться под собственной тяжестью, программисту становится тяжело удержать в голове что делает данный код, его становится тяжело поддерживать, потом единственный бородач, который в нём что-то понимал, уходит на пенсии и имеем легаси, в котором никто нихуя не понимает и стремится запихнуть его под диван.
"Борьба со сложностью" — это бесконечно абстрагируемое понятие. Назови одну деятельность, которая не занимается "борьбой со сложностью". А так-то конечно, да. Инженер сделал мост, чтобы он не падал — поборол сложность переправы через реку. А потом хирург вырезал аппендикс — поборол сложность выжить с перитонитом. А потом кондуктор взял деньги за билет — поборол сложность поддержки транспортной инфраструктуры.
Извините, а назуй тогда Си нужен в т.ч. в embedded разработки, когда можно писать на Си с классами, с перегрузками и вот этим всём?
>в си код начинает схлопываться под собственной тяжестью, программисту становится тяжело удержать в голове что делает данный код, его становится тяжело поддерживать
Из-за чего? Чего там не хватает? Можно конкретику?
Классов, шаблонов, виртуальных функций, наследования, деструкторов.
А, ты хотел сказать, что при создании указателя на функцию надо знать аргументы к этой функции? Это да. Ты так написал, будто тип функции (тип возвращаемого значения) зависит от типов аргументов.
Если проектировщик создал систему для решения задач, но она оказалась сложнее в использовании чем решаемые задачи, то это разве можно считать решением задачи? Если язык настолько сложный, что требует больше времени и сил на его освоение, чем решение задачи другим языком, то зачем нужен такой язык? Суть языка в том, чтобы просто решать сложные задачи, а не сложно решать простые, или сложно решать сложные. Вот это борьба со сложностью. В этом суть, чтобы в конечном итоге решать задачи просто. Это суть инженерии.
Да, но разные функции могут возвращать разные значения. Для int передаешь одну фунцию, для других типов другую.
>Извините, а назуй тогда Си нужен в т.ч. в embedded разработки, когда можно писать на Си с классами, с перегрузками и вот этим всём?
Вот это я пытаюсь выяснить. Пока адепты внятных доводов не приводят.
То есть тебе под каждый тип нужна функция. И чем это проще, чем func_int, func_double, func_char... ещё 100500 функций.
Тем что главная функция не зависит от других. Барьеры абстракций же. Слои не зависят друг от друга. Если тупо под каждый тип писать отдельную функцию, это будет просто копипаста.
>Если проектировщик создал систему для решения задач, но она оказалась сложнее в использовании чем решаемые задачи, то это разве можно считать решением задачи?
Да. Пример:
решаемая задача: сделать табурет
простое решение: принести пенёк
решение проектировщика: выкачать из земли нефть, очистить её, полимеризовать в пластик, создать линию по отливке табуретов из пластика, сгенерировать электричество, подключить линию к электричеству, доставить сырьё, и наконец создать табурет.
Что сложнее?
Какая главная функция, вот в плюсах ты пишешь
template<class T>
T sum(const T& a, const T& b)
{ return a + b; }
Как ты это обойдёшь, не создавая кучу функций под все типы которые складывать можно?
Абсурдный пример
А, в С11 шаблоны появились? Прикольно. Нет, ну если в Си и дальше будут завозить фичи плюсов, то и спорить будет не о чем.
>Лишние абстрации это лишняя сложность.
В крестах набором же, добавляется больше с каждым стандартом, но что было раньше наоборот легче и внезапно быстрее
Для embedded наверное есть какие-то преимущества, типа стандартная библиотека не такая большая, и легче предугадать, как компилятор сгенерит код. Или разрабы просто не знают, на каком ещё утюге им придётся запускать своё творение, и сразу берут по минимуму.
Или если библиотеку пишешь, или прослойку между языками, то Си может пригодиться. Ну и для копания в линуксах и прочих опенсорсах.
А в остальном, я не знаю, зачем Си ещё нужен.
LLVM ежжи
Я вот думаю почему коммитет по си до сих пор не внесёт 2 маленьких, но удобных изменения - к структурам можно обращаться как в С++, не обертывая typedef'ом и
добавить uint для соращение unsigned int, и все блять, язык в 10 раз удобней станет
> Лишние абстракции это зло.
Тред Go ниже. Возвращайся когда заебёт самописная кодогенерация, RTTI на говне и рефлекшонах, и отсутсвие абстракций в языке, приводящее к их переизобретению в коде. Это не критика Go, многим заходит писать и так.
>>11132
А теперь подумай, когда он это писал и с чем сравнивал? Си хорош когда у тебя нет вариантов, а иначе можешь пойти в ядро и изучать как они эмулируют плюсовые абстракции.
PS. Не бойся изучать новое, бойся зацикливаться на старом - вылетишь с рынка быстрее чем успеешь сказать котлета.
Слишком абстрактно станет.
>изучать новое
Я вот больше боюсь забыть старое, поэтому додрачиваю многие вещи довольно долго.
Хуйнёй страдаешь.
> Сказал крестовый пердун.
Ты как говоришь будто я не знаю питон, go, js и pl/sql на уровне достаточном для поиска работы.
Давай там, не тормози.
>В классе есть сырые указатели.
Но туда же кроме nullptr ничего не записали? Тогда можно.
Кстати, подчеркивания перед аргументами ставить не обязательно. Можно писать прямо
Font::Font(std:string fontPath) : fontPath(fontPath)
- компилятор поймет, что один fontPath - это член класса, а другой - аргумент.
Бросание исключений в конструкторе абсолютно легитимно, следи только, чтобы они бросались до всяких new и тд, чтобы при раскрутке не было утечек, а лучше вообще используй только смарт поинтеры, это требует совсем небольшой привычки, зато про утечки в 99% случаях можешь забыть. В то же время бросать исключения в деструкторе абсолютно нелегитимно, никогда так не делай, если интересны подробности можешь погуглить про ключевым словам stack unwinding, libunwind, libcxxabi, чтобы понять как это вообще всё работает
https://monoinfinito.wordpress.com/series/exception-handling-in-c/
Стараюсь использовать смарт поинтеры где могу, но в СДЛ сразу ловлю исключение, если использую unique_ptr для его объектов
Скорее всего там нужен shared_ptr, посмотри когда юзается шаред, когда юник, когда вик.
Конкретно про СДЛ не скажу, но вообще, когда получаешь объекты от других библиотек, то у них обычно процедура освобождения тоже бывает какая-то библиотечно-специфичная, и для них просто так нельзя вызывать delete.
Возможно, тебе нужен смарт поинтер с кастомным deleter-ом.
Ну ок, значит мув пока не трогать, хотя я поэксперементировал и оно работало, (видимо как ты написал?) Можешь дать хороший пример или статью про мув?
А если вот так сделать? container.data = std::move(AAA()); Тоже хуйня под капотом происходит?
> вывести все простые числа до 100
Не благодари.
// This file is a "Hello, world!" in C++ language by GCC for wandbox.
#include <iostream>
#include <cstdlib>
template<std::size_t... Args>
struct NotDivideTo;
template<std::size_t N, std::size_t P, std::size_t... Args>
struct NotDivideTo<N, P, Args...> : public NotDivideTo<N, Args...>
{
static constexpr bool value = N % P != 0 && NotDivideTo<N, Args...>::value;
};
template<std::size_t N>
struct NotDivideTo<N>
{
static constexpr bool value = true;
};
template<bool b, std::size_t K, std::size_t... Args>
struct NextPrimeImpl;
template<std::size_t K, std::size_t... Args>
struct NextPrimeImpl<false, K, Args...>
{
static constexpr std::size_t value = NextPrimeImpl<NotDivideTo<K + 1, Args...>::value, K + 1, Args...>::value;
};
template<std::size_t K, std::size_t... Args>
struct NextPrimeImpl<true, K, Args...>
{
static constexpr std::size_t value = K;
};
template<std::size_t... Args>
struct NextPrime
{
static constexpr std::size_t value = NextPrimeImpl<false, Args...>::value;
};
template<std::size_t... Args>
struct PackedPrimes{};
template<bool b, std::size_t N, std::size_t... Args>
struct PrimesImpl;
template<std::size_t N, std::size_t... Args>
struct PrimesImpl<true, N, Args...>
{
using value = PrimesImpl<NextPrime<Args...>::value < N, N, NextPrime<Args...>::value, Args...>::value;
};
template<std::size_t N, std::size_t Head, std::size_t... Args>
struct PrimesImpl<false, N, Head, Args...>
{
using value = PackedPrimes<Args...>;
};
template<std::size_t N>
struct Primes
{
using value = PrimesImpl<true, N, 2>::value;
};
template<std::size_t s, std::size_t... Args>
void print_pack(const PackedPrimes<s, Args...>&)
{
std::cout << s << " ";
print_pack(PackedPrimes<Args...>());
}
void print_pack(const PackedPrimes<>&)
{
std::cout << std::endl;
}
int main()
{
print_pack(Primes<100>::value());
}
> вывести все простые числа до 100
Не благодари.
// This file is a "Hello, world!" in C++ language by GCC for wandbox.
#include <iostream>
#include <cstdlib>
template<std::size_t... Args>
struct NotDivideTo;
template<std::size_t N, std::size_t P, std::size_t... Args>
struct NotDivideTo<N, P, Args...> : public NotDivideTo<N, Args...>
{
static constexpr bool value = N % P != 0 && NotDivideTo<N, Args...>::value;
};
template<std::size_t N>
struct NotDivideTo<N>
{
static constexpr bool value = true;
};
template<bool b, std::size_t K, std::size_t... Args>
struct NextPrimeImpl;
template<std::size_t K, std::size_t... Args>
struct NextPrimeImpl<false, K, Args...>
{
static constexpr std::size_t value = NextPrimeImpl<NotDivideTo<K + 1, Args...>::value, K + 1, Args...>::value;
};
template<std::size_t K, std::size_t... Args>
struct NextPrimeImpl<true, K, Args...>
{
static constexpr std::size_t value = K;
};
template<std::size_t... Args>
struct NextPrime
{
static constexpr std::size_t value = NextPrimeImpl<false, Args...>::value;
};
template<std::size_t... Args>
struct PackedPrimes{};
template<bool b, std::size_t N, std::size_t... Args>
struct PrimesImpl;
template<std::size_t N, std::size_t... Args>
struct PrimesImpl<true, N, Args...>
{
using value = PrimesImpl<NextPrime<Args...>::value < N, N, NextPrime<Args...>::value, Args...>::value;
};
template<std::size_t N, std::size_t Head, std::size_t... Args>
struct PrimesImpl<false, N, Head, Args...>
{
using value = PackedPrimes<Args...>;
};
template<std::size_t N>
struct Primes
{
using value = PrimesImpl<true, N, 2>::value;
};
template<std::size_t s, std::size_t... Args>
void print_pack(const PackedPrimes<s, Args...>&)
{
std::cout << s << " ";
print_pack(PackedPrimes<Args...>());
}
void print_pack(const PackedPrimes<>&)
{
std::cout << std::endl;
}
int main()
{
print_pack(Primes<100>::value());
}
Ты просто не можешь в шаблоны.
Пиздец, какой же уебищный синтаксис у этих последовательностей. Недавно потребовалось удалить последний элемент последовательности для последующей передачи в другую функцию... Это просто пиздец. Вместо какой-нибудь функции типо pop пришлось строит рекурсию через несколько структур в 30 строк.
Вы че блять, сектанты?
В теории ты мог бы через std::tuple как-то выкрутиться, но надо смотреть конкретный пример.
Вот так можно например выкрутиться
// This file is a "Hello, world!" in C++ language by GCC for wandbox.
#include <iostream>
#include <cstdlib>
#include <tuple>
template<class Tuple, std::size_t... I>
auto remove_last_impl(const std::index_sequence<I...>&, const Tuple& t)
{
return std::make_tuple(std::get<I>(t)...);
}
template<class... Args>
auto remove_last(const std::tuple<Args...>& t)
{
return remove_last_impl(std::make_index_sequence<sizeof...(Args)-1u>{}, t);
}
template<class Tuple>
void print_size(const Tuple&)
{
std::cout << std::tuple_size<Tuple>::value << std::endl;
}
int main()
{
std::tuple<int, char, double> t(1, 'a', 1.23);
auto result = remove_last(t);
std::cout << std::get<0>(result) << std::endl;
std::cout << std::get<1>(result) << std::endl;
print_size(result);
}
Вот так можно например выкрутиться
// This file is a "Hello, world!" in C++ language by GCC for wandbox.
#include <iostream>
#include <cstdlib>
#include <tuple>
template<class Tuple, std::size_t... I>
auto remove_last_impl(const std::index_sequence<I...>&, const Tuple& t)
{
return std::make_tuple(std::get<I>(t)...);
}
template<class... Args>
auto remove_last(const std::tuple<Args...>& t)
{
return remove_last_impl(std::make_index_sequence<sizeof...(Args)-1u>{}, t);
}
template<class Tuple>
void print_size(const Tuple&)
{
std::cout << std::tuple_size<Tuple>::value << std::endl;
}
int main()
{
std::tuple<int, char, double> t(1, 'a', 1.23);
auto result = remove_last(t);
std::cout << std::get<0>(result) << std::endl;
std::cout << std::get<1>(result) << std::endl;
print_size(result);
}
Не помню конкретную лекцию, но посмотри все, полезно будет, ищи: pvs studio c++.
Насчёт std::move(object()); - здесь object() уже rvalue, а мув из lvalue делает rvalue.
И, если не ошибаюсь, если сделать
void func(object&& x){}
object smt();
func(std::move(smt));
smt.mthd() //будет ошибка
Так как память, выделенная под smt отдается в функцию и там же уничтожается при выходе из нее.
Слово*
> Так как память, выделенная под smt отдается в функцию и там же уничтожается при выходе из нее.
Очнись, в c++ не завезли destructive move
method
Все проще, есть одна &, то &, нету одной &, только &&, то &&. При этом int& & -> int&
Что проще? На пикче то же самое написано.
>Тут будет && && и это схлопнется в &&, смотри скрин.
И что это значит? Я вообще не врублюсь.
Погугли по ключевым словам, выше писал.
Ну если наполнение туплов, хэши или что там, в компилетайме считается, то и тупл компилетаймовый будет.
Вот так пытаюсь сделать (на пике)
Получаю ошибку C2027(использование неопределенного типа SDL_Texture) & C2338(can't delete an incomplete type);
ftexture это поле класса, выглядит так
std::unique_ptr <SDL_Texture> ftexture = nullptr;
Можно ли вообще указать удалитель при создании, чтобы не писать его постоянно в make_unique?
>The correct answer - as stated by Herb - is that according to the standard a constexpr function may be evaluated at compiler time or run time unless it is used as a constant expression, in which case it must be evaluated at compile-time.
https://isocpp.org/blog/2013/01/when-does-a-constexpr-function-get-evaluated-at-compile-time-stackoverflow
В общем если у тебя constexpr auto result = evaluate_hashes(), то гарантированно будет считаться в компилетайме.
Ну да можно конечно вручную констэкспр писать, но тогда код по раздувается и по уебански выглядит.
Извини братан если обидел. Я че т не то сморозил по пьяни. Ты все правильно говоришь.
Ну это явно лучше чем как ты говорил, 30 рекурсий через рекурсии или там аргументы в шаблон засовывать. Ну бля, таплы для того и были придуманы, типа вот у тебя есть там ArgsA... и ArgsB... и из-за той же проблемы, что они слипаются, нельзя написать template<class A, class... ArgsA, class... ArgsB...> и вообще ничего нельзя написать после вариадик темплейта, юзаются два тапла tuple<ArgsA...>, tuple<ArgsB...>, они как раз и нужны для обхода подобных ситуаций, я думаю скорее всего можно там сделать через тапл и это будет относительно норм выглядеть.
Хотя хуй знает, может и правда уебански будет, я ж конкретный код не видел, забей.
>>а мув из lvalue делает rvalue.
>Тут будет && && и это схлопнется в &&, смотри скрин.
Щас бы, в 2k20, путать rvalue и rvalue reference… ♂️
@chico: But programmers can rely on constexpr being fully compile-time in the cases where it matters -- to do compile-time things like initialize array sizes or instantiate templates. If they try to invoke something that isn't compile-time, the compiler will let them know.
In all other cases (using constexpr in places the language doesn't require to be compile-time), it doesn't matter. Programmers don't need to rely on anything else being done at compile vs. run time, and can't anyway because of optimizations -- the point of optimization is that the compiler can move work around, including in either direction from/to compile time to/from run time, and all such optimizations are legal as long as a well-formed program can't tell the difference (have different output) -- so it doesn't matter because the program is indistinguishable.
I could imagine someone may want to force a variable to be written to ROM (say), but that (a) is rarely necessary or interesting in practice (I can't remember if I've seen a true need for it myself), (b) is handled using compiler- and platform-specific extensions if at all (e.g., optimization levels and related controls), and (c) isn't specific to constexpr (e.g., it has always been the case that a compiler "might" put a static const int variable into ROM, and that's often cited as the canonical reason why casting away const is undefined behavior -- it may not be physically possible to mutate the const object).
Bjarne Stroustrup said on Jan 14, 2013 08:58 PM:
It seems that I was too terse and caused confusion. Sorry. The correct answer - as stated by Herb - is that according to the standard a constexpr function may be evaluated at compiler time or run time unless it is used as a constant expression, in which case it must be evaluated at compile-time. To guarantee compile-time evaluation, we must either use it where a constant expression is required (e.g., as an array bound or as a case label) or use it to initialize a constexpr. I would hope that no self-respecting compiler would miss the optimization opportunity to do what I originally said: "A constexpr function is evaluated at compile time if all its arguments are constant expressions."
@chico: But programmers can rely on constexpr being fully compile-time in the cases where it matters -- to do compile-time things like initialize array sizes or instantiate templates. If they try to invoke something that isn't compile-time, the compiler will let them know.
In all other cases (using constexpr in places the language doesn't require to be compile-time), it doesn't matter. Programmers don't need to rely on anything else being done at compile vs. run time, and can't anyway because of optimizations -- the point of optimization is that the compiler can move work around, including in either direction from/to compile time to/from run time, and all such optimizations are legal as long as a well-formed program can't tell the difference (have different output) -- so it doesn't matter because the program is indistinguishable.
I could imagine someone may want to force a variable to be written to ROM (say), but that (a) is rarely necessary or interesting in practice (I can't remember if I've seen a true need for it myself), (b) is handled using compiler- and platform-specific extensions if at all (e.g., optimization levels and related controls), and (c) isn't specific to constexpr (e.g., it has always been the case that a compiler "might" put a static const int variable into ROM, and that's often cited as the canonical reason why casting away const is undefined behavior -- it may not be physically possible to mutate the const object).
Bjarne Stroustrup said on Jan 14, 2013 08:58 PM:
It seems that I was too terse and caused confusion. Sorry. The correct answer - as stated by Herb - is that according to the standard a constexpr function may be evaluated at compiler time or run time unless it is used as a constant expression, in which case it must be evaluated at compile-time. To guarantee compile-time evaluation, we must either use it where a constant expression is required (e.g., as an array bound or as a case label) or use it to initialize a constexpr. I would hope that no self-respecting compiler would miss the optimization opportunity to do what I originally said: "A constexpr function is evaluated at compile time if all its arguments are constant expressions."
>In particular, std::move produces an xvalue expression that identifies its argument t. It is exactly equivalent to a static_cast to an rvalue reference type.
Чел...
И к чему ты это процитировал?
По-моему, твоё упоротство только подтверждает, что ты не отличаешь rvalue от rvalure reference.
Проходил. но тогда он только выходил и я покупал отдельно каждый курс. Первые два достаточно простые. Красный повеселей. Коричневый сложен, черный не стал проходить, там подписка началась.
В общем курс неплохой. Но следует учесть, что у меня было за плечами несколько прочитанных книг, мини проекты и на работе я перекатился в разраба.
По сложности задач, зависит от времени и терпения. Некоторые я решал неделя+, другие за пол часа. Финалки достаточно сложные. Готовься к разрыванию очка на грейдерах.
ретурн тип std::move(T&&) это std::remove_reference<T>::type&&, что же это за тип, хммм...
Что за тип — ясно.
А при чём тут reference collapsing rule и что и как func "навешивает" — нет.
При том, что есть функция f(T&& a) и мы туда отдаём переменную типа object&&, поэтому T будет object, получается я лох, а ты прав, прости меня, дурака.
>При том, что есть функция f(T&& a) и мы туда отдаём переменную типа object&&
В `std::move(object())`, `object()` это
1. Не переменная, а выражение
2. Тип которого `object`, а не `object&&`
У тебя все правильно с делетером. Тут проблема с тем что SDL_Texture в хедере специально не определен, чтобы скрыть внутреннюю имплементацию, а unique_ptr разыменовывает указатель этого типа, например в методе get. Так можешь начать писать свою обертку для таких случаев.
Я про func писал, а не про мув, в func мы передаём rvalue reference object&&, я жопой смотрел, думал там что-то типа func(object&& &&), то есть сам тип object&&.
>в func мы передаём rvalue reference object&&
В выражении `std::move(object())`, у `std::move` возвращаемый тип `object&&`, а у самого выражения тип `object`.
static_assert(std::is_same<object, decltype(std::move(std::declval<object>()))>::value,"");
статик ассершн файлед
static_assert(std::is_same<object, decltype(std::move(std::declval<object>()))>::value,"");
всё ок
Так что здесь вы неправы.
Разметку съело, в общем проходит проверку только с object&&
Ты бы почитал, как тип, обозначаемый `decltype(e)`, получается из типа выражения `e`.
Потому что так надо. Можешь в макрос завернуть, если тебе такой синтаксис не нравится.
> Почему пидорас на компиляторе не может это заранее подсчитать и подставить готовый хеш?
Ты пробовал аргумент std::string_view constexprом сделать?
Даа.
Можно конкретнее?
Хотя может попробуешь cout вытащить оттуда? Посчитать в констекспр, а потом уже печатать отдельно.
А какая разница константный он или нет? Зачем вшивать в бинарь call GetHash когда можно просто mov rax, 0x228?
А, блин, там тот же принцип, что и когда мы например f(T& t) по ссылке получаем, то внутри функции это уже просто T?
>А какая разница константный он или нет?
Ну больше там не на что ругаться как мне кажется. А тут может он не понимает, что его можно оптимизировать.
Ясно, ну неплохо я так обосрался.
_LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
size_type length() const _NOEXCEPT { return __size; }
template<typename _CharT>
_GLIBCXX14_CONSTEXPR std::size_t
char_traits<_CharT>::
length(const char_type* __p)
{
std::size_t __i = 0;
while (!eq(__p[__i], char_type()))
++__i;
return __i;
}
static _GLIBCXX_CONSTEXPR bool
eq(const char_type& __c1, const char_type& __c2)
{ return __c1 == __c2; }
Ну вот вроде почти так написал, все равно не хочет при компиляции считать. А вы кстати проверяли как гцц компилирует? Может он так же в рантайме считает.
Мне в принципе пох. Я писал на множестве разных языков, включая большое количество функциональных. Это меня не пугает. Дело в том, что боюсь погрязнуть в байтоебстве. Раньше то я вручную памятью не управлял. И с другой стороны стоит прагматик, и говорит: нахой оно тибе нужна? Смысл в чем?
И я не могу ответить на эти вопросы. Даже самому себе. Дело в том, что сук тянет к плюсам. Почему не знаю. Просто тянет. Наверное какие то детские мечты. Помню один чувачок с моей группы, а я учился на программиста, рассказывал, что C++ язык для "Ылитки". Я конечно в это поверил тогда. Потом уже, когда писал код на разных языках, включая Хаскелл, я смеялся над этой шнягой. Но теперь не знаю, хочется закрыть этот ебаный гельштат.
Нет, не проверял.
Слушай, вроде как std::move(...) это xvalue expression, и что, можешь тыкнуть где написано про то, что у xvalue тип становится не T&& а T? А лучше вообще на статью, где объяснено про xvalue, glvalue, prvalue и тп.
> Слушай, вроде как std::move(...) это xvalue expression, и что, можешь тыкнуть где написано про то, что у xvalue тип становится не T&& а T?
https://timsong-cpp.github.io/cppwp/n4659/expr#5
Спасибо.
Алсо нашёл годное объяснение, может кому пригодится тоже.
http://www.stroustrup.com/terminology.pdf
Спасибо.
МунлаеSFINAE пойми да посмотри пару примеров ,"метапрограммирование с++ шаблоны" можешь погуглить, на степике есть курс(бесплатный) https://stepik.org/course/3206/promo, там ближе к концу что-то разбирается, ещё неплохо помогает на хаскеле каком пописать, потому что там те же принципы, а вообще это был пример как сделать простую задачу сложным способом, в реале 95% всей этой хуйни никогда никем не используется, а то и вообще могут ебало набить за подобную хуйню в коде, как заметил анон выше>>11635, потому что почти всегда всё можно сделать проще, читабельнее и тд
Ты говно, троль или дебил кукаретик без опыта.
>Что такое рефлекшоны?
Что бы как в qt ты мог в рантайме узнавать информацию об классах, делать циклы по енумам, узнавать кем был вызван метод и т.п. В стандарте это все пока на уровне планов.
char ch = new char[20];
ch = (char)"full time";
if (ch == "full time") cout << "true\n";
Выдает true, a
cin.getline(ch, 20);
if (ch == "full time") cout << "true\n";
falce? Как это работает?
То есть, "full time" хранится, как константная переменная, но вторая "full time" не может же иметь тот же адрес памяти? Почему тогда true выдает.
От компилятора зависит, можно включить объединение строк и будет тот же адрес.
Спасибо.
>>12352
Хуйню пишете.
char ch = new char[20]; // Выделяется кусочек памяти на 20 чаров, с адресом первого байта например 0х4242. Так что ch==0x4242
ch = (char)"full time"; // Берется адрес первого байта статической константы, например 0х0013, и перезаписывается в ch вместо старого значения. Теперь ch==0x0013. Первоначально выделенная память с началом в 0x4242 и размером 20 байт при этом становится недоступной и течёт.
if (ch == "full time") cout << "true\n"; // Ну тупо сравниваешь значение указателя c тем, что только что присвоил. Очевидно 0x0013==0x0013.
А вот во втором случае надеюсь последние две строчки не продолжение той же программы, иначе это уже совсем пизда всё по-другому:
char ch = new char[20]; // Так же, как в прошлый раз выделяется память. ch==0x4242.
cin.getline(ch, 20); // Читается строка и сохраняется в участок памяти, на который указывает ch. Сам ch продолжает указывать на ту же память, т.е. ch==0x4242
if (ch == "full time") cout << "true\n"; // За каким-то хуем сравнение адреса первого байта статической константы с адресом первого байта выделенной памяти. Очевидно 0x4242!=0x0013.
Вообщем сделал я эти кастомные удалители для SDL, если кому-то интересно как это сделать могу скинуть гитхаб.
Там перед getlune нет выделения, да и любом случае все неправильно. Если надо строки сравнить, то надо либо strcmp либо std::string юзать.
А никак блядь! Напиши лучше на жабе
Какая ламповая проперженная табуретка!
Мне студия нравится больше, чем креатор. Там даже расширение для Qt есть специальное. Не могу только понять как там проект под андроид создать. За 3 дня перерыл весь интернет и не один способ не работает
Qt - монструозная хрень, требует кодогенерации, нет нормального дизайнера
wxWidgets - в общем норм, есть некоторые корявости вроде обработки событий, нет дизайнера (есть какие-то сторонние тулзы, но ну их)
WinForms - очень простые в использовании, есть дизайнер, по сути дельфи от майкрософта. Но нужно будет делать врапперы вокруг плюсового кода.
MFC - вроде как легаси ад, а вроде как и нет. Есть кое-какой дизайнер. Отлично интегрирована в студию, проблем с вещами вроде файлов ресурсов не будет.
GTK - не юзал, по отзывам имеет нестабильный API, требует танцев с бубном чтобы юзать под виндой.
>нет нормального дизайнера
Лолват? Там на виджетах считай теже винформс, только непривычные, а с qml там по-моему даже удобнее чем в студии с xaml.
> Qt - монструозная хрень, требует кодогенерации, нет нормального дизайнера
this.
Лучше уж код генерировать, чем дрочить MESSAGE_MAP_BEGIN. Если ещё плагин для студии поставить, то вообще ноль ебли.
И по поводу монструозности - это скорее всего хромиум (спасибо веб-блядям). По факту тебе нужны только Qt5Core.dll, Qt5Gui.dll и Qt5Widgets.dll (все вместе точно до 50мб). Ну и pdb + дебаг версии этих библиотек.
>Под виндоус
а кроме этого?
Что делать тулза будет? Какие функции будет? Ну там - базы данных, графики, порты ввода/вывода, сетевые функции, работа со звуком?
Сколько человек будет использовать? Сколько лет, ты планируешь, она проработает? Какие версии винды? Будет ли продаваться (т.е. коммерч. лиценз)?
Будет ли это однократная поделка или допиливаться месяцами/годами? Сколько человек будет участвовать в разработке? Придется ли кому-то после тебя её дорабатывать?
>монструозная хрень
На сам деле там есть утилита для деплоя приложух, которая сама тебе выбирает только те длл которые требуются. Получается в районе 50-150 мб у меня обычно.
Редактор для самодельного игрового движка. Продаваться не будет. Будет использоваться и разрабатываться потенициально лет 20, поэтому стабильность важна (а MFC стабилен как кладбище). Писать буду я один скорее всего.
>>12914
Например, свой компонент так просто не добавишь через дизайнер, да и вообще в нем большинства компонентов нет. XAML тоже плох, но я и не планировал WPF использовать.
>>12939
Я сколько не пробовал юзать QT в студии, у меня всегда что-то ломалось. То кодогенерация, то обновления файла формы в дизайнере не подхватывались. Чтобы те же файлы ресурсов прикрепить к бинарнику тоже нужны кастомные шаги сборки.
Вроде как Qt очевидный выбор, но на моем опыте с ней требуются некоторые пляски с бубном. MFC ископаемая, но она в студии работает из коробки.
>>12974
Тут больше имелся размер самой библиотеки - она скачивает гигабайт 10, наверно, при установке, и там есть вообще все на все случаи жизни.
>Получается в районе 50-150 мб у меня обычно.
Вообще это очень много, для простой десктопной программы.
>скачивает гигабайт 10,
Я хз, у нас анально огороженный инет на виртуалках, кют ставим из оффлайн инсталлятора (на сайте есть такая опция, но в жопе).
В общем все советуют Qt. Попробую его и посмотрю как пойдет
Qt охуенна, я бы даже не думал.
delete просто помечает память как освобождённую, мол память по этому адресу может использоваться снова, с самими данными по адресу ничего не происходит, пока нет нужды их затереть и что-то другое туда записать
А вот хуй там, мой хитрый демон успел в твою память записать свои караваны
Ну типа я про то же, сегодня ты записал туда 69 и распечатал 69, а завтра демон насрал и распечатал ты 18962862865923, хотя 69 вроде записывал.
К слову про демона, у меня твой код 0 печатает.
Да понятно, что использовать указатель после делете это юби, чё там будет одному Богу известно.
>использовать указатель
Точнее дереференсить его. Ну это логично, мы сказали, что больше нам не нужна память, куда этот указатель указывает, компилятор делает с ней чё хочет угодно.
>>13224
То есть, new резервирует мне память на куче, и только мои указатели могут туда писать. А после вызова delete память освобождается, и писать туда может уже кто угодно, верно? Вообще как и кем это все прослеживается? Например сам размер выделеной памяти new int[10] – это делает C++ runtime (или как оно правильно называется) или операционная система за этим следит? Если потом вызвать delete[], откуда он знает, что память размером 10 интегеров, т.е. где хранится эта информация?
>А после вызова delete память освобождается, и писать туда может уже кто угодно, верно? Вообще как и кем это все прослеживается? Например сам размер выделеной памяти new int[10] – это делает C++ runtime (или как оно правильно называется) или операционная система за этим следит?
Размер инта умножается на 10 плюс некоторое смещение, потом с полученным размером вызывается системный malloc.
>>13239
> откуда он знает, что память размером 10 интегеров, т.е. где хранится эта информация?
Там в начало добавляется смещение, в котором длина хранится, поэтому кстати и нельзя путать delete и delete[], так как обычный delete ничего про смещение не знает, а скобочный будет размер искать в начале.
Впрочем это всё везде может по разному быть реализовано, стандартом не регламентирована реализация, я лишь один из вариантов рассказал.
Dear imgui
Строго говоря в твою память и так любой писать может, иначе как бы я cheat engine пользовался.
Указатель — это просто число, адрес в памяти. Он вообще не знает, есть ли по этому адресу что-то, или нет. Если память освободили, вызвав delete, а кто-то всё равно полез по этому адресу, то может случиться всякое разное:
- ничего
- дебаггер может поймать ошибку и остановить программу
- чтение мусора
- повреждение данных другого объекта (который уже успели записать туда вместо удалённого)
- порча кучи (внутренних записей менеджера памяти)
- access violation (если менеджер памяти уже отдал этот кусок системе обратно)
>Вообще как и кем это все прослеживается
malloc.c лол
Он какбэ зависит от компилятора, и там обычно сидит оптимизирующий менеджер памяти заточенный под твою ОС. Прямого управления памяти обычно нет никогда.
Если функции не виртуальные, то норм.
вот, полюбуйтесь
сначала эти щеночки задают такие вопросы, а потом работают на работах за 150 тыщ рублей в месяц
а я гнию у себя в провинции
>Указатель — это просто число, адрес в памяти.
нет, утырок
вообще то указатели в с++ типизированные, за исключением специального случая
Ну блядь инты и енумы тоже типизированные, но это не отменяет того, что это тоже просто числа.
Ну так тоже работай на работе за 150к, кто тебе мешает?
меня кстати всегла это интересовало, есть пример кода, который переварится в СИ но не в крстах?
ЕМНИП в сях официально есть restrict, в отличие от плюсов.
Кампаунд линерал инта, это, конечно, некст левел.
Приведение void* к другому указателю в плюсах через статик каст, а в си просто так кастится.
Да полно такого в нюансах стандартов, типа void main / int main, смысл auto и static и т.д.
std::vector<MyObj > objects;
Как вызвать функцию
void fn(std::vector<MyObjBase >)
Без лишних мозгоебли с reinterpret_cast и создания нового контейнера?
Никак.
Надоело, что процентов 70 сообщений при работе со сторонними библиотеками тупо не понимаю.
спасибо большое. гуглил, но упорно не гуглилось. надо приучать себя на инглише гуглить
В дебаг сборках медленнее, в релиз только при изменениях резерва памяти в рантайме, если ты резерв подходящий не сделал.
И кактус на монитор поставить зумеры, это вам не джаваскрипт, тут нужно понимать что происходит
Предлагаю vector::revise
Так типы всё равно разные, оно даже не соберётся
>хотелось бы этот код оставить в .cpp.
Ты не обязан имплементации шаблонов делать в хедере.
https://www.codeproject.com/Articles/48575/How-to-Define-a-Template-Class-in-a-h-File-and-Imp
win xp-10
мне нужна не только это. Мне нужны максимально возможные данные о компе. Понятно, что если гуглить по отдельности, может и сделаю (За 1к строк), но может есть более практичные способы (Где всё храниться в одном месте/либе)
Я больше имел ввиду то, что хотелось бы, чтобы этот код не расползался по разным dll и при изменении не приходилось всё заново собирать.
Смотрел сколько там данных? Или думаешь я так не гуглил. Там инфы на 0.01% нужной мне. Нужно что-то на подобии wmi python
Да
const int L = 7; // L = 8
Бля, вот это ты мне мозг сломал сука xD
Я просто мимокрог. Смотреть эту хуйню, или тебе уже не надо?
Еще лучше использовать стат анализаторы чтобы все варнинги по мере написания кода показывались.
Т.е ты сам нихуя не знаешь, какие данные тебе нужны? Земля бетоном. Алсо репортнул тебя на всякий тарищу майору, ты какой то.
Спасибо!
4 курс, ит-специальность, учил плюсы на первом и втором курсах, но очень медленно - тупо освоил книгу Лафоре "ООП в С++", но потом понял, что она очень старая. Год тупо ничего не делал, этой осенью снова взялся за обучение, но плотнее. Попытался найти работу, но ничего не получилось - 4 отказа после тестового/собеседования. Сейчас понимаю, что знал мало. Немного потрогал кьют в ходе решения одного из заданий, неспешно прочитал все книги Майерса кроме СТЛ, петов на гитхабе не было, только несколько решенных тестовых небольших. Если все объединить, то мой объем знаний можно получить за год интенсивного обучения.
Написала эйчар по резюме, которое не обновлял месяца 3, выслала тестовое - сделать клиент-северный чат на сокетах без использования библиотек, компилировать под линукс и написать мейкфайл вручную. Я немного переусердствовал и написал насколько умею и понимаю в ООП-стиле, чтобы было расширяемо и т. д., отправил, позвали на собеседование. На собеседовании, что интересно, вопросов чисто по плюсам не было - тимлид сказал: "мне в принципе всё понятно". Писал насколько могу хорошо - лямбды, смарт-поинтеры, все, что знаю и понимаю из более свежих стандартов в общем. Хотя уже сейчас, глядя на этот код, очень много переделал бы
Быстрее без цикла целый диапазон одним insert.
Да ты гений.
Тащи код сюда. Интересно же как выглядит код, который апрувнули, думаю ньюфаням будет полезно.
Быстрее reserve + emplace_back.
Во время resize будет создаваться объект конструктором по умолчанию, а потом перезаписываться копирующим =.
В случае emplace_back объект будет конструироваться прямо на месте.
https://github.com/AI-Decay/Pong-with-Bot
? Я скинул гитхаб же, код весь там, должно собираться. Сейчас уже вижу много проблем в этом коде, но я ничего не изменял с момента отправления.
Ну на пин понг похоже, я тут глянул код, ебать ты в паблике насрал, все кишки наружу
Каким то методам const дал , каким то нет
SOIL_load_image
В этом и твоя проблема. Надо делать не как можно лучше, а нормально блядь, чтобы удобно было, и писать, и читать, и использовать.
Это что то типа парадокса Блаба. Новичок не может знать что такое нормально, для него это и есть нормально. Потом он узнает о новой фиче, и начинает считать ее нормальной, а предыдущую - недостаточно хорошей.
как так вышло, что в плюсах нет дефолтного типа byte и нужно делать все через charы?
Он же написал у мужиков указатели. Очевидно джва маленьких шара и указатель, направляемый в сторону двух больших шаров женских данных.
мужики хранят данные в чужих сиськах
Шляпища. Незнание ООП вижу я. Очень слабая реализация, нет интерфейса. Это даже не уровень лабы.
И?
>указатель, направляемый в сторону двух больших шаров женских данных
Лучше, когда указатель является указателем на член класса. Забыл, на каком языке пишешь?
vcpkg install libxml
> 2020
> xml
Лучше никак. Если будешь использовать libxml2, то отруби в нём всё то же что отрубали в xmlsec. Для базового использования можешь взять rapidxml или tinyxml2.
Сначала испытательный срок - платят только оклад 24к, затем добавляется бонус 0-40%, который зависит от результативности на проектах, т. е. после исп. срока 24к-33.6к. Не ДС-ы.
>>14840
Щас дерьмом закидают как бедолагу выше
https://anonymous.4open.science/r/acfc48d1-abf6-480d-a5b2-2d6b729c985c/
Типичный код новичка, который пытается имитировать "настоящий" код, старается, но толком не понимает, что делает.
Все не так плохо. Но если тебя взять на работу, то вреда будет больше, чем пользы: кому-то придется тебя учить.
Никак. У меня только в легаси есть tinyxml, обычно кютешный жсон искаропки или свой дсл.
Я не тот бедолага, я далеко не такой смелый.
А куда я тут мог интерфейс засунуть? Разве что сделать какой-то класс, который бы обобщал все фигуры (которых у меня всего 2)
>Все не так плохо. Но если тебя взять на работу, то вреда будет больше, чем пользы: кому-то придется тебя учить.
Я думал Джунов обычно и учат по началу.
Охуеть, с таким тестовым такая маленькая зп. И сколько времени давалось на него?
Не, учат интернов, а джун это такой имплементщик, предполагается, что он способен нормально выполнять задачи по данному описанию, ну там создай класс, который ведёт себя так-то, отрефактори вот это и это, чтобы было вот так, добавь функционал такой-то по аналогии с тем-то и тд
>anonymous.4open.science
Ты бы еще накрыл AES-ом исходники, а то чето слишком легко смотреть, всего лишь файлы по одному скачивать
Я б взял теннисиста, чем этого шифрующегося шизика-дауна
Удваиваю. Меня без тестового джуном брали на 40. И книжек по крестам я не читал.
Вот даун сука, с этой говнохуйни даже вгетом напрямую файлы не вытянуть
Идут нахуй: ты, твой чат, создатель этого шедеврального реп хостинга
Ну поставь звездочку тогда, шерлок. Тебе же нужно скопировать чужой кот. А за возможность говорят спасибо, а не "ебать клоун"
мим
Пиздец, нахуя по 100000 хеадеров создавать на каждый пук? Открываешь файл, а там 5 строчек один ебучий енум объявлен и все.
Смешно, и смысл было шифроваться.
Почему, когда я применяю к спрайту setOrigin(10, 20), спрайт сдвигается в точку (-10, -20) ?
>ссылку кидать
Ебать ты программист, нахуй. Сейчас (да и раньше) в интернете, если палишь уникальное сочетание символов, то это деанон
>Ну вот поэтому я и не хотел ссылку кидать
Скинул бы сразу всем было бы похуй. Эффект стрезанд в действии.
Потому что ты меняешь точку от которой он рисуется/вращается/итп.
Отказали - слабое решение (так и есть)
ставь новую. Отличия есть, но разберешься.
>2020
>найти книжку в интернете по любой версии qt не проблема
>есть смысл более старую версию ставить, если книжка по ней именно?
Как же мне не понять этих людей
в принципе, это довольно прикольно выглядит, только интересно, сколько за это придётся заплатить.
Книжки не поспевают за версиями, очевидно же.
Он хорошо учится по встроенному хелпу с примерами и туториалами, ну и стоковерфлоу для трудных мест.
ist.get(ch1);
if (!ist) return;
ist.get(ch2);
if (!ist) {
ist.clear();
ist.unget();
}
return;
Я правильно понимаю, что unget() положит обратно ch1? Влияет ли ist.clear() на память потока (последний символ)? Влияет ли неуспешная попытка ist.get(ch2) на память потока (последний символ)?
Матерь Божья, ist.clear(std::ios_base::badbit) выставляется. Пусти идиота программировать, и он отстрелит всю ногу.
Да, это лаба, но при её выполнении у меня появилось аж два вопроса:
как сделать 132, 161 и 173 строки хоть немного короче, чтобы умещались хотя бы в 24 дюймовый экран в 100% масштабе?
Почему в строках 132 и 137 если для переменных chas, minuta и sekunda написать пространство имён Triad вместо Time, то нихера не работает, а переменным god, mesjac и den вообще насрать, через Triad к ним обращаются или через Date?
У тебя ромбовидное наследование.
Memories
/ \
Date Time
\ /
Triad
Ну вот компилятор и не знает, ты собираешься использовать Triad который от Time или который от Date
А почему переменные god, mesjac и den изменяясь в Date меняются также и в Triad, а с классом Team такого не происходит? Что-то мистика какая-то.
В Date ты обращаешься к переменным напрямую: ++god
В Time ты создал Новое поле Date date; и меняешь ЕГО поля date.DenPlus()
>как сделать 132, 161 и 173 строки хоть немного короче
берешь и переносишь. Код у тебя тот еще пиздец, конечно. Последняя строка функции SohranVremja что должна делать?
>Почему в строках 132 и 137 если для переменных chas, minuta и sekunda написать пространство имён Triad вместо Time
потому что protected
Я б честно говоря все выкинул и переписал.
Мне кажется что идея у тебя была такая
class Triad { int a,b,c }
class Date : Triad { getDay() {return a} setDay(d) {a=d} ...}
class Time : Triad { getHour() {return a} setHour(h) {a=h} ...}
class DateTime : Date, Time { Date date; Time time; setDateTime(long long unixtime) { date.setDay(...)} }
Ой, в последней строчке я имел в виду без наследования, просто аггрегацию:
DateTime { Date date; Time time; ...
Правда я не знаю какое у тебя задание, может как раз на наследование... С другой стороны, нужен ли класс Triad...
Пиздец, я всегда думал, что unique_ptr зиро оверхед. Даже сам Страуструп так говорил. Какого хуя?
Да норм все. Анон просто не знает нормы русского языка, которые говорят, что нельзя употреблять одно и то же слово в отдельной части текста
Про ссылку я почувствовал, увидев move и не увидев &&. А вот про noexcept протупил.
возник вопрос можно ли как то передать адрес массива который определен в другой функции причем что бы main использовался только для вызова других функций вот код который я сделал для примера
Можно
Просто делаешь этот массив ДО функции mas и в нее передаешь.
Ну например
int main()
{
int * mass;
int limit = mas(mass);
int summ = sum(mass, limit);
delete[] mass;
заодно и не забудешь удалить его - каждому new[] должен соответствовать delete[]
int mas(int& mas) { //тут передаешь массив по ссылке - все изменения распространятся и вовне
...
mas = new int[n];
...
Он же функции после main пишет даже не сообщая main о их существовании, он же даун.
Сложно ли вкатываться на работку джуниора c++? Много ли знать надо?
Надо знать C++, матан, теорию алгоритмов, дискретную математику и, зависимо от направления, физику. Тебе всё это будет проще в универе каком-нибудь выучить. 4-5 лет и ты проградрист.
Никогда не понимал смысла прототипов, логично же сразу в начале программы объявить все функции без маняпрототипов.
>C++, матан, теорию алгоритмов, дискретную математику и, зависимо от направления, физику
Охуенный список. Из него реально полезно знать только ВНЕЗАПНО С++. Возможно алгоритмы, чтобы на собесах (и только на собесах) деревья вертеть. Все остальное зависит от предметной области.
>4-5 лет и ты проградрист.
На этом уже шаге можно искать оплачиваемую стажировку. На которой даже платят деньгами.
http://www.cpp.sh/5bdot
Почему методы класса Date при вызове из объектов в классе Time не отрабатывают? Компилятор как будто их не видит. Использую VS2019.
А как передавать по ссылке? Я в ссылках в ООП ещё не особо разобрался, мой максимум это списки.
void ChasPlus(Date& date)
..
void PlusChas(Date& date) { ChasPlus(date); PokazDataVremja(); maks(); min(); }
..
if (vvod == "ChasPlus") vremja.PlusChas(date);
Если я сам не путаю ничего, тоже изучаю только пока.
Сложно. Много и главное понимать нужно. Выбери что-то другое, там во многих случаях просто знать достаточно.
Не знаю, я не выбирал другое. Почему? Да ни почему. Какие могут быть почему, когда есть c++?
Он удобен для написания небольших скриптиков, много чего делается искаропки, учится моментально, в каком-то смысле каждый программист умеет писать на питоне, тк он близок к псевдокоду и тд
А мне было бы удобно программировать на Русском
цел главн()
{
строка хуй;
вывод << "Эй, анон";
ввод >> хуй;
если(хуй == "а?") вывод << "хуй на!";
}
Но я хочу так в крестах! Чтобы тупые пиндосы учили великий Русский язык лишь бы кодить на крестах!
Прикольно.
Но почему не работает тут????? http://www.cpp.sh/2awgn
Сука ненавижу когда перед и полсе звездочки пробелы, когда она в качестве оператора указателя.
Да, это хуита, я лично всегда пишу рядом с типом, int*, а кто-то пишет пробел перед звёздочкой, в этом тоже какая-то логика есть, но мне её не понять, так получается тип "указатель на инт", а так хз что вообще, ещё с констами какая-то такая параша тоже есть.
Я хочу здесь http://www.cpp.sh/5bdot понять, почему методы Date не вызываются при компиляции из методов Time, если оба методы наследуются от Triad, а Date является другом Time.
Попробуй тут часы, минуты и секунды поуменьшать и посмотри, как не меняются от этого дни, месяцы и годы
https://repl.it/repls/ConsciousShamefulOctal
А при линейном наследовании вида Tried->Date->Time всё нормально.
Очень, очень тяжело понять, что у тебя там написано, но если я правильно понял у тебя при вызове ChasPlus меняется переменная date, которая у тебя class Date{...}date;, а не vremja.
class Date : protected Triad
{...}date;
class Time : protected Triad
{
protected:
void ChasPlus()
{
if (chas == 23) { date.DenPlus(); chas = 0; }
else ++chas;
}
Вот тут ты date меняешь.
class Memories : protected Date, protected Time
{
....
void PlusChas() { ChasPlus(); ...}vremja;
...
vremja.PlusChas()
А вот тут ты меняешь vremja, но ChasPlus будет менять не Date, которая в vremja, а date, которая выше была.
Да, ну и я бы переделал так, считал бы всё в секундах, ну там addday это добавлял бы к текущему количеству секунд 86400 и тд, а потом как хотел бы печатать брал бы остаток от деления на 86400(это были бы часы/минуты/секунды) и то, что поделилось было бы днями и потом переводил бы количество дней в год месяц день по формуле отсюда
https://web.archive.org/web/20170507133619/https://alcor.concordia.ca/~gpkatch/gdate-algorithm.html
Ну он там в середине видео пояснял, что unique_ptr генерит 4 лишние инструкции ассемблера, причем не самые быстрые, косвенный доступ к памяти. Вот об этом речь видимо и шла.
В релизе процессор мммаксиум в 30%, как увести его в сотку?
А ты их объявил виртуальными?
Почитал бы хоть о принципах наследования, а не брался за него сразу, да ещё и за множественное.
Блядь. Удали весь свой сраный код и выбери предметную область получше.
Для изучения наследования и композиции отлично подходят gui-контролы. Заодно и чему-то реально полезному научишься.
Я тебя запутал немного, у тебя объекты были глобальными созданы, т.е. не надо передавать их в функцию.
Если я правильно понял твою ошибку, то у тебя дни прибавляются в объекте date, а выводишь ты значения полей объекта vremja.
Нет, в смысле он имеет ввиду например сменить всякие __gxx_personality_v0, __cxa_throw и тд? Ну там сигнатуру поменять, функции убрать/добавить, крч интерфейс сменить или он про другое?
Ты гонишь? Шаред то вообще оверхед оверхедный.
Вы видите копию треда, сохраненную 3 мая 2020 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.