Это копия, сохраненная 8 апреля 2019 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Ответы на все вопросы - http://en.cppreference.com/w/ http://www.cplusplus.com/reference/
Прошлый >>1342442 (OP)
Понимаю что ньюфажная платина, но все же
Может кто в двух томах объяснить, или дать ссылку, объясняющую, чем принципиально C++ сложнее для изучения, чем что-то другое? Т.е. в какой момент в процессе обучения я должен понять что вот "это вот" не просто что-то новое и сложное в чем нужно разобраться, а "что то" что сложно именно из-за выбранного языка, и в другом языке такой проблемы бы не возникло? Или попросту в определенный момент я столкнусь с чем-то, что уже просто будет за гранью понимания и я попросту не смогу в этом разобраться из-за ограниченности моего ума, как бы я не старался? Ну или дело банально в области его применения, так что использовать C++ нужно только в тех областях которые неминуемо будут связаны с множеством других?
Просто недавно начал его учить как первый язык. И в нескольких интервью и статьях слышал что-то типа "оказалось слишком сложно, я перешел на другой язык", но нигде не нашел инфы о том, как они вдруг осознали что вот всё - пизда. Столкнуться с чем-то сложным ведь можно где и в чём угодно, как понять что виноват язык?
Разнообразие ооп хуйни и зависимостей.
Virtual pure base inline abstract class и прочее.
Также дохуя undefined behaviour и тонкостей
Вкатился. Попробовал на днях написать хеллоуворлд на С. Блять, бальзам на душу, серьезно. Нахуй весь этот пердолинг и сложности С++ , ебучий ООП, если можно писать чистый, понятный код на С? Дискасс.
Пусть у меня есть некоторый проект на цпп. У него есть некоторая core функциональность (гурбо говоря набор интерфейсов + самая базовая их реализация), совсем небольшая. И есть куча классов, которые реализуют эти интерфейсы.
Типичный юзкейс - это когда юзер выбирает несколько из них и остальные ему не нужны.
То-есть, я хочу, чтобы юзер мог зайти на страничку проекта, найти в списке нужный ему функционал и затем выкачать core + этот функционал, а всё остальное оставить.
Как это можно сделать?
Самый очевидный вариант - это просто написать небольшой скрипт на питоне, который юзер будет скачивать, запускать с какими-то аргументами и скрипт будет выкачивать то, что нужно. Ну и нужно будет еще симейк как-то составлять процедурно тоже.
Кто-нибудь делал что-то подобное? Может можно сделать это как-то средствами гита?
Язык перегружен кучей всяких возможностей. Это вобщем-то замечательно. Плохо то, что нет простых общих правил пользовония этими возможностями. Почти у каждого правила есть масса особых случаев и исключений.
Ты должен либо наизусть учить все эти списки особых случаев, либо разбираешься как оно внутре устроено, чтобы понимать откуда эти исключения из правил берутся.
Первое практически за гранью человеческих возможностей; второе требует дополнительных усилий и времени.
Возьми любую энтри-левел книжку из шапки, там будет 1100+ страниц. И вот в этой тыще с лишним страниц не нашлось места, даже для такой базовой вещи, как синтаксис объявлений.
>Возьми любую энтри-левел книжку из шапки
Я вот как раз учу по одной из них, и например до сих пор хуею с того, что в оригинале есть различие между Statement и Operator. А в русской оба этих понятия в любом абсолютно месте называются Оператор и Оператор.
Только ядро.
Ты можешь написать все, что угодно даже на ассемблере. Вопрос в скорости разработки и поддерживаемости. С++ в этом плане выигрывает у С.
Вообще, современный положняк у коммунити в том, что С надо использовать только там, где нет тулчейна С++, а-ля какие-нить блевотные некроконтроллеры.
Мы в виндовом кернеле пишем на С++17, без стандартной библиотеки, офк. Но, даже такой кастрированный С++ - это все равно в гигатонны раз лучше, чем С, потому-что классы\RAII, тимплиты, лямбды.
Нахуя? У тебя там 8Гб исходников, чтоб было проблемой их все скачать?
А вообще cmake поддерживает всякую условную сборку. Можно заготовить симейк со всеми модулями и немного попердолиться с аргументами.
boost hana
а не пробовали кастомные аллокаторы сделать для std контейнеров? на пулах, к примеру
в 98 стандарте по итогу этот вариант не работал, но с последними стандартами вроде как поправили..
>Вообще, современный положняк у коммунити в том, что С надо использовать только там, где нет тулчейна С++, а-ля какие-нить блевотные некроконтроллеры.
Преимущество С - для него автоматически генерируются биндинги под все скриптовые языки. Поэтому библиотеки часто пишут на чистой сишке или делают обвязку без ООП. К Qt, например, биндингов мало, а те что есть, работают не очень стабильно.
>Просто недавно начал его учить как первый язык.
Начни с питона лучше, он для этого и создавался. Плюс он очень практичный, ты сразу сможешь писать какие-то полезные тебе скрипты.
>но нигде не нашел инфы о том, как они вдруг осознали что вот всё - пизда.
Например, если даже не брать разницу между стандартами, C++ - это как минимум три разных языка: сам С++, шаблоны и макросы, и у каждого свои заебы. Еще пример: если в других языках обычно есть тольк значения и ссылки, то в С++ есть значения, указатели, ссылки и rvalue references. Даже указатели начинающий плохо воспринимает, а уж на rvalue references мозг ломается даже у самых стойких.
А зачем тебе язык? Наверное с этого надо начинать выбор языка.
>как они вдруг осознали что вот всё - пизда
Ты хотя бы cs50 осиль причем можно даже не весь курс, а ту часть где про си.
ты не оче умный походу
Потому что сишный каст сначала пробует все остальные касты, а reinterpret тупо меняет тип. То есть, например, при приведении указателя на класс со множественным наследованием может сработать static_cast, и результат получится для тебя неожиданным.
Спасибо, посмотрю
Вычеркиваешь из задания слово сериализация. Просто берешь и делаешь программу которая сохраняет какую-то структуру данных в файл либо загружает из файла (по выбору в меню).
то что ты сделаешь с структурой чтобы ее можно было сохранить в файл будет сериализация, чтобы загрузить из файла - десериализация
Спасибо, попробую осилить файлы, далеко вперёд ушёл, их скипнул, и тут вернулись, не понимаю как считывается информация из текстового файла, например массив, как дать понять какое число в какую ячейку помещать, но попробую
Они почти полностью обратно совместимы, может поругаться варнингами на deprecated вещи.
Можешь поставить Qt и формошлепствовать, хотя вкатываться мне кажется легче на шарпе с дотнетом. Так то они соответствуют друг другу, и там и там есть свои языки разметки.
[code]*[/code]
Примерно вот так https://ghostbin.com/paste/h9on5 я создаю сперва место на хипе, а потом пишу туда переменные структуры, затем переают указатель на хип в фукцию write. В принципе ты можешь и сразу всю структуру заебашить просто используя указатель this, например
file.write(reinterpret_cast<char#>(this), sizeof(#this); вместо звездочки #. Но так лучше не делать, так как можешь проебаться с пэддингом.
Короче если ты откроешь этот файл в hex редакторе, то ты увидишь такое как на втором пике. Это и есть эти два интегера в шестнадцатеричном виде, правда они сохраняются в little-endian формате, то есть их надо читать задом наперед как на третьем пике.
Мы в итоге тупо написали свои кернельные строки, вектор, хэштаблицу и даже юник_птр, т.к. стандартные хедеры тащат очень много всего неподдерживаемого в код. Заняло несколько дней, но, зато есть угарный доп-функционал, типа variadic конструктора для строки, который все переданное джойнит и сохраняет.
>>59281
Ты без проблем можешь обмазывать свой код EXTERN C, когда нужны биндинги.
ну в лабе вот так показано, мне надо изобразить что то похожее, но я не долбаёб тупо копировать, мне хотелось бы узнать что делают символы "И" и тд. просто обьяснить строки, тогда мб пойму что это такое и зачем оно нужно, а как работает ввод из файла, как он понимает что мне нужно и куда поставить, или как ему это обьяснить попробую сам разобраться. Поэтому если сможешь обьяснить что тут к чему, буду очень благодарен.
Ну что тут сказать, тут сперва берется структура А, которая передает свой адрес указателю ptr. & это оператор адреса, (char#) это C-стайл каст из типа структуры в тип char. В моем примере я использовал С++-стайл reinterpret_cast, что в принципе то же самое. Затем с помощью указателя данные из структры копируются в массив Mas, который тоже должен быть типа char, иначе будет пизда. Потом данные из массива выводится на экран. Но эта фигня будет только работать, если в структуре все переменные одинакового типа и размера. Еще добавлю, что на пикче #(ptr+i) и #(e+i) это вообще уродство. Лучше просто писать ptr, ты можешь подумать "но ptr же не массив" - а похуй, я сказал! В С++ массивы по сути указатели, поэтому и указатели можешь использовать как массивы. ptr будет автоматически прыгать с размером своего типа (в этом случае это char, то есть 1 байт), и сразу разыменовать его, то что делает звездочка на пикче.
Двач сука квадратные скобки у ptr съел.
Да я что спрашиваю, одна баба в видео говорила мол учите со стандарта 2003 года! а я развесил уши все
Никто не клепает формочки на чистом винапи. Да и это не совсем удачный вектор для вкатывания.
Ну покажи как лучше, раз ты такой умный, а то ни дай бог тот чел скопипастит мой код и получит двойку!
Сам то кто по масти?
>Ты без проблем можешь обмазывать свой код EXTERN C, когда нужны биндинги.
Только если у тебя код близкий к сишке, без особого использования ООП. Для того же Qt сишный интерфейс будет очень сложно сделать.
Спасибо большое, достаточно понятно.
ну, епт
2 инта в бинарник можно и напрямую закинуть без изьебств как у тебя если не идет речь о независимом от платформы формате
>Ну покажи как лучше, раз ты такой умный
Как минимум структура при чтении должна понимать, что данные ей не подходят, и выдавать ошибку.
Сложно понятие субъективное, может ты изначально так мыслишь и тебе вообще норм. Тем же плюсовикам может быть ФП сложна, а ФПшникам сложно с байтами ебаться.
>три разных языка
Я бы поделил на процедурный С++(практически С), объектно-ориентированный с++ и декларативный с++(шаблоны-шаблончики).
Ну очевидый нюанс это сторонняя ide, лень переходить с VS и танцевать с переносом библиотек, хотя именно gtk я ещё не пробовал и достаточно подробно не прощупывал, мб гляну сегодня.
>>59690
Я имел ввиду именно Майкрософт докс, до мсдн я не добрался.
>>59694
Нюансы выше,плюс не понимаю нахуя качать пол дня пакет на 20 гигов, ради нескольких кнопок и пары пикчербоксов.
пописал на тебя
imgui как вариант
Потому что на чистом винапи ты будешь эти кнопочки клепать неделю. А в QT за пару часов управишься.
Игры создают на движках.
Движки имеют кросс-платформенную прослойку, которая уже общается с winapi. Но все общение там сведется к созданию окна, и отрисовыванию всего руками, включая кнопочки интерфейса
На директ икс как минимум, винапи слишком тормозной, ну если это не что то типа пасьянс только . А так то на готовых движках.
>винапи слишком тормозной
В каком смысле? Я, конечно, не эксперт, но разве любая хуйня на винде не дёргает винапи в конечном счёте?
Все вокруг - обертка над системным АПИ. Конкретно на винапи игру создать малореально, за счет того. что нет хардварного ускорения. ты дергаешь интерфейсы опенгл\директ3д, которые, фактически, тоже являются системными АПИ.
Еще раз - все эти кути, гтк и прочие фреймворки - это все обертки над системным апи.
О, понятно, типа напрямую с дровами видюхи, да? А мне всегда казалось, что всё через винапи общается, типа к ней идёт запрос, она дёргает драйвер видюхи, а она уже делает что надо.
Ну понятно, что дольше, там же напрямую всё.
Не, там окна (в винде ваще все является окнами), очередь месседжев, не то что нужно играм.
Операционная система предоставляет некие интерфейсы, которые потом где-то за кулисами реализуются драйверами видяхи и тд.
Здесь важно понимать, что ни к каким драйверам и прочему ты доступа не имеешь, ты просишь операционку сделать что-либо, а она уже либо сама делает, либо делегирует кому-то еще внутри себя. Ты это не контролируешь.
А что там за ужасы у тебя, все конфиденциально?
Я все в поисках чего-нибудь, чтобы практиковаться, но плюсового опыта у меня мало, пока максимум - это диплом и три небольшие утилиты для работы. И то, все это можно было реализовать быстрее на других языках.
Я бы мог взяться ради опыта и интереса, но ни скорости, ни абсолютного качества кода на гарантирую, так как ньюфажик.
работу отбирают, хады
Да, минут на 50 работы всего
Короче:
char mamka[10];
int age = 0;
float weight = 0;
запрашиваем и пишем каждый параметр мамки по отдельности;
Как потом ввести все эти данные в объект ОбщийПоказатель, так, словно я просто списал все эти показатели одной строкой через пробел сразу в ОбщийПоказатель, а не делал это по отдельности? Банальное = тут не работает, потому что тип ОбщийПоказатель отличается от всех этих трех. Прост прыгнул чуть дальше чем нужно, и теперь хочется добить, а то меня мой гештальт забьет насмерть.
т.е. как будто бы я просто вписал все это в консоль разом, а не по отдельности
std::cin >> ОбщийПоказатель;
Ну там есть сишный интерфейс для отсылки сообщений объектам. Правда его работоспособность не гарантируется (так как он не преднозначен для использования обычными прогерами). Ну и остается проблема с получением сообщений (разного рода делегатам, типа NSTableViewDelegate). Тоесть скорее всего нужно будет ебаться с свизлингом. Есть вариант тупо рендерить через метал на GPU не связываясь со стандартным UI. Но никогда не пробывал. Более простой вариант такого подхода будет накатить игровой фреймворк (cocos2d-X - нужен именно X) и работать через него - но тоже не пробывал.
Я писал в студии с Verdigris, без qt модуля, moc'а, и прочей параши. Имхо, идеально.
Тебе нужно перегрузить оператор>>, гугли по stream operator overloading. Что-то вроде такого должно быть
istream& operator>> (istream& is, YourMom& wh)
{
is >> wh.age >> wh.weight;
return is;
}
Не за что.
Хз возможно ты subsystem windows не выставил?
Питон никак не поможет вкатиться в плюсы, ничего общего практически.
Object Паскаль по возможностям гораздо ближе к плюсам. Да и умер он не совсем, условно. Работу найти трудно - это да, все остальное на месте.
>Может кто в двух томах объяснить, или дать ссылку, объясняющую, чем принципиально C++ сложнее для изучения, чем что-то другое?
С++ сложнее в использовании, а не изучении.
>the First Amendment to the C++ Standard states: "The committee shall make no rule that prevents C++ programmers from shooting themselves in the foot." Speaking less facetiously, when it comes to choosing between giving programmers more control and saving them from their own carelessness, C++ tends to err on the side of giving more control.
В переводе на русский, С дает свободу, программировать как хочешь, делать что хочешь, это означает эффективность, если есть мозги воспользоваться свободой. Но свобода означает ответственность, если обосрался, то только ты в этом виноват, язык тебя не оберегает как нянька, не ведет за ручку, не говорит как надо и как не надо, ты сам должен знать как тебе нужно, поэтому для обучения программированию С не подходит.
>>59970
А Паскаль это обратная крайность, там нельзя ни шаг влево, ни шаг вправо, только по жестким рельсам языка, который полностью диктует как нужно писать и не допускает иного. Поэтому теоретически он считался хорошим языком для обучения, но на деле железные кандалы воспитывают моральных рабов, которые не могут жить и думать за себя самостоятельно без самога барина в жопе, указывающего путь.
> но на деле железные кандалы воспитывают моральных рабов, которые не могут жить и думать за себя самостоятельно
Это не свойство паскаля, это подход к обучению. Если человек даун выбрал хуевый подход, то он с любым языком обосрется.
>думать за себя самостоятельно
Ты так говоришь, как-будто все обучение должно ограничиваться одним языком.
Еще как минимум изучают алгоритмы/структуры данных и какой-никакой матан. Вот тут-то и прокачивается соображалка.
Питон дополняет c++, а не заменяет его. Обмазываясь с самого начала питоном, ты уйдешь в совершенно другую предметную область.
>железные кандалы воспитывают моральных рабов, которые не могут жить и думать за себя самостоятельно
Но даже и не оспаривая этот твой тезис, сюда входит уже достаточно широкий круг задач.
>Питон никак не поможет вкатиться в плюсы
Ему не в плюсы надо вкатиться, а вообще научиться кодить. Изучать С++ как первый язык программирования - не самая здравая идея. Питон для этого гораздо больше подходит из-за простоты и популярности.
void CreateMas(int r,int k){
mas = new int* [r];
for(int i=0;i < r;i++){
mas= new int [k];
}
}
никуда. Главная проблема обезьян в том, что от них больше вреда, чем пользы
Майерсов
Прикольно, тебя без собеседования взяли что ты не знаешь что надо готовить? Если не спрашивали ничего и не сказали забей, будешь макакой и там на месте все пояснят.
Зачем тебе легаси массивы вообще? Можно ведь прощще
[code]
template <class T>
auto CreateMas(size_t r, size_t k){
using namespace std;
vector<T> row(k);
return make_unique<vector<vector<T>>>(r,row);
}
[/code]
Спрашивали все, что только можно. Просто хочу еще сильнее подтянуть знания, чтобы не пернуть жидко.
Не совсем понимаю, чего ты хочешь добиться с этим кодом. Во-первых звездочку после new int не надо ставить. А mas что, глобальная переменная? Тогда она должна быть указателем. А что ты в цикле делаешь, тоже не понятно. Ты хочешь присвоить значение переменной k в этот массив? Или ты хочешь создать массив на отдельные кучи размером k каждая?
Всем привет. Осваиваю С++, пока знаю на уровне школьника-троечника. Дорабатываю для своих целей одну опенсорсную прогу, возможно, в будущем, написать свою с улучшенным функционалом той + тот функционал, который нужен еще. Но это в далеком будущем, а пока...
В общем, надо сделать так, чтобы в определенное время проигрывался аудиофайл, имеющий название, соответствующее unsigned int X. При указании данной переменной в синтаксисе PlaySound: PlaySound(X.wav, NULL, SND_ASYNC) VisualStudio 2005 выдает ошибку С2228: left of '.wav' must have class/struct/union type is 'UINT'. Собственно, в этом и вопрос, как заставить прогу проигрывать тот wav-файл, который имеет название как в переменной, подходит ли процедура PlaySound или надо что-то другое?
X.wav надо превратить в строку перед отправлением в функцию. Гугли "string format C++", там куча способов сделать это.
Вангую, следующую ошибку высрет линкер, что функция PlaySoundA не найдена.
>X.wav надо превратить в строку перед отправлением в функцию.
Как это можно сделать в рамках события (которое в case, информация, быстро пришедшая с аудиовхода), которое запускает тот самый плейсаунд? Мне надо просто вот так: нужный (с этим все нормально, прописано все до нужного фрейма) сигнал на лин. входе, содержащий Х>декодирование>проигрывание аудиозаписи, содержащее имя переменной.
Не курсовая, надо для реализации одного радио-телеком-протокола для личных нужд.
У меня со звездочками, это ебаный абу их украл.
Дело в том что компилятор не ругается на эту конструкцию, но когда программа входит в конструктор класса, вылетает ошибка.
В гугл лазил, другие делали так же и у них все работало.
Звездочки перед мас нету, я ее случайно сейчас туда ткнул.
> содержащий Х>декодирование>проигрывание аудиозаписи
Что-то мне кажется, что PlaySound из winapi тебе не подойдёт. Может тебе надо с WASAPI/DirectSound (хотя судя по VS2005 работаешь ты скорее всего на WinXP, где WASAPI и нет) работать? Насколько часто нужно проигрывать файлы? Насколько они короткие? Насколько важна задержка?
>Что-то мне кажется, что PlaySound из winapi тебе не подойдёт
Так вот как синтаксис данной процедуры ни курю, как ни гуглю, мне тоже так кажется. С другой стороны, вроде бы должна стандартная процедура WinApi брать файлы с названиями, задаваемыми прогой. Но вроде и не подходит. А что подойдет, такое же быстрое и легковесное, желательно не стороннее, а от тех же MS? А то был у меня опыт с библиотекой Audiere, которая работала даже на заданный wav-файл через пень-колоду, притом PlaySound при задании имени Wav-файла работает как часики. Проблема в том, что имя Wav-файла - имя абонентского терминала, а я хочу приучить прогу работать с несколькими - а для этого надо брать номер, которым представляется терминал, и который в проге хранится в UINT X.
>Насколько часто нужно проигрывать файлы? Насколько они короткие? Насколько важна задержка?
Скорость важна, это аналоговая сотовая. Пока сторонняя библиотека думает, терминал уж раз 5 канал сменит.
>Насколько часто нужно проигрывать файлы?
Не очень часто, по коннекту типа радиотелефона.
>Насколько они короткие?
Коротенькие, секунд 5-6-7 - подтверждение ответа БС, набора номера (хоть произвольного пока, это не важно - декод цифр по стандарту будет с развитием софта, сейчас набор номера идет уже после проключения на разговор через программку DTMF Joystick) и разрешение на проключение разговорного тракта.
>Насколько они короткие?
>>60293
>Коротенькие, секунд 5-6-7 - подтверждение ответа БС, набора номера (хоть произвольного пока, это не важно - декод цифр по стандарту будет с развитием софта, сейчас набор номера идет уже после проключения на разговор через программку DTMF Joystick) и разрешение на проключение разговорного тракта.
Вот пример: http://rgho.st/7ySPJwGWs
> желательно не стороннее, а от тех же MS
Я уже дал название библиотек, встроенных в винду. Есть ещё cubeb [1], я с ним игрался когда-то. Довольно простой и кроссплатформенный, мне понравился. Однако он pull-based, а не push. Это значит, что он сам постоянно запрашивает данные для вывода и если данных нет ты выводишь нули. Придётся тебе попотеть с синхронизацией. Алсо, он может работать и с микрофонами/лин.входом. Ты можешь тупо соединить их через функцию, которая будет получать звук из одного потока и выводить в другой.
[1]: https://github.com/kinetiknz/cubeb
>Я уже дал название библиотек, встроенных в винду.
Ладненько, погуглю и поиграюсь. В любом случае, это временное решение - далее надо писать енкодер стандарта наподобие линуксовой довольно пиздатой, даже с смсками, которые как у меня, так и практически у всех операторы данного стандарта, не поддерживаются из-за их ненужности и вредности - поскольку передача идет на голосовом канале в режиме модема осмоком-аналог. Собственно, пора раскрыть карты - стандарт NMT-450 и я в рот не ебу, как в с++ (на этом языке таки есть готовый декодер на Win) выдать на выход звуковухи частотную манипуляцию между 1200 и 1800 Гц. Думаю в ресурсы закинуть файлы этих частот и попеременно включать той же PlaySound, но... Она, конечно, работает быстро, но время там не задать, а время ФРЕЙМА в NMT - миллисекунды. Если так сделаю, мне кажется, придется городить индусский код из if и else, котолрый работать толком не будет.
Все ок, при входе в цикл сразу краш.
Попробывал в запустить это безобразие в вижуал студии, все нормально работает.
Через пару минут каким-то чудом файл появился, что происходит?
Этот хидер автоматически генерируется из ui-файла, который ты в редакторе форм делаешь.
Понял. Наверное удобнее всё же будет писать в Qt Creator, в студии не особо удобно.
Таки, и плейсаунд прекрасно работает : http://www.cyberforum.ru/vbfavorites.php?do=add&entry_type=post&entry_id=13382539
> Для просмотра этой страницы необходимо зарегистрироваться.
Ну, значит у тебя нет на самом деле больших требований к задержке.
Работает же вроде http://www.cpp.sh/4susa Тебе не надо ставить звездочку перед mas в цикле, потому что квадратные скобки автоматически разыменуют указатель.
Правила строгого алиасинга преобразование int[] -> int∗ нарушает? Нет. На всё остальное похуй. Добро пожаловать в C/C++ мирок, где разрешено всё что не UB.
Нет, это в ++ никто не юзает *, а в С++ юзают, потому что С++ это С и ++. Говорить что С++ это не С, аналогично "С это не С", абсурд. С++ включает в себя С, С нельзя выбросить.
массив - это базовый тип
плюс в языке есть неявные преобразования и механика низведения, связанная с этим типом, но это уже другое
Директу нужен твой хендл окна, так что совсем без винапи и его месседж лупа ты не уедешь. Хотя в последний раз я что-то писал на девятом DirectX, может что-то и поменялось за это время. Хотя, не думаю.
Тогда подтяни свой уровень в обычных крестах, т.к. книга Шлее это на 95% упрощенный перевод документации Qt.
Есть оператор выбора который выбирает функцию по вводу 1/2/3.
Как заменить цифры на слово? Чтобы он выдавал функцию например при вводе max/min/avg и так далее?
Вроде нормально подтянулся, даже немного вкатился в новые стандарты, но опыта мало. Хотел бы сделать какое-то небольшое приложение с виндовс формами, но WinApi тоже сложно дается.
>Либо оформи код по-человечески, либо иди нахуй. Этот говнокод читать в здравом уме никто не будет.
Тебе незачем на мой говнокод смотреть.
Ты на вопрос ответь, брат.
Зачем книга по Qt? Для большинства задач там все просто и тупо. Берешь, и делаешь без задней мысли, онлайн документации хватает за глаза. Что-то более сложное можно найти только в инете, в книгах такого не пишут.
>>60738
>Как заменить цифры на слово?
В switch-case NIQAQUE. Но изъебнуться можно: вариантов несколько. Самый простой хуярить if-else. Если прям принципиально использовать switch-case, то определяешь enum и с помощью отдельной функции, которая через тот же if-else сравнивает строки и возвращает экземпляр этого енума. А уже его можно использовать в switch-case.
Спасибо, брат.
Алсо. Как правильно скобки расставлять? Меня никто этому не обучает. На первом скрине я расставил их так, как удобно мне. Сейчас вообще нихуя не понимаю.
Это троллинг или правда есть единый стандарт?
Не бейте я аутист.
> есть единый стандарт?
Есть несколько стандартов. Бери любой, например гугловский https://google.github.io/styleguide/cppguide.html
Поставь студию, она подскажет большинство моментов и расставит за тебя пробелы
В каждой команде, как правило, свой стиль. Для себя я использую данный, с небольшими доработками: http://www.stroustrup.com/Programming/PPP-style.pdf
Единых стандартов нет, но часто за тебя это делает ИДЕ. У тебя какой то пиздец в качестве оформления.
http://www.cyberforum.ru/cpp-beginners/thread2414561.html
По этой ссылке должно работать, проверял с режима инкогнито. А требования к задержке миллисекундные, ибо каналы в Нокии 640 (не той, что люмия, старой аналоговой) меняются побыстрее, чем в сканерах Айком, почти на уровне американских сканеров.
Тем не менее, решение найдено.
Да.
С++ и ява - разные языки. Поэтому не стоит из крестов пытаться сделать яву.
С и С++ хотя и разные, но пересекающиеся языки. Существуют апи, библиотеки и прост большая скотокодовая база для С++, написанная на С или в си-стиле.
Твоя борьба за чистоту плюсов абсурдна.
Дело в том, что мне дали задание изложенное максимально по дебильному. Ты можешь понять алгоритм из этого текста? Что требуется сделать с каждой ячейкой матрицы, если не просто увеличить число в ней на 1,5%? (препод сказал, что в примере ввода опечатка, число 150 в там это 1,5)
Я не годен к военной службе, так что ответить на мой вопрос, если не трудно.
Даун, съеби.
В чем проблема обсудить это с преподавателем?
Нормальный преподаватель будет только рад вопросам.
Короче, если тебе нужно создать динамический массив в классе то так:
>mas вместо arr
Ты что быдло ?
>как в javascript
Примеров где применяется вложенный класс много, первое что пришло в голову - списки.
Они хранятся в стеке или куче?
Обычные массивы - наследие С, т.е. это просто выделенная компилятором область памяти на стеке и указатель на первый элемент. В куче они будут храниться только если ты явно задашь это с помощью оператора new.
массив - это базовый тип данных
со своими неявными приведениями и правилами низведения, унаследованными от си, что и путает новичков
тут несколько ошибок
нет
может троллит
Вот есть у меня структура, я создаю ее новый экземпляр через new, а когда инициализируются и чем ее внутренности?
стандартным конструктором. Если в тебя есть поля без стандартного конструктора (инты, енумы, указатели, и тд) - то будет мусор.
Будет вызван стандартный конструктор для каждого члена структуры. Встроенные типы тоже его имеют, но он делает буквально ничего, поэтому их значение определено не будет. Однако существует zero-initialization, которая забивает память нулями для типов, у которых нет пользовательского конструктора (те же встроенные). Чтобы она произошла, нужно поставить пустые скобки:
int p_a = new int; // значение p_a не определено
int p_b = new int(); // p_b == 0
Аналогично для структур
MyStruct * p_s = new MyStruct();
Бля, опять про звезды забыл
int^ p_a = new int; // значение ^p_a не определено
int^ p_b = new int(); // ^p_b == 0
Я специально.
Это последовательность ячеек памяти. Это не объект.
Вот что-то, а в С++ стандартную библиотеку по исходникам изучать не стоит. Там будет куча шаблонного кода, нахуеверченная создателями компилятора с двумя целями: (1) соответствовать стандарту и (2) работать как можно быстрее. Лучше прочитай кнута какого-нибудь, если хочешь понять как работают все эти коллекции. Ибо в std большая часть кода это не реализация контейнера, а борьба погромистов с системой типов C++ для того чтобы сделать код как можно быстрее.
Нахуя? Если просто интересно почитать как реализовали ту или иную сущность именно в виде исходного кода, то лучше открыть исходники буста, т.к. разработчики компиляторов (а именно стандартной библиотеки) специально пишут пиздецки нечитаемый код, а в бусте все норм. А вообще это тоже будет хуевое занятие и лучше почитать какие-нибудь умные книги типа того же Кнута, Кормена, Седжвика.
На первой пикче основная функция, на второй вызывающая. Суть в том, что когда я с помощью функции input создаю и заполняю массив, при вводе в массив цифры 5, программа прекращает работу. Синтаксических ошибок нет. Если ввожу любые другие числа, всё окей, но пятёрка в массиве каким то чудом заставляет do while останавливаться
памагите
Пройдись дебаггером, да посмотри в чем проблема. Скорее всего, где-то в потоке остается. код не читал
Да хуй даже с VLA, тебя не смущает, что идёт попытка создать массив размера неинициализорованной не static переменной?
Нет, но gcc такое компилирует даже без варнингов (только при -Wpedantic уже пишет про это): https://gcc.godbolt.org/z/BI7DwI
С квадриплом не поспоришь.
Ну, хай стреляет себе в ногу, его дело.
>>61091
Если пятерка у тебя останавливает do...while, то это правильное поведение программы. Ты же ей так и сказал, что если ввел пятерку - то закончи работать, будь добра.
Или, все таки, ввод пятерки у тебя останавливает функцию input?
А ты не очень умный, да?
Иди тогда покупай описание текущего стандарта, что я могу тебе сказать, раз ты хочешь знать всё.
>ничего не понял и вернулся к велосипедостроению.
Новичку следует научиться абстрагироваться. std::map - это интерфейс, который подчиняется определенным законам. Все. Как он внутри устроен тебя волновать не должно.
Будешь постоянно полагаться на велосипеды (маааам, ну я не могу использовать код который не понимаю), хорошим программистом не станешь.
Хотел запилить православный свитч-кейс для стрингов, а мне провели вялым.
А с чего бы аллоцирующий память контейнер должен быть constexpr. Обешали завести только в будущих стандартах.
>>ничего не понял и вернулся к велосипедостроению.
>Новичку следует научиться абстрагироваться. std::map - это интерфейс, который подчиняется определенным законам. Все. Как он внутри устроен тебя волновать не должно.
>Будешь постоянно полагаться на велосипеды (маааам, ну я не могу использовать код который не понимаю), хо
хуйню сказал. Когда лезешь в хайлоад или оптимизацию (что иногда одно и то же), всё это охуенно важно.
Ой, перепутал)) Это в перле хеши - массивы.
на самом деле код контейнеров stl легко читать, когда поймешь, какие требования на них накладываются, в том числе безопасность исключений, модель управления памятью..
становится понятно зачем сделано так, а не проще..
Конечно важно, нужно знать как устроенны большинство функций stl и как минимум уметь самостоятельно их написать с нуля.
Вариант 4 исключен. Скопировал код из соурсов книги, результат тот же. Игнорирует последнюю последовательность цифр.
Никто, у тебя программа до сих пор ожидает ввод, т.к. cin.good() == true. Для окончания ввода, тебе надо его закончить (т.е. ввести EOF - Сtrl+D в Linux), либо "сломать" (т.е. ввести что-нибудь, отличающееся от числа).
Лол, я просто думал что как в винде EOF это ctrl+z, потому что тут оно тоже прерывало програму но не давала вывести последнее значение, спасибо
Алсо, есть отдалённый вариант вкатиться в байтоеблю с микроконтроллерами. Что скажут опытные байтоёбы, какие особенности у погромирования МК. Где то слышал что про многие плюшечки STL, а то и про всю целиком, придётся забыть.
Понятно что для МК Си более родной, но с ООП как то веселее, и код читаемей. И не забываем про trow catch.
> И не забываем про trow catch.
Про это как раз придётся забыть, ибо обычно под мк понимают совсем маленькие процессоры, где нельзя делать динамические аллокации (можно только на стеке). Потому большая часть STL тоже работать не будет.
Нет, нужно абсолютно все переменные объявлять как auto, при необходимости использовать decltype(auto)
Что еще с ним нельзя делать?
Ввел в кавычки текст и вставил после него #, так он просто его выводить отказался.
Долго ебался, пока не понял почему.
Странно. Сейчас перепроверил и он стал выводить.
Сообщаю, что динамические аллокации возможны всегда, где есть помимо стека, остальной объем ОЗУ. Это можно сделать даже с помощью элементарного массива - объявляешь статический массив побольше, и распределяешь из него память динамич. аллокациями. Даже не нужно подменять malloc - пишешь свои собственные функции аллокатора.
Эта хуйня про маленькие процессоры - это чушь собачья. Там критерий в том, что МК - это целый компьютер на одном кристалле, и предназначенный для встраивания и управления другой электроникой. МК самые разные бывают. Есть оче слабенькие 8-битные, меньше чем килобайтом ОЗУ, есть мощные 32-битные. К ним по-моему ещё внешнюю ОЗУ можно подключать.
Анон, тут много где может быть ошибка попробуй так:
(вызываешь ф-ю input)
input(mas,x)
(там где описываешь ф-ю input)
void input(int *mas, int count)
Ну и также попробуй с другой функцией.
Забей, до конца не прочитал.
Конкретно сам код стандартной библиотеки можешь не пытаться читать. Чтобы его полностью понять, тебе нужен как минимум iq 150. Стоит просто понять сам принцип работы той или иной функции, гуглиш просто std::map и всё. Велосипеды писать можно, но только в плане обучения, но в продакшене лучше использовать готовые либы.
> динамические аллокации возможны
Возможны, но никто их не делает. Памяти и так мало, а разбазаривать её на фрагментацию никто не будет. Плюс динамические аллокации делают программу непредсказуемой и опять таки вносят непредсказуемые задержки. Поэтому усложняется WCET-анализ, плюс появляется возможность у программы упасть в любой момент из-за того что свободная память закончилась (из-за фрагментации).
А с эксепшонами вообще хуита. Для их обработки нужны специальная поддержка в рантайме, плюс информация для эксепшонов занимает очень дохуя места. Прочитай ради интереса: [1].
Конечно, если речь идёт об мк уровня raspberry pi, то никаких проблем с динамической аллокацией и эксепшонами нет. В остальных случаях динамическую аллокацию нужно использовать очень осторожно, а про эксепшоны лучше забыть.
[1]: https://devblogs.microsoft.com/cppblog/making-cpp-exception-handling-smaller-x64/
>в продакшене лучше использовать готовые либы
В std::map мало того, что бинарный поиск, так еще и аллокация на каждый элемент. Лучше свой словарь навелосипедить, если нужна хоть какая-то производительность.
Спасибо
>std::map мало того, что бинарный поиск, так еще и аллокация на каждый элемент
эээ..
это не так..
или ты троллишь что ли?
>Чтобы его полностью понять, тебе нужен как минимум iq 150
не нужно
там основная сложность, повторяюсь, это обеспечение безопасности исключений
дело это в стандарт протолкнул саттер с товарищами, но с другой стороны в его книжках объясняются детали реализации, так чтож все понятно становится
так же во всех контейнерах работа с памятью вынесена на уровень аллокаторов, что так же правильное решение, но с другой стороны несколько затрудняет чтение исходников stl
до новых стандартов механизм аллокаторов в stl был, к сожалению, трудно реализуем на практике
было несколько обсуждений на rsdn, к примеру
поэтому и не использовали stl для программирования микроконтроллеров или для драйверописания, хотя по факту уже и писали на компиляторах, поддерживающих с++, те писали на приплюснутом си
сейчас же это возможно стало, но, дело в латентности индустрии, придпочитают олдскульную лапшу из макросов и самодельные контейнеры
Нахуя? Если ты безработный и тебе это нравится, нет вопросов.
В противном случае не понятна мотивация.
>это не так..
Во всех библиотеках именно так. И в gnu и в майкрософтовской. Красно-черное дерево с бинарным поиском и аллокация на каждый элемент.
>Что по новым стандартам прилично использовать в for циклах: size_t или обычный int?
Давай, подумаем, нахуя тебе цикл. Если у тебя цикл типа
for(... i ...) {
yoba = f(yoba);
}
то лучше использовать range based for. Однако тебе нужен именно size_t. Значит цикл у тебя например типа
for(... i ...) {
yoba = (yoba[i+1], yoba[i-1])/2;
}
И тут возникает засада. i-1 - это signed выражение. А ты хочешь использовать size_t. Выглядит это так себе.
Поэтому unsigned типы прилично не использовать вообще.
https://google.github.io/styleguide/cppguide.html#Integer_Types
Unsigned integers are good for representing bitfields and modular arithmetic. Because of historical accident, the C++ standard also uses unsigned integers to represent the size of containers - many members of the standards body believe this to be a mistake, but it is effectively impossible to fix at this point. The fact that unsigned arithmetic doesn't model the behavior of a simple integer, but is instead defined by the standard to model modular arithmetic (wrapping around on overflow/underflow), means that a significant class of bugs cannot be diagnosed by the compiler. In other cases, the defined behavior impedes optimization.
That said, mixing signedness of integer types is responsible for an equally large class of problems. The best advice we can provide: try to use iterators and containers rather than pointers and sizes, try not to mix signedness, and try to avoid unsigned types (except for representing bitfields or modular arithmetic). Do not use an unsigned type merely to assert that a variable is non-negative.
Я использую int'ы. Это не совсем правильно с точки зрения стандартов, но вероятность того, что мой контейнер случайно окажется размером больше 2 миллиардов элементов меньше, чем очередная хуйня, когда unsigned тип становится меньше нуля и улетает в за пределы обозримой вселенной.
>Что скажут опытные байтоёбы, какие особенности у погромирования МК
Любые. Микроконтролелером сейчас может оказаться пик за 10 рублей, 100 МГц арм за 100 рублей (но в нем мало памяти), или система на кристалле, в которой этой памяти как в пеке пятнадцатилетней давности.
Для твоей софтины 64К арма может оказаться просто вагоном места, а может придется статически выделять память и считать каждый байт.
Главная особенность в том, что без знаний электроники, хотя бы базовых, ты нахуй никому не нужен там.
>Что по новым стандартам прилично использовать в for циклах: size_t или обычный int?
Давай, подумаем, нахуя тебе цикл. Если у тебя цикл типа
for(... i ...) {
yoba = f(yoba);
}
то лучше использовать range based for. Однако тебе нужен именно size_t. Значит цикл у тебя например типа
for(... i ...) {
yoba = (yoba[i+1], yoba[i-1])/2;
}
И тут возникает засада. i-1 - это signed выражение. А ты хочешь использовать size_t. Выглядит это так себе.
Поэтому unsigned типы прилично не использовать вообще.
https://google.github.io/styleguide/cppguide.html#Integer_Types
Unsigned integers are good for representing bitfields and modular arithmetic. Because of historical accident, the C++ standard also uses unsigned integers to represent the size of containers - many members of the standards body believe this to be a mistake, but it is effectively impossible to fix at this point. The fact that unsigned arithmetic doesn't model the behavior of a simple integer, but is instead defined by the standard to model modular arithmetic (wrapping around on overflow/underflow), means that a significant class of bugs cannot be diagnosed by the compiler. In other cases, the defined behavior impedes optimization.
That said, mixing signedness of integer types is responsible for an equally large class of problems. The best advice we can provide: try to use iterators and containers rather than pointers and sizes, try not to mix signedness, and try to avoid unsigned types (except for representing bitfields or modular arithmetic). Do not use an unsigned type merely to assert that a variable is non-negative.
Я использую int'ы. Это не совсем правильно с точки зрения стандартов, но вероятность того, что мой контейнер случайно окажется размером больше 2 миллиардов элементов меньше, чем очередная хуйня, когда unsigned тип становится меньше нуля и улетает в за пределы обозримой вселенной.
>Что скажут опытные байтоёбы, какие особенности у погромирования МК
Любые. Микроконтролелером сейчас может оказаться пик за 10 рублей, 100 МГц арм за 100 рублей (но в нем мало памяти), или система на кристалле, в которой этой памяти как в пеке пятнадцатилетней давности.
Для твоей софтины 64К арма может оказаться просто вагоном места, а может придется статически выделять память и считать каждый байт.
Главная особенность в том, что без знаний электроники, хотя бы базовых, ты нахуй никому не нужен там.
>Лучше свой словарь навелосипедить
Это никогда не лучше. У тебя целый гитхаб с тоннами либ под любыми требованиями, и в эти либы вложены гораздо большие усилий, чем ты способен представить. Фейсбуком каким-нибудь.
То есть, если производительность не нужна, берешь map и складываешь туда свой конфиг. Если нужна - берешь хорошую нестандартную либу. Места велосипедам просто нет.
Исключение, если ты сам работаешь в корпорации уровня фейсбука и написать либу с нуля силами программистов с зарплатой $100к в год тебе проще, тем иметь зависимость. Но маловероятно, что это твой случай
Ты правда считаешь, что написать свой контейнер - это неебическое достижение, недоступное простым смертным?
Нет, это ты так считаешь.
Я считаю, что это рутинная работа для таджиков от мира программирования с соответствующим результатом.
>Нет, это ты так считаешь.
С чего ты взял? Если мне нужен свой контейнер - я беру и пишу без задней мысли. Без поисков на гитхабе и размышлений о зарплатах фейсбучных программистов.
>работа для таджиков от мира программирования с соответствующим результатом.
Не понял тебя. Это в комитете таджики работают или в фейсбуке?
>Если мне нужен свой контейнер - я беру и пишу без задней мысли.
Покажи скрин заголовочного файла - посмеемся.
Качественный контейнер, с учётом кэшей процессоров и с максимальной производительностью - да, считаю. Попробуй напиши что-то уровня Swiss Table hash map [1].
[1]: https://github.com/abseil/abseil-cpp/blob/master/absl/container/internal/raw_hash_set.h
Что и требовалось доказать. Можешь не показывать - контейнеров уровня laba2.cpp в своей жизни видел достаточно.
Рождаются они простым образом - тупой мане СЛОЖНА разбираться в сложном коде крестовых либ, и он пишет свой кривой велосипед, который имеет 10% функциональности нормального контейнера.
А что касается таджиков, то если тебе интересно писать такой код, то ты даун. Если же ты не пишешь такой код, то ты типичный мудак с самописными контейнерами.
std::pair<iterator, bool> emplace(value_type&& value) {
return insert(std::move(value));
}
size_type erase(const key_type& key) {
iterator it = find(key);
if (it == end()) {
return 0;
}
m_.cont_.erase(it);
return 1;
}
iterator erase(iterator it) {
return m_.cont_.erase(it);
}
iterator erase(iterator first, iterator last) {
return m_.cont_.erase(first, last);
}
iterator find(const key_type& key) {
return find(this, key);
}
const_iterator find(const key_type& key) const {
return find(this, key);
}
И так далее, сотни строк бойлерплейта.
>>61468
Какие кэши, пусть покажет, как он соблюдает exception safety, семантичность, сделал поддержку аллокаторов, все соглашения для итераторов и протестировал все.
Что и требовалось доказать. Можешь не показывать - контейнеров уровня laba2.cpp в своей жизни видел достаточно.
Рождаются они простым образом - тупой мане СЛОЖНА разбираться в сложном коде крестовых либ, и он пишет свой кривой велосипед, который имеет 10% функциональности нормального контейнера.
А что касается таджиков, то если тебе интересно писать такой код, то ты даун. Если же ты не пишешь такой код, то ты типичный мудак с самописными контейнерами.
std::pair<iterator, bool> emplace(value_type&& value) {
return insert(std::move(value));
}
size_type erase(const key_type& key) {
iterator it = find(key);
if (it == end()) {
return 0;
}
m_.cont_.erase(it);
return 1;
}
iterator erase(iterator it) {
return m_.cont_.erase(it);
}
iterator erase(iterator first, iterator last) {
return m_.cont_.erase(first, last);
}
iterator find(const key_type& key) {
return find(this, key);
}
const_iterator find(const key_type& key) const {
return find(this, key);
}
И так далее, сотни строк бойлерплейта.
>>61468
Какие кэши, пусть покажет, как он соблюдает exception safety, семантичность, сделал поддержку аллокаторов, все соглашения для итераторов и протестировал все.
> Какие кэши
L1, L2, L3. Судя по тону, видно, что для твоих поделий они не важны, но вот для больших данных это очень важно. Иногда бывает так что для небольшого числа объектов простой массив с кортежом ключ-значение и перебором работает быстрее хэш-мапа потому что полностью вмещается в кэш процессора, в отличии от последнего, а значит на доступ к ОЗУ не тратится времени вообще.
> как он соблюдает exception safety
Никак. В abseil почти все методы помечены как noexept, потому что эксепшоны понижают производительность. Так что если твой говнокод выбрасывает эксепшон внутрь библиотеки, то скорее всего она просто вызовет std::terminate().
Всё остальное совместимо с std.
Впрочем это никак не отменяет, что написать такую библиотеку просто васян выучивший С/C++ не сможет. Непонятно к чему ты высрал свой ответ мне.
>соблюдает exception safety, семантичность, сделал поддержку аллокаторов, все соглашения для итераторов и протестировал все.
Сначала ты объяснишь, зачем нужна вся бюрократия (кроме тестирования и итераторов), если я делаю контейнер под свою конкретную задачу, и снаружи библиотеки его никто не увидит?
>и он пишет свой кривой велосипед, который имеет 10% функциональности нормального контейнера.
Смысл велосипеда - как раз заиметь 10% нужной именно тебе функциональности без лишнего оверхеда и мозгоебства.
>Судя по тону
Хуясе ты шизик. Я о том, что ты требуешь от него слишком многого, а ты уже строчишь пост о том, какой я мудак, не оценил твою либу и вообще ответ высрал.
Бля, ты правда как шелдон из теории большого взрыва. Во фразе "не оценил твою либу" нет информации о том, что ты написал эту либу.
Ты вообще читаешь посты на которые отвечаешь? Я её привёл в пример как высококачественный контейнер, который средний программист никогда не напишет. А ты мне начал какую-то хуйню втирать.
У гугла политика разработки без эксепшенов. И не потому, что эксепшены это очень плохо, а потому, что у них огромная кодовая база, где будет хуева гора утечек с эксепшенами, код к ним не готов. Но ты, конечно, этого не знаешь.
Действительно, ты просто начал в ответ высираться не по теме. Ещё и шизиков под кроватью искать начал. Видимо слишком много программировал на шаблонах, мозги к общению уже не приспособлены. Только срать и можешь.
Вообще они явно пишут в описании библиотеки что сделано это для пирформанса. А ты путаешь причину и следствие.
>Смысл велосипеда - как раз заиметь 10% нужной именно тебе функциональности без лишнего оверхеда и мозгоебства.
А в итоге ты получаешь оверхед и мозгоебство. Вместо того, чтобы просто взять работающую вещь. Сложна ведь. Ведь это код, который писал НЕ ТЫ. О ужас.
Чувак, когда я писал пост: "Какие кэши, пусть покажет, как он соблюдает exception safety, семантичность, сделал поддержку аллокаторов, все соглашения для итераторов и протестировал все", только тупой аутист не смог бы увидеть выражение согласия. Ты не увидел и начал спорить. Я охуел с таких раскладов.
Под этим словом я имел в виду наличие всего набора конструкторов с правильным кодом внутри них.
На самом деле пиление собственный контейнеров лучший способ возненавидеть С++ по-моему.
Тогда всё. Вопрос закрыт.
Я думал ты ко мне обращаешься, мол я должен показать как моя лол библиотека соблюдает всё это, а иначе она говно.
Нет, лучше ты поебёшься с моей тульпой, а я буду рядом сидеть в поясе верности и писать код на шаблонах.
>Вместо того, чтобы просто взять работающую вещь. Сложна ведь. Ведь это код, который писал НЕ ТЫ.
Не понимаю твою логику. Если бы была рабочая вещь, я бы велосипеды не писал. Например, миллион вариаций intrusive list, которые все немного отличаются друг от друга. Универсальный если и можно написать, то это будет пиздецома из темплейтной магии. Тут проще писать велосипед под ситуацию.
NIH - синдром, кстати, не на пустом месте берется. Часто обтесывать что-то универсальное сложнее, чем написать свое. Потому что авторы "универсального" решения твой конкретный случай просто не предусмотрели, и приходится городить уродливые велосипеды поверх "рабочей вещи".
Как минимум move-конструкторы с пометкой noexept быстрее тех, которые потенциально могут выбрасывать эксепшоны. Тут вопрос стоит в оптимизациях, которые может сделать конпелятор и эксепшоны могут сильно его ограничивать в этом.
>Эксепшены бесплатны
Бесплатны когда не используются. Когда эксепшн бросается, то оверхед на поиск хендлера там достаточно большой.
обычно пишут это "охуенные" перцы типа чела сверху, через годик сваливают на свежий проэкт, а челяди потом страдай
ах, да, самая мякотка - зачастую пишется все это под большую нагрузку
но клиентская база не набирается, проект выстреливает, но слабенько
и вся эта мега-система нагружается процентов на 10%, а кода то дохуя понаписано, типа с учетом расширяемости и прочего говна
так и шевелится потихоньку
Вот это обосрамс. Тебе в жаба тред нужно.
кресты становятся все более узкоспециализированным языком, что используются в нескольких сферах
число вакансий с каждым годом меньше, в то время как специалистов не становится меньше
Тогда вкатываюсь в ядро, пилю гипервизоры. Становлюсь кернель/кор/енджин архитектором, перекатываюсь в шышыа. Подводные?
Зачем тебе кресты вообще для вкатывания? Это ультрахард-мод. Выбери стек попроще.
А если к примеру потратить на изучение 2-3 месяца а потом внезапно перекатиться на другой язык, эти 2-3 месяца совсем в пустую будут потеряны или в чем-то это поможет если вдруг не осилю совсем? мимодруговкаталец
Эксцепшены - это источник проблем в ряде случаев. Вот некоторые сценарии, о которых я знаю (из своего опыта):
- Многопоточная прога. Главный поток запускает выполнение некоторого действия во вспомогательном потоке. Действие может обвалиться с ексцепшеном. Ты его должен естественно перехватить там, во вспомогательном потоке. Причём, в том числе с помощью catch(...) {} (т.е. без указания конкретного типа ексцепшена). Ты не можешь ексцепшен передать в главный поток. Особенно, когда ты не указываешь конкретный его тип. Вот допустим, там в главном есть некое место, где проверяется, выполнено ли уже наше действие во вспомогательном потоке, или нет. А если выполнено, было бы круто ексцепшен из вспомогательного ввернуть прямо сюда, и обработать всю эту бадягу. Но нет - так невозможно.
- Смешение различных языков. Допустим, у тебя есть прога на C++, которая использует библиотеку на C. Например, эта библиотека для работы с jpeg файлами. Там, есть возможность предоставить callback для чтения самого этого файла. Ты его реализуешь в твоей проге на C++. Но ексцепшены бросать из него ты не можешь, хотя хотелось бы, чтобы они достигли твоей главной проги, пройдя сквозь код библиотеки. Не можешь ты бросать, т.к. это может поломать всё внутри C-шного кода. И тут засада. Т.к. например, C-шная библиотека может молча сглотнуть ошибку в callback-е, и вызывать его снова и снова до посинения. Или может вернуть некий обобщённый флаг "Ошибка", не раскрывая её сути. Ексцепшен же мог бы прекратить всю эту шизу на корню (хотя впрочем я не очень прав. другая библиотка может перехватить исключение и заглушить его точно так же). И ексцепшен может донести инфу до основного тела проги во всей её полноте.
бла-бла-бла
страуструп ввел инсключения в крестах по вполне практическим соображениям, а именно чтобы возвращать ошибки из конструкторов и при пользовательских перегрузках операторов
и тогда же предложил способы снизить зависимость от исключений - а именно не конструировать классы напрямую, а делать различные фабрики, в том числе и универсальные
а при проектировании классов помимо пользовательских операторов добавлять методы доступа, дублирующие функциональность операторов, но возвращающие код ошибки, а не бросающие исключение
таким образом, исключения изначально предполагались лишь как некое узкоспециализированное средство для решения конкретных проблем, возникающих при проектировании иерархии классов, но не как универсальный способ обработки ошибочных ситуаций
как всегда, лучший способ - срединный путь, а именно использовать исключения только там где они нужны и все
>эти 2-3 месяца совсем в пустую будут потеряны или в чем-то это поможет
Если с си начнешь - поможет. С С++ - только время потеряешь, потому что в большинстве книг обычно вначале дают ООП, а оно в крестах своеобразное, и этот опыт мало куда применить можно.
>потратить на изучение 2-3 месяца
в конце третьего месяца ты, конечно же, будешь ебашить обобщенные лямбды, статический полиморфизм с использованием crtp и заниматься кодогенераций через метапрограмирование с использованием value-based подхода, потому что путь через частичную специализацию уже давно не тру!
Ну в основе то ядро. И кто-то должен все это дело поддерживать. Вангую в 20 годах будет повторение 80ых, вон сколько уязвимостей в архитектурах обнаружено за последние пару лет, будут все переделывать.
как же меня это бесит. ему рассказывают про существенные, такие, вещи - а он "бла-бла-бла". вот думал - ладно там всякий сброд с улицы. с ним всё понятно, что мудаков и придурков там выше крыши. но мы-то, программисты, вроде вменяемые все люди, поймём друг друга, и найдём общий язык. увы, я страшно ошибался. мудаки проникли буквально повсюду, даже среди нашего круга. вот прямо сейчас с ним я общаюсь. мир прогнил до основания, увы. и завтра коллега-программист, устроит подлянку и какую-нибудь пакость другому программисту. выебет его жену, и выкинет на мороз и из работы, и из семьи
как всегда, бла-бла, срединный путь, бла-бла. исключения следует использовать там, где они приносят пользу. особенно, если дают преимущества перед иными методами обработки ошибок. они позволяют сократить объём кода. не проверять коды ошибок на каждый чих, выписывая их обработчики. то для чего они там придумывались, дело десятое. творение ушло из-под контроля автора, и начало жить своей жизнью. про конструкторы - да, они там приносят пользу.
не нормально, там ничего запредельного нет, по сути объяснение технических моментов
сложности начинаются когда пытаешься спроектировать библиотеки или прикладной код с использованием новых средств
если говорить образно, в этой книжке описывается как точить топор и править зубъя пилы, а не как с помощью этих инструментов строить дом
исключения в с++ нужны для обработки ошибочных ситуаций в конструкторах и пользовательских операторах
точка
а?
я то конкретно написал, в отличие от
https://github.com/sonoro1234/LuaJIT-ImGui
Что делает строчка в CMakeLists.txt? get_target_property(SDL_INCLUDE SDL2::SDL2 INTERFACE_INCLUDE_DIRECTORIES)
Как ему можно ее задать в ручную?
>метапрограмирование
Честно, я боюсь появления метаклассов, потому что считаю, что они могут наворотить кучу хуже самой тёмной темплейтной магии. Это нормально?
У меня слабая база было до прочтения книги, один Шилдт
Так я не совсем с нуля. Вкатывался с аутоита, жс, питона и C#. Но это все либо веб-помои, либо клепание формочек. Хочу системщины.
Поддвачну. Лучше бы макросы как в расте сделали, где хоть с системой типов бороться не надо генерируя нечитаемый говнокод, а тупо хуячишь кодогенерацию на нормальном языке (по сути пишешь плагин для конпелятора), а компилятор сам следит за областью видимости переменных.
нет, вообще не точка. в конце-концов, не нам решать за всех, как им применять исключения. иные в них находят даже способ элегантно выйти из вложенных циклов, рекурсивных вызовов и прочей марахайки.
каждый дрочит как он хочет
Это в реалиях C++, где выхлоп макроса имеет область видимости такой же как и у определения макроса. В расте у макроса область видимости ограничена только определёнными внутри выхлопа макроса переменными и аргументами и любые глобальные переменные недоступны.
>Это работает, если че
А почему оно не должно работать? Можешь написать +1-1+1-1... и оно тоже будет работать.
Да ниче, прикольно просто.
Такая-то обфускация))))
>любитель повыпендриваться какой он умный
>аниме аватарка
Лол
Алсо,
>венгерская нотация
Это член класса CWinApp, от которого наследуется класс. Это MFC приложение, если че. Вы наверное в своей шараге его еще не проходили
Двачую. Помню увидел в каком-то крутом опенсурсе m_ приставку и начал везде ее приписывать не зная что это. Когда узнал, дико проигрывал с себя.
В конце каждого кейса пиши break.
Ну и свитч тогда должен быть в цикле. Посмотри выше, там где-то у анона с проблемной пятёркой в массиве был код такого свитча.
https://github.com/sonoro1234/LuaJIT-ImGui/blob/master/CMakeLists.txt
вот в этом
72 строка get_target_property(SDL_INCLUDE SDL2::SDL2 INTERFACE_INCLUDE_DIRECTORIES)
Она что делает? Я ей уже куда только эти инклуды сдла не пихал. Все остальное видит, а эту хрень - нет. Я так понял, что она и создает переменную SDL_INCLUDE, только вот вот откуда она ее грузит не понимаю.
Нет, в приличном обществе теперь совсем без if и for, только ооп или функциональщина.
>Это MFC приложение, если че. Вы наверное в своей шараге его еще не проходили
MFC где-то кроме шараг проходят?
Я наоборот слышал что ООП не актуаелен, ну в других языках.
Справедливости ради в нормальных языках все циклы спокойно заменяются лямбдами и специальными функциями для итераторов. C++ очень особенный в этом плане, что у него нереально ебанутые итераторы и функции для работы с ними. В С++20 что-то там пытаются упростить при помощи ranges, посмотрим что у них получится.
Ты можешь пример кода привести? Я ньюфаг и не понимаю, как можно заменить базовые конструкции if/else и циклы for.
>вот в этом
Это cmake. Он от мейка отличается как джава от джаваскрипта.
>Она что делает?
Она работает только если SDL_IMPL включен, и у тебя несистемная версия SDL. Тогда все переменные ты сам должен задать, например через define_property.
Я другой анон, но
1) тернарный оператор. Не совсем замена if/else, но все же. Однако в прошлом(или позапрошлом) треде были разборки, что все же лучше.
2) range based for - не совсем замена, но уже не for со счётчиком. А вообще - std::for_each, std::find и т.д.
Так ты за одну операцию считывания хочешь несколько срабатываний кейса? Интересный ты.
Хоть код заскринь, покажи нам.
Но тернаный оператор это же пиздец и считается плохим тоном. Не уверен что его вместо if/else используют.
>std::for_each
Но это же просадки по пермофансу, нет? И по сути оболочка над тем же циклом for.
Спасибо, что хотя бы указал куда копать.
Т.е. мне перед этой строчкой просто вставить такую define_property(SDL_INCLUDE с:\SDL2\include)
>Так ты за одну операцию считывания хочешь несколько срабатываний кейса? Интересный ты.
За несколько операций считывания.
Нажал первый раз - вывел кейс 1.
Нажал второй раз - вывел кейс 2.
А он после первого выводит кейс 1, а после второго закрывает окно вывода.
Только я во втором примере перепутал местами if/else. Но я не PRO, а только учусь.
Ну, когда как. Как по мне - иногда можно и использовать: у меня было два разных map-а, и в зависимости от результата тернарного оператора выбирался нужный для вставки, а с ифом было бы больше кода.
А насчёт стоимости функций из <algorithm> - не в курсе, на самом деле. Но выглядит лаконичнее, однако.
Ну или заменить constexpr на static. Всё равно я его только для КРУТОСТИ добавил. Так от него толку и нет.
Пиздец, эти кресты блять как болото какое-то. 3 месяца учу, нихуя в итоге не понимаю до сих пор. На работку планирую в 20-21 году, мне вообще нужно учить старые стандарты? 11 там, 14? Или лучше полировать 17 и готовиться к 20?
Уууух, разобрался.
Я вместо того, чтобы пихать все варианты в один свитч, сделал для каждого отдельный.
Свитч-вариант.
Свитч-вариант.
Там должно быть что-то вроде:
bool flag = true;
int I;
while (flag)
{
std::cin >> i;
switch(i)
{
case 1:
...
break;
case 2:
...
break;
default:
//Exit
flag = false;
}
}
Мог накосячить где-то, на самом деле.
У тебя как выглядит? Принеси уже свой код.
Я разобрался сделав три свитча. И сделал файлы, ибо объяснял всрато.
Но у все равно есть вопросы. Не всратый ли это вариант решения моей проблемы? Может лучше есть?
Как же прекрасно создавать переменную когда тебе это захочется, а не как вонючем паскале боже упаси как его забыть.
Да, да, это тот от вида кода которого тут плевались. Для меня так удобно.
я тоже не магистр кодинга, но я бы сделал так.
>не всратый ли это вариант
Всратый. По сути, теперь каждый твой свитч - это просто if. Разве что ты сохраняешь в отдельный массив макс/мин/среднее, иногда это требуюта вдруг Вам надо будет использовать это после?. Но это решается вводом вектора под результат и заменой std::cout на result.push_back(std::min/max/accumulate(...)), а потом пройтись по нему и вывести каждый элемент.
>как же прекрасно создавать когда тебе хочется.
Двачую, работаю PL/SQL-девлопером, долго отвыкал. Там тоже можно так, но по-уебански.
>Для меня так удобно.
Да пиши как хочешь, боже. Вон я каждый кейс выделяю фигурными скобками, if-ы тоже - даже если там один оператор всего.
Только будь готов к тому, что когда начнёшь работать в команде, тебя за такое будут ругать.
>>62261
Можно ещё для пущей правильности все vec.begin() и vec.end() заменить на vec.cbegin() и vec.cend() соответственно. Если не меняем элементы, то есть смысл взять константные итераторы.
А ещё почему-то std::min работает в этой ситуации, а std::max возвращает какой-то мусор. Судя по cppreference они не совсем для этого предназначены.
Потому max/min_element.
>Не всратый ли это вариант решения моей проблемы?
Научись сначала код форматировать. Сейчас это тупо читать больно.
Это всё стандартная библиотека, изучай потихоньку я тоже этим сейчас занимаюсь.
Твой код можно скомпилить как сишный(кроме комментов - это C++ стайл), а мой - уже нет, как раз из-за использования std.
А, да.
Не забудь в случае среднего разделить результать std::accumulate на vec.size(), т.к. эта штука только сумму элементов считает.
Унарный плюс кастует лямбду к указателю на функцию, да? У лямбды точно вызовется деструктор в таком случае?
Унарный плюс работает только с теми лямбдами, которые (1) могут быть приведены к указателю на функцию (потому auto-аргументы не работают) и (2) которым деструктор не нужен (потому захватывать ничего нельзя).
Ты настоящий PRO. Но в своём коде этим я пользоваться не буду.
Алсо, ещё один совсем уж выпендрёжеский способ избавиться от if/else -- branchless маскирование (x = cond ? b : c <==> x = (cond & b) | (!cond & c), или _mm_blendv_pd). Хотя это и в обычных сях можно.
Добро пожаловать в плюсы. Так писать не надо, но надо знать, что такое есть.
>int arr[] = {1,2,3};
а если это мебмер класса, то уже нет, он его сначала делает нулевым размером, а потом инициализирует, в итоге g++ выдаёт:
>too many initializers for 'int [0]'
А clang:
>array bound cannot be deduced from an in-class initializer
Я так понимаю, проблема в том, что декларация и инициализация class member'ов происходит раздельно, в отличие от переменных? Ткинте, пожалуйста, в какое-нибудь информативное описание этого, не помню, чтобы такие детали упоминались во всяких типичных книжках о классах.
ну у меня с файлами проблемы, я не могу понять как это написано и что выполняет, а не понимая суть сложно написать.
Нахуя вообще такой блядский код писать? Чтобы потом самим запутываться и никакого плюса производительности он не дает.
Тебе в C тред с такими вопросами, либо перепиши без void((f[]())()
Код на скрине просто берёт и побайтово копирует память из адреса A в адрес B, промежуточно пихая его в в char массив Mas, который, видимо, и будет писаться в файл, а при загрузке данных из файла ты получишь тот же массив Mas.
Найди, как записать данные в файл бинарно, как прочитать бинарный файл. Вставь этот на строке до "//Десериализация" и готово.
Бля чел, ну прям очень говнокодом воняет. Почему бы просто все не сделать через else if. Зачем ты каждый раз, для нового свича, создаешь новую переменную v. Ты можешь просто создать одну и в неё все записывать. Я уже даже не говорю от том какие ты создал функции и как ты их используешь.
Ты этот вопрос неделю назад задавал. Я тебе код скинул, как сериализовать и десериализовать из файла. Но ты походу нихуя не понял. Ты сначала подучи, что такое указатели, массивы, байты, адреса, это элементарные вещи в C++. И только потом сериализацией занимайся.
Говорю, поставь себе студию или хотя бы Dev C++, он поможет тебе форматировать код.
Ты че, долбоёб?зачем я спрашиваю - анимешник же
Нахуя тебе свитч только для одного case?
Выкатывайся - программирование не для тебя.
> не сделать через else if
Уже понял что с ним лучше.
>Я уже даже не говорю от том какие ты создал функции и как ты их используешь.
Что с ними не так?
Можно ли самому захуярить отрисовку через opengl/vulkan всякие?
>Можно ли самому захуярить отрисовку через opengl/vulkan всякие?
Смотря что тебе нужно. Берешь что-то вроде imgui или nanovg и хуяришь.
Лучше rust или go ботай. Там зарплаты выше и проекты интересней. Кресты - это или легаси вилкой ковырять или в геймдеве работать по 100 часов в неделю.
Потому что аналогов нет. Си слишком пиримитивный, а всё остальное слишком медленное. Если бы в D не впихнули полу-обязательный GC (без которого даже сегодня стандартная библиотека работать не будет), быть может он и взлетел.
Впрочем некоторые спокойно пишут на юнити с шарпом или даже на жаве.
Ну и возможность придумать свой собственный ЯП и приделать к нему LLVM в качестве бекэнда появилась относительно недавно, да и всё равно требует огромных вложений.
Гейдев это либо Unreal Engine (C++), либо самопальный говнодвижок (Обычно C++), либо Unity3D (C#).
В 99% для нюфань это будет юнити, по-этому лучше шарпы ботать.
В небольших студиях или одиночки редко берут эти варианты, поэтому нюфане эти движки учить не стоит.
какие неосиляторы, клоун? То, что я не пишу такой говнокод, это не значит, что я не могу его писать.
Есть вакансии cpp/java to rust. Там зп раза в полтора больше будет, чем у плюсовика того же уровня
>не использует последние паттерны языка
>это говнокод
Понятно уже, что ты дебил, только не плачь
Причем тут паттерны?
Шарпы редкостное дерьмо, недавно писал на них, просто разрыв глаз, как на таком помое только пишут.
в целом я понял, просто детали осталось понять, в группе ебоклаки просто копируют и готово, я так хуй чё смогу потом, нужно идеально понимать, чтобы применить в разных ситуациях, почти дописал функции, получилось что то такое, осталось чтение сделать, пока думаю как.
с твоего примера погуглил все команды, это понял, но у меня тут мешанина из си и крестов, и нужно это совместить, вот и пытаюсь понять.
методы fstream и как передать и вытащить это из файла, с этим сишным кодом, тоесть во второй функции, сначала достать из файла в массив, а потом уже десериализовать? Тогда ещё вопрос по .read() как он работает, если я хочу бинарные данные засунуть в массив, как корректная запись будет выглядеть?
наверни доусона книгу, в своё время охуенно мне помогла, материал преподносится оверохуенно.
Какая именно? Чем позднее, тем более актуальный материал или это последовательные части?
Как раз его нашел и листал, ну она не такая большая так что наверное наверну её, спасибо.
Ну охуеть, ты придумал jump table. Когда-то (лет 20 назад) я увлекался ассемблером под дос, так там такие хреновины сплошь и рядом встречались, особенно в свитчах. Но для двух значений делать jump table имхо перебор.
В твоем случае компилятор уже посчитал четверку во время компиляции и убрал нахрен таблицу функций.
> branchless маскирование
в какой-нибудь cuda хорошо заходит, где ветвление - это гроб-кладбище
но в твоем примере ХЗ как оно еще будет работать, если, скажем х - это какой-нибудь указатель
Жалко, что если сделать std::cin >> a; ни один из конпеляторов не сможет заинлайнить функции.
Я хуею с кучи указателей в ваших плюсах
fout.write((char )M, sizeof(M) * n);
Это для одномерного, а для двумерного как?
Ну можно сделать так:
[4B] - размер массива
{
[4B] - размер внутреннего массива
{[...], ...} - элементы внутреннего массива
} - элементы внешнего массива
То есть сохранять сначала размер массива, а потом его содержимое.
Допустим есть массив
{
{1,2,3},
{4,5,6,7},
{8,9,10,11,12}
}
Сначала записываешь количество элементов первого массива в виде 32битного значения (то бишь uint32_t). Затем по очереди записываешь внутренние массивы в такм виде: сначала количество (опять в виде uint32_t), затем все элементы по порядку. В итоге файл будет выглядеть как-то так:
3 3 1 2 3 4 4 5 6 7 5 8 9 10 11 12
Считываешь в таком порядке: сначала берёшь первый uint32_t - это будет размер внешнего массива, создаёшь его. Затем (ели размер больше нуля) считываешь следующий uint32_t - размер внутреннего массива, создаёшь его и копируешь данные (их количество уже известно) и так повторяешь для каждого внутреннего массива.
Открыл файл потоком, считал первую строку, в которой размерности массива написаны и пошел n раз считывать в массив размера m каждую строку.
Запись - ещё проще, записал размеры и просто всю строку передал потоку через <<.
Еба какую штуку нашел, надо запомнить:
std::ifstream f("test.bin", std::ios::binary);
std::vector<char> v(std::istreambuf_iterator<char>{f}, {});
>Я хуею с кучи указателей в ваших плюсах
Так используй векторы.
Вся сериализация десериализация должна быть написана на функциях или операторах типа << подобным образом:
template<typename T> void write_value(ostream stream, T yoba) {
stream.write(yoba, sizeof(T));
}
template<typename T> void write_value(ostream stream, vector<T> yoba) {
write_value(value(stream), yoba.size());
for (auto& y in yoba) {
write_value(stream, y);
}
}
Темплейты использовать не обязательно, можно обойтись и подобным полусишным кодом:
void write_int(ostream stream, int yoba) {
stream.write(yoba, sizeof(int));
}
void write_1d_int_vector(ostream stream, vector<int> yoba) {
}
void write_2d_int_array(ostream stream, vector<vector<int>> yoba) {
}
или опримитивиться до сишных массивов (но с длинами в 2д случае будет не очень приятно):
void write_int(ostream stream, int yoba);
void write_1d_int_vector(ostream stream, int@ yoba, int length);
void write_2d_int_array(ostream stream, int@@ yoba, int length1, int length2);
но в любом случае это должны быть функции такого рода, а не типичное для laba.cpp сериализация по месту написания кода
>Я хуею с кучи указателей в ваших плюсах
Так используй векторы.
Вся сериализация десериализация должна быть написана на функциях или операторах типа << подобным образом:
template<typename T> void write_value(ostream stream, T yoba) {
stream.write(yoba, sizeof(T));
}
template<typename T> void write_value(ostream stream, vector<T> yoba) {
write_value(value(stream), yoba.size());
for (auto& y in yoba) {
write_value(stream, y);
}
}
Темплейты использовать не обязательно, можно обойтись и подобным полусишным кодом:
void write_int(ostream stream, int yoba) {
stream.write(yoba, sizeof(int));
}
void write_1d_int_vector(ostream stream, vector<int> yoba) {
}
void write_2d_int_array(ostream stream, vector<vector<int>> yoba) {
}
или опримитивиться до сишных массивов (но с длинами в 2д случае будет не очень приятно):
void write_int(ostream stream, int yoba);
void write_1d_int_vector(ostream stream, int@ yoba, int length);
void write_2d_int_array(ostream stream, int@@ yoba, int length1, int length2);
но в любом случае это должны быть функции такого рода, а не типичное для laba.cpp сериализация по месту написания кода
Блять наконец сделал эту хуйню, загвоздка была в том, что я не знал как ввести из файла, через read не получалось, через 2 часа нашёл что можно file>>array, и сработало, либо сегодня у препода попрошу обьяснить файлы, либо работа с файлами в дальнейшем будет пулями а я нео, но это такое себе, на жабу перейду потому что в ЕРАТ хочу распределиться, а вдруг там тоже есть, нужно вникнуть, но я чуть не выпилился, вроде всё знаю, лабы ебу как говно, а ебаные файлы уже год преследуют и всегда туплю.
Только учти, что тебе нужно не столько файлы, а сколько потоки у него спросить.
Ты-то с файлом можешь работать как с cout/cin, через << и >>, но там тоже свои загвоздки есть. Тебе повезло, что у тебя в файле все было "одинаковой" структуры.
Например, в bmp-файле тебе надо будет считать два разных по размеру хедера и сами данные, а >> если и справится с такой хуйней, то с бубном - я только через ifstream::read() как раз делал.
А это, как понимаешь, не единственный вид потоков в плюсах.
И нет, в джаве такого нет, не парься.
>книга по изучению языка
>всё равно читать жопой и не понимать
>идти на двач спрашивать
>встречайте новое поколение программистов
Писать код. Ничего более. Опционально - смотреть всякие сипипиконы
как минимум предикаты для алгоритмов. И всякая функциональная параша вдогонку.
даже в сишечке это использовалось в qsort.
Использовалось для колбеков, сейчас завезли функциональные объекты и т.п.
Чтобы не писать на хаскеле.
в си необходимейшая вещь
системы компонентного программирования (com, gtk), вообще любой интерфейс к сложной либе основывается на комбинации структур и указателей на функции
небходимы для параметризации поведения (не данных), необходимы для ручной реализации динамического полиморфизма, вообще для эмуляции элементов ооп и функциональных парадигм
плюс механизм dynamic loading библиотек основывается на получении адресов функций из библиотеки и вызов их по указателю..
да много чего еще..
вообще любая сложная система сделанная на си, будет состоять по итогу из мешанины макросов, структурок и указателей на функции..
ебануться, а более умного ничего не могли придумать? У меня так одногрупник на 1 курсе имена переменных давал
Ну, неймспейсы есть, и даже используются, однако так всё равно делают.
Твой вариант?
Ладно, скажу проще. Мне нужно равномерное распределение по заданному диапазону целых чисел.
Ну еб твою, стандартная библиотека тебе на что: https://en.cppreference.com/w/cpp/numeric/random/uniform_int_distribution
>>63125
В том, что первый вариант не компилируется. А если я правильно понял то, что ты хотел, то вот: https://gcc.godbolt.org/z/DM_fUr
На интуитивном уровне могу сказать, что в первом случае у тебя есть шаблонный конструктор, который принимает ссылку на объект Ui<T>, где T может не совпадать с типом T у объекта, у которого вызван конструктор копирования (есть небольшие сомнения, что компилятор пропустит такой трюк). Во втором случае это обычный конструктор, принимающий ссылку на объект Ui<T>, где T такой же тип, как у класса объекта, у которого вызывается конструктор
Мог сказать полную хуйню, пусть более умные аноны поправят
aspect_x = ScreenWidth / ImageWith
aspect_y = ScreenHeight / ImageHeight
Умножаешь х и y на координаты мыши
Можно в любом месте, у тебя вообще может не быть хидеров.
Оба варианта компилируются. Но по примеру понял, что шаблон для конструктора копирования даёт возможность копировать объекты разных типов, а без шаблона нужно только точное соответствие.
>шаблон для конструктора копирования даёт возможность копировать объекты разных типов
тут есть несколько тонких моментов - как минимум, этот шаблон НЕ отменяет того что сгенерится и конструктор по умолчанию
НО при этом этот шаблон будет обеспечивать более лучшее соответствие чем неявно сгенерированный конструктор
при этом есть различные техники (считай трюки), улучшающиеся от стардарта к стандарту, как это поведение обойти, щас делают через стандартизированный enable_if уже
то же касается и перегруженных операторов для копирования или перемещения
алсо в будущем потобное можно будет делать через концепты
10/10 супер-дебильный вопрос.
Начнем с того, что в программировании не существует функций, это математическая абстракция, а пока еще не изобрели математических процессоров, так что функций у тебя нет, это фикция от дебилов для дебилов.
А есть в программировании только подпрограммы(процедуры), но это тоже фикция, а реально есть только код - портянка инструкций сверху-вниз и переходы goto. Так вот, подпрограмма это всего лишь кусок кода на который делается goto, а в конце его делается goto обратно откуда был первый goto.
Как работает goto? Ты пишешь goto <АДРЕС>, то есть указатель на целевой код, куда перейти.
Теперь к практике. У тебя есть подпрограмма которую дебилы называют функцией moya_func(). Как ты собираешься её вызвать (передать на неё управление) без её адреса, дебил ёбаный? Куда переходить собрался, петухан?
Для вызова ты печатаешь в коде: moya_func(); это лишь ебанутая запись goto moya_func; понял, чепушило дегроидное? Где, очевидно, то что стоит после goto, то есть "moya_func", это и есть адрес подпрограммы (указатель на неё).
Теперь прямо к вопросу. В обычной жизни явные указатели нужны для работы с DLL.
moya_func = 0;
LoadLibrary("moya_biblioteka.dll");
moya_func = GetProcAddress("moya_func");
moya_func(); // ура, я вызвал функцию!
Чтобы использовать дллки, ты ищешь адреса подпрограмм по их имени и присваиваешь переменной-указателю, чтобы через него их вызывать. Заметь, что написано GetProcAddress, а не GetFuncAddress. Сразу видно писали программисты, а не дебилы-макаки матяматические как ты.
Ну и еще банально указатели используются чтобы подменять чужие функции на свои. Например, мне нужно в полноэкранной игре выводить на экран сообщения, для этого:
1. ищу адрес функции DirectX и сохраняю в указателе
2. подменяю на указатель своей функции, так что вместо оригинала вызывается моя
3. в конце своей функции вызываю оригинальную по сохраненному указателю.
> Ну и еще банально указатели используются чтобы подменять чужие функции на свои.
Вообще-то это делается по-другому. Пишется библиотека с такой же таблицей экспорта и названием как у оригинальной, которая кидается в каталок с программой. Все функции кроме нужных переадресуются сразу в оригинальную, а в остальных делаешь что хочешь. Винда загружает в первую очередь твою библиотеку и таким образом всё работает. Конечно, можно внутри приложения с этим бороться, но никто не заморачивается.
А патчить само приложение куда сложнее. Поскольку это требуется при каждом обновлении и всякие anti-tamper защиты могут это сделать практически невозможным.
Хеловорлдщик врывается itt. И у меня к вам вопрос, как вы изучали плюсы? Как был построен процесс вашего обучения? Я вот к примеру нашел вроде бы годную книгу, читаю её, выписываю основные положения в тетрадь, тестирую понятое писанием своих хелловорлдов. Но далее наткнулся на сильное усложнение книги, когда мне дают просто новые понятия и определения не давая при этом примеров использования, и так может продолжаться на протяжении 10-20 страниц, и выходит что изучать язык приходится уже как-то абстрактно, не понимая для чего эти знания нужны и как их конспектировать нет ну я конечно все равно разбираюсь, но процесс идет сложнее. Как было у вас? Как вы постепенно повышали уровень сложности сохраняя при этом понимание пройденного материала?
у тебя безумное количество материала в интернете. Что-то не понимаешь - гугли тему, пока не поймешь.
Это понятно, вопрос в системности, типа от простого к сложному, а не так, что сначала учишь А, потом Щ, потом Ъ, а потом глаголы. И где-то на 537 странице тебе показывают что из букв складываются слова. Поэтому и хотелось узнать как учили те, кто уже работает теперь.
я освоил азы уровня классов\указателей, потом писал всякое говно, пока в голове не появилась мысль о том, что я действительно понимаю, чт оделаю
Сериализовать в другой момент времени?
Или, допустим, делать как микрософт, который в скрытый файл автосохраняет некие промежуточные копии, и потом он их видит и предлагает восстановить
ой ну спасибо блядь, а то я сам не догадался бы, а на каком сайте гуглить не подскажешь?
Да инфы и в самой книге предостаточно, вопрос был не в этом. Скорее нет задач на примере которых можно было бы постепенно использовать знания, потому и спрашиваю как этот процесс шел у вас.
>Как вы постепенно повышали уровень сложности сохраняя при этом понимание пройденного материала?
Никак. Я в детстве читал учебник по физике, не понимая формул - я пропускал формулы. Потом, будучи уже подростком, я так читал Кнута - формулы, конечно, я понимал, но не пятиэтажные интегралы и тем более не программы на его варианте ассемблера. Я читал то, что было интересно, не особо заморачиваясь такой вещью, как 100% понимание.
Апофеоза это достигло при обучении в бауманке, когда вся информация по тому, как сделать домашку - это методичка на 30 страниц, напечатанная в 1986-м году, а сдать его нужно завтра, потому что семестр ты ебланил.
С чего ты вообще взял, что при обучении можно избежать стресса непонимания и существует какая-то системность, которая неизбежно приведет тебя к успеху? На самом деле только во время такого стресса и обучаешься. Много стресса, много эмоций - есть эффект. А то, что ты описываешь, годится для того, чтобы стать кассиром в сбербанке.
Я лично читал книги чтобы получить знания, но естественно на 100% ты весь материал не запомнишь. В основном чтобы хранить в голове возможность чего-то, а при надобности гуглить и изучать более подробно и вклинивать в проект. Заучивать каждый пример из книги наизусть я смысла не вижу.
мимо
>GetProcAddress
Мдемс, сейчас бы юзать функции маломягких вместо того чтобы реализовывать их самому.
Специально копал глубокую дырку от поверхности, чтобы сверху чанки точно точно выгрузились. Но даже после перезагрузки игра определяла, что в этой дырке есть солнечный свет.
написание pe loader'ов было развлечением мамкиных хакиров в бородатые девяностые
хотя скорее всего ты вообще не понимает того о чем спизданул
>движки
>чтобы она была чисто одним ехе-шником и весила не больше 32 кбайт
вут
я когда-то сто лет назад на edx проходил какой-то их вводный курс сделал для него простенький рогалик на си (моя первая большая программа лол, мне пришлось для нее изобрести что-то вроде псевдоклассов, с тех пор скриптовые языки май лав) с выводом в консоль без либ и т.п. консольным цветом и весь одним файлом, нашел только что на дропбоксе, крашится собранный exe на новой системе, пересобирать надо наверное, только вводный экран показывает... я уже даже не помню как, переписать ее на джаваскрипте для веба чтоле лол
так вот без движков ее исходник уже 130 килобайт
> ТЫ ТУПОЙ? ВОТ ТАМ ПРОЦЕДУРЫ, ПОТОМУ ЧТО: GetProcAddress, а не GetFuncAddress
И сам даже не углубился в детали реализации, рофел. Схуяли тебе Васян поверить должен? Может у него даже не винда? Как функция то работает, М?
Движков под такие размеры нет, даже какие-то полноценные библиотеки не подойдут. Такое - это самописный рендер (даже opengl не засунешь в эти размеры) и контент процедурно генерирующийся.
Вулкан меньше весить должен
>>63539
>>63533
Я просто это https://www.youtube.com/watch?v=OJPrBzBgUoE видео посмотрел и мне стало очень интересно, как они это вместили в 32 килобайта. Ладно, походу чтобы такое сделать, надо совсем про быть. А что тогда для программирования игр на с++ годного есть? И что вообще нужно иметь для начала.
Обосрался с тебя. Ты сначала хеллоуворлд напиши в 1кб хотя бы, потом поговорим.
>Без низкоуровневых знаний пилить на движках нормально не выйдет
Что именно нужно знать? Битовые операции? Работа с указателями? Что нужно знать, чтобы НОРМАЛЬНО запилить игру на движке?
Все равно ты максимально себя не обезопасишь.
Если ты будешь срать и умрешь без агонии ты не досрешь.
Разве что ты можешь использовать инициализацию через new, чтобы твоя ссылка висела в оперативе даже после аварийного завершения программы, а при запуске программы отслеживать предыдущее падение и искать в оперативе нужный участок памяти.
Напишешь сборщик мусора для плюсов как раз.
Заодно, если я неправильно понял последствия забывания delete, аноны меня поправят и обоссут и я об этом узнаю.
Ты слишком буквально воспринял.
Смысл в том, что реализация качественной защиты от такой хуйни - это задача не для вкатывальщика.
Т.е. ты можешь сделать промежуточную копию создание которой может упасть, значит надо создать ранее ещё одну копию, а ее создание может упасть, значит..., но оцени затраты на обдумывание, написание кода, хранение копий, операцию восстановления - и вероятность падения.
Тебе точно есть смысл это делать или ты так, ради тренировки?
> я неправильно понял последствия забывания delete
Неправильно понял. Система всё равно всё очистит при крэше. Некоторые вообще при закрытии программы ничего не очищают и вызывают exit(0), чтоб закрылось быстрее.
Как вариант можно насрать в shared memory и запустить дополнительный сервис-процесс, который не будет давать системе очистить её.
Скорее для себя, просто пилю прикладные приложения для личных нужд, может паре друзей скину. В любом случае практика полезна будет
Если шнур из пеки вынут, то ничего не поможет. Если пеку решили перезагрузить/выключить, тормози событие, выполняй что тебе там надо, потом выключай/перезагружай.
Если я не наебываюсь, то в кубаче чанк это колонна 16х16 во всю высоту мира. И прогружается соответственно только полностью.
>на 30 больше
фронт в два раза больше вообще то в среднем зарабатывает
но объяснение этому очень простое и не обидное
сделай i/ofstream наподобие того как ты сделол mnr или m1 или m1bin и передовай. ты явно вместо ifstream/ofstream передаешь строковые литералы
А ведь если бы у стримов был не-explicit конструктор из строкового литерала, он бы так и не понял, в чем проебался...
>Но ситуация такая: сериализация происходит при выходе из приложения, но если оно будет завершено аварийно пека потухнет там, или пользователь процесс завершит то что делать в таком случае?
Старый тред не читал, но ты можешь сделать так: периодически делать сериализацию всей ебалы (снапшот), и дополнительно каждое обновление ебалы тоже сериализовать перед применением (патчи). После этого если видишь снапшот и патчи, то загружаешь снапшот и применяешь патчи, получаешь ебалу.
u - unsigned. суффикс литерала - указание типа.
https://www.tutorialspoint.com/cplusplus/cpp_constants_literals.htm
фигурные скобки - list initialization
https://en.cppreference.com/w/cpp/language/list_initialization
Благодарю.
> list initialization
Нихуя. Это uniform initialization. Там коллекции нет, string::size_type - числовой тип, которых хранит длину строки.
мне казалось, что любая инициализация со скобочками называется list initialization, вот пример такого применения не только мной:
https://stackoverflow.com/questions/18222926/why-is-list-initialization-using-curly-braces-better-than-the-alternatives
Теперь я знаю как пидорасов детектировать.
Даже по твоей ссылке на cppreference рассматривается только инициализация с использованием initializer_list. Разрабы C++11 мощно наложили себе говна в штаны сделав для них одинаковый синтаксис из-за чего не всегда понятно что подобная инициализация делает (и даже как называется, лол). Короче хотели сделать как лучше, а получился C++ way. Хорошо ещё пачку UB при использовании не добавили в стандарт, они любят это делать.
> Даже по твоей ссылке на cppreference рассматривается только инициализация с использованием initializer_list.
Хотя нет, вру. Там рассматривается и то, и другое. Я просто книгу мейерса читал, где он этой хуйне пару глав посвятил.
ну, страуструп называет её universal and uniform.
впрочем, униформной такая инициализация называется даже когда там не одно значение в скобках, так что точно можно утверждать, что неверно было бы говорить, что когда одно значение - униформ, а когда несколько - лист.
Ты сильно удивишься, если сказать, что list initialization может быть при одном аргументе, а этот самый value-type - при нескольких?
Это не от количества аргументов зависит, а от перегрузки, выбранной компилятором.
Например:
int x = 5;
std::vector<int> vec1{x}; создаст вектор размером x.
std::vector<int> vec2{{x}}; создаст вектор из одного элемента - из x. Потому что есть конструктор, который принимает на вход initializer_list, а отдельно от объявления, {x} - это он и есть.
Однако, наблюдал странную штуку:
unsigned int y = 5;
std::vector<char> vec3{y};
- даже не компилируется, потому что выбирается конструктор, создающий вектор из списка инициализации и получаешь ошибку о несоответствии типов. А должен выбираться конструктор, создающий вектор из y элементов.
За несколько аргументов и не initialiser_list:
Один из вариантов исправить пример выше:
std::vector<char> vec4{y, '\0'};
Теперь выберется нужный конструктор.
Ну или что-то вроде
std::pair<int, int> p1{1, 2};
Сложных вещей в принципе нет если самому в них специально не вляпываться при проектировании
А так:
Указатели, указатели на указатели
Rvalue ссылки
Компиляторы каждый со своей кухней и поведением
Кресты, не хипстерский язык и лучше всего изучать с каким-нибудь преподом желательно из вуза (сначала си а потом уже ооп), который все непонятные моменты объяснит на пальцах, иначе половину хитрых вещей не поймешь или будешь делать по хреновым примерам из интернета.
Подскажите какую-нибудь относительно удобную библиотеку для работы с MS SQL Server из C++/GCC под никсами?
о! вот и gamedev.ru подвезли! двач становится всё интереснее и интереснее.
сидел на оном сайте несколько лет с момента его открытия в 2002
интересы изменились. пока был пацаном, всё это штырило. а как работать пошёл программером (и не в геймдев), так другие вещи начали меня заботить, помимо игр. особенно если учитывать, что я для себя выяснил что игры-то не особо доходная работа для программера, и кранчей много.
но по прежнему считаю, что 3D графика - это клёво и интересно.
в миллион раз интереснее всех этих блядских вебов, сетей, формошлёпства, и прочего говна.
что с ней может сравниться по интересности - это разработка компиляторов, функциональное программирование.
ещё заходит всякий системный софт, драйвера, программирование для не-x86 систем, микроконтроллеры, вот это вот взаимодействие с электроникой.
интересно было бы ещё наверное ваять бортовой софт каких-нибудь самолётов/подлодок/космических кораблей и спутников/ракет. и прочая оборонка.
вот да - кто-нить здесь на нёё работает? как там?
ещё говно, которое я терпеть не могу - вся эта сраная реклама, банковский софт, базы данных, тупой софт вроде MSOffice.
интересно ещё робототехника, embedded, какой-нибудь научный софт, операционки.
Они ещё там свой код UPX-ом (кажется) сжимали. И вообще, как только они не извращались. И самомодифицирующийся код юзали, и на ассемблере кодили, и процедурную генерацию сцены. И то - это демки были, а не игры.
>код UPX-ом (кажется) сжимали
Говно ебаное, сразу определяет петухов. "Экономить" каплю места на диске в ущерб ОЗУ и производительности это типичный современный подход, когда проги жрут гигабайты и тормозят как чушки просто так от нихуя.
нужно умножить матрицы параллельно,но что то не получается.Я вообще правильно все делаю?
Ты хоть знаешь как это работает? Где ты там увидел ущерб ОЗУ и производительности? После распаковки, программа работает абсолютно также, как если бы она не была упакована изначально.
За всё платит бизнес и красивая UIшка ему зачастую важнее. Контор, где пишут на веб параше в разы больше, чем контор, пишущих на плюсах и чтобы оставаться конкурентно способными, им приходится как-то привлекать хороших специалистов, иначе те свалят в соседний офис. Поэтому там такие раздутые зарплаты. А ты с плюсами сам будешь стучаться и просить взять тебя хоть за еду.
Ещё с плюсами забавно, что на большинстве собеседований, в которых я участвовал, спрашивают какую-то дичь, очень любят move semantic и templates, придумывая какую-то неимоверную хуйню, которую в своём говнопроекте даже не используют
Такие вот дела
мимо плюсовик, работающий за 20к
> сдать его нужно завтра, потому что семестр ты ебланил
Блядь, так "завтра" - это же вагон времени. Всё намного печальнее, когда сдать надо вчера
Это анон, судя по всему, ещё и не знает, что такое демо, иначе бы такую глупость не сказал.
Все неправильно делаешь, используй вектор векторов для представления матрицы, изучи, как правильно сконструировать std::thread и напиши код так, чтобы у тебя не было race-ов по данным (я вижу там, как минимум, один)
Хочу рассказать всем собравшимся, что 64К это не случайная цифра, а проистекает она, как я помню, из-за того что это максимальный размер .com файла в DOS. Ровно один сегмент в 16-битном реальном режиме x86 процессора. Этот .com файл грузится в память, в один сегмент, и запускается. Вот и всё. Предельно просто. Код программы может делать с компьютером абсолютно что угодно, никакой защиты памяти, ограждения от взаимодействия с оборудованием нету. Такие вот времена тогда были.
Можно натворить всё что хочешь. Можно ещё, например, оставить свой код и данные резидентными в памяти после выхода из проги, и заодно переопределить несколько прерываний. Можно вообще, переключить проц в защищённый режим, можно вынести всё что есть на компе в памяти, и установить свои порядки. Ща такого не найти.
Расскажи))
т.е. уместить
for (const auto& elem : vec){
int value = elem.value
}
Внутри for().
Жирно, ака Толсто, ака Ты толстый тролль
а я в нулевые следил за сценой какое то время, скачивал, запускал, интересно было
но следует сказать что узнал я об этом почитывая первые выпуски журнала хакер
так чтож считай что был как ньюфаг с лурочки, лол
оттудаже узнал и про всякий net-art, в том числе и ascii
Пиздос, короче:
1. Либо перекатываться на винду, ставить анриал и шататься в сторону геймдева. Во всяком случае учить язык на его фоне.
2. Либо остаться на линуксе чтобы привыкать одновременно и к нему, и шататься в сторону энтерпрайза.
Первый вариант по душе лично мне, тем более что владею графическим софтом, которого попросту нет на линуксе.
Второй вариант кажется более реальным с точки зрения востребованности и ежедневного последующего пиздоса.
У меня паника от неопределенности.
Завести-то можно, но она там в стадии разработки, да и все остальное там явно к графону не располагает
Сделать класс-wrapper над вектором, у которого есть функции begin и end (range-based for их вызывает), сделать, чтобы они возвращали специальные итераторы, которые разыменуются не в элемент вектора, а в атрибут этого элемента.
Но по мне так этот геморрой нафиг нужен, твой range-based и так достаточно читабельный, еще короче вряд ли получится сделать
Еще два года назад собирал и писал под ним, ничего не мешало,ты, видимо, плохой танцор.
Просто видел в инете что там какие-то траблы бывают, сам даже не ставил, но для меня как раз принципиальнее именно отсутствие графического софта и о замене блендером и гимпом можно говорить только в том случае если ты уже начал как-то выкручиваться в этих двух прогах изначально, не зная на что себя обрекаешь, либо если у человека вообще не было опыта работы с графикой, это я так к слову
Еще и blender тебе не угодил, самая популярная сейчас прога в области моделирования.
Уже пару лет на уече делаем под линем, никаких траблов команда не заметила, багов каких-то конечный продукт тоже не выдавал.
Да вот по сути ты и говоришь то, о чем я говорил, процесс в моем случае выглядит так Открыл макс > накидал болванку > оптимизировал плагином > закинул в зебру > вывел и запек икснормалом > оттекстурировал сабстанс пейнтером > внес правки в текстуру > открыл фотошоп > плагины на плагинах, плагины позволяющие видеть геймтекстуры реалтаймово. И вот после такого пересесть на линукс и начать графонить ну как-то может быть не очень удобно, особенно если тебе вдруг понадобилась какая-то прога под конкретную сиюминутную задачу. У вас же изначально весь флоу в линуксе был. Я же не спорю, что там можно, но зачем если уже освоен в винде. Да и разговор ушел не в ту сторону слишком
мы спрашиваем move semantics, шаблоны и эксепшены на собесах.
Внезапно, все это есть у нас в коде.
Мимо-сеньор-помидор
Чтобы было и интересно и полезно каким-то образом
Зареверси MSI Mystic Light, чтобы я мог светяшки переключать без их ебаного говнософта. Я ковырялся с их SDK, но это SDK тупо дергает их же сервис. А надо вообще без софта.
Шаблоны как универсальная модель вычислений. Зафигачь машину Тьюринга, алгорифмы Маркова и машину Поста на темплейтах, ревлизуй алгоритмы и поисследуй выразительность языка.
Ммм, stateful-шаблончики. Вот препод охуеет от такого кода.
А, и лямба-исчисление обязательно (с индексацией де Брёйна)
Использовать не собираюсь, но в качестве упражнения решил попробовать реализовать. Ты примерно это имел в виду? https://repl.it/repls/QuaintBelovedCookie
Нормально ли здесь использовать std::move? Не уверен, делает ли он хоть что-то полезное тут. Мне не хочется копировать весь вектор лишь для того, чтобы заменить итератор.
Возможно ли как-то затемплейтить желаемый атрибут, чтобы вызвать make_range(vector<S>, std::magic<S>::member<a>) и там уже нужные wrapper и итератор создались?
Попытался вот через указатель, но какие-то уж очень громоздкие темплейты получились, совсем не няшно: https://repl.it/repls/NewPessimisticLocation
Можно ли как-то сократить это (явно же чего-то лишнего там напихал)? В частности, у меня следующие вопросы:
1. Можно ли явно создавать спецификацию темплейт функции, указывая не все параметры? (Запутался я в терминах, но в первой версии я могу спокойно вызвать rangeMemberA(vector), тип вектора автоматически подхватывается, а во второй, помимо собственно S::a, мне приходится ещё и явно указывать тип вектора)
2. Темплейт указателя на мембер, я не мог написать "int typename ContainerType::value_type::❋ member", мне приходится создавать темлейт аргумент ContainerValueType (которому я передаю всё тот же CT::value_type), и тогда всё нормально создаётся через "int ContainerValueType::❋ member". Явно же это лишнее, что мне приходится передавать то, что и так уже доступно из другого аргумента. Но компилятор мне отказывает, что я не так делаю? Придать ему дефолтное значение тоже не могу, потому что он должен стоять перед Member'ом.
3. Возможно ли не указывать явно MemberType, который нужен для возвращаемого значения operator❋() у итератора? Когда был конкретный член структуры (первый вариант), легко через decltype решалось, а теперь-то я не могу в сигнатуре функции использовать decltype(ContainerValueType.❋Member).
В общем, в идеале хотелось бы получить вызов в виде rangeMember< std::magic<vector::value_type::a> >(vector).
после страуструпа это было как что то божественное, а так да, примеры слишком массивные, может просто на контрасте так понравилась, после страуструпа любое говно покажется охуенным
ну дальше будет что то такого, поэтому да, нужно спросить, но сначала норм сформулировать
да, тяжёлый, там написано как всё делать, а мне бы разобраться как оно работает, что значит каждый символ, и как программа понимает что куда пихать, чтобы потом я смог это делать без задней мысли, поэтому иду за помощью сюда.
>а мне бы разобраться как оно работает
Так ты тогда вопросы правильные задавай, а не "как сериализовать объект".
сорри.
Двач, попробуй скомпилить это и запустить.
У меня почему-то выводит следующее:
The night is dark and full of terrors
The night is dark and full of terrors
The night is dark and full of terrors
The night is dark and full of terrors
The night is dark and full of terrors
The night is dark and full of terrors
The night is dark and full of terrors
Компилятор ГЦЦ
Примут в контору — быстро выбьют эту хуйню. А вообще, я в шоке как можно быть настолько безвкусным
Почему-то? У тебя <= в лупе.
ну андефайнд бихевиор на то и андефайнд?
std::function<void()> ff([up = std::move(up)]()mutable{});
Почему это не компилируется?
мне кажется, что должно, потому-что лямбда это rvalue, и через стандартный мув конструктор должно уходить. Но там явно видно, что пытается сделаться копия
https://ideone.com/axVrR0
typedef (int* MessageBox_t)(
HWND hWnd,
LPCTSTR lpText,
LPCTSTR lpCaption,
UINT uType
);
MessageBox_t MessageBox;
Но ссаный прекомпилятор мне гудит мол соси хуй REDEFINITION. СУКА, почему блять в 2019 году блять компилятор не может блять понять что я хочу использовать свою оболочку, а не стандартную?
Короче я понял, функция зачем-то должна быть copy-constructible, поэтому о перемещении можно забыть. Придется заворачивать moveable во что-то типа шаред поинтера.
using ZALUPA = int(*)(HWND...);
Это копия, сохраненная 8 апреля 2019 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.