Вы видите копию треда, сохраненную 3 октября 2020 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
• https://github.com/sosachbot/cppthreadhat/wiki
Ответы на вопросы:
• https://en.cppreference.com/w/
• https://www.cplusplus.com/reference/
Прошлый тред: >>1679966 (OP)
Врядли точно такое есть. Только свой навернуть. Можно на основе вектора. Сохраняешь индекс последнего добавленого элемента (он же начало). При добавлении - инкрементируешь индекс и заменяешь текущий элемент вектора на новый. Если дошел до конца - начинаешь снова с нуля. Ну и нужно operator[] продумать - вычислять индекс исходя из текущего смещения, учитывая границы массива. Вообще очень похоже на кольцевой буфер - но для буфера заполнение это гроб, кладбище, пидор и надо разгребать. А у тебя нрмальный режим работы.
Кольцевой
То бишь, void foo() noexcept {...}
Если тип не поддерживает оператор <, то код не скомпилируется (ну или если ты явно не передашь функтор-сравниватель).
Так, ладно, я уже сам разобрался. Всем спасибо.
да, будет чуть чуть побольше перфа и четкое напоминание самому себе, что тут эксепшен не бросается
https://pastebin.com/QB5TRuHz
Подскажите плиз, тема нихуя не простая, примеров нет, а что делать не ясно.
ваще не надо наследоваться от std контейнеров, они об этом намекают невиртуальным деструктором.
А к твоему вопросу - сделай конструкторы. Для твоего нового класса определен только дефолтный конструктор
>сделай конструкторы. Для твоего нового класса определен только дефолтный конструктор
using std::array<T, N>::array;
Разве это не наследует все конструкторы?
Не у всех у них есть виртуальный деструктор
Вот даже цитата из вики
If the using-declaration refers to a constructor of a direct base of the class being defined (e.g. using Base::Base;), all constructors of that base (ignoring member access) are made visible to overload resolution when initializing the derived class.
class Layer : public QObject
После этого в инициализациях этого класса стали появляться ошибки о неявно-удаленном копи-конструкторе. Как это понимать? Я ничего не удалял.
Например:
Layer currentLayer = layers[index];
Пишет:
ошибка: call to implicitly-deleted copy constructor of 'Layer'
Например 1.0 - это double, а не float. И в момент создания переменной будет implicit конвертация из double во float.
Суффиксы корректно задают тип у rvalue.
По умолчанию X.X вроде double даёт, поэтому будет неявная конвертация. В данном случае суффиксы нахуй не надо, но уж не знаю где, но где-то потом может всплыть проблема.
он будет неявно преобразовывать значение слева к типу слева.
попробуй сделать что-то в духе int a = 55555555555555555ull;
auto a = 1.0; // double
auto b = 1.0f // float
Это поведение кстати можно в компиляторе поменять.
Так лол, там в примере на скринах уже указан тип. Это же не как в го, где := написал и оно само определило что там за тип. Здесь конкретно написано, что переменная fValue это float. Не double, не ещё что-то, а именно что float. То есть мы это указали. Если бы мы захотели, чтобы переменная была double мы бы написали double. Но мы написали float. У меня именно это вопросы вызывает.
По моему это буквально означает то, что я написал постом на который ты ответил. Ну ок, буду знать, спасибо.
Тебе уже 5 раз написали
float x = 1.0; // компилятор компилирует неявную конвертацию во float т.к. значение 1.0 является double а тип данных куда это значение будет присваиваться является float
float x = 1.0f // компилятор нихуя не делает т.к. значение 1.0f уже является float
Хотя с оптимизацией компилятор вроде как в любом случае делать нихуя не будет
Хорошо, я даже не буду спрашивать нахуя это надо и почему бы просто не сделать так, что если ты указал float - это будет float без всяких неявных конвертаций. И double будет только если ты укажешь, что это double. Раз сделано значит умные дяди решили, что надо. Спасибо.
Поэтому значение double обязано и будет конвертироваться во float.
Временное значение - https://en.cppreference.com/w/cpp/language/lifetime
> почему бы просто не сделать так, что если ты указал float - это будет float без всяких неявных конвертаций
Последнее что я добавлю для полной ясности
float a = 1.0;
В данном случае ты указал float для своей переменной, она и будет float, но правое значение это double, а как я уже сказал разные типы данных не могут быть записаны друг в друга, поэтому конвертации не может не быть.
Я тоже пытаюсь разобраться в куте, пока безуспешно.
Подозреваю, что тебе нужно конструктор копирования для твоего класса Layer сделать.
А, в гугле написано, что нельзя by design.
https://doc.qt.io/qt-5/qobject.html#no-copy-constructor-or-assignment-operator
Ну где то слышал что для длинных примитивных типов сложение выполняется за 2 такта в отличии от коротких
С AVX2 может 256 бит за инструкцию. Все ждем следующую версию, когда векторы увеличат до 512 бит.
Сап, анон. Есть параметрический класс, я на вход проги получаю тип , через свитч-кейс перебираю способы вызова параметрической функции, параметр которой собственно передается в параметр класса. Есть ли какой-то более элегантный способ, кроме как свитч-кейс?
>Все ждем следующую версию, когда векторы увеличат до 512 бит.
https://market.yandex.ru/product--protsessor-intel-core-i9-skylake-x/259937156
Поддвачну вопрос
Сложно потестить?
Не разницу в том как они устроены и внутри, это я понял. А в том какую когда дучше использвать. Они почти одинаковые. Единственное перебирать упорядоченное множество иногда удобнее
set - когда не очень много элементов и операции сравнения будут быстрее чем взятие хэша от элемента. unordered_set - когда дохуя элементов. Я по крайней мере стараюсь так юзать.
В гугле забанили?
Set - это всегда отсортированный массив (под капотом там red-black tree) с неповторяющимися значениями. Если это сэт структур/объектов, то ты решаешь по какому полю структуры будут неповторяющиеся значения.
Unordered_set - тоже самое, только эта структура данных позволяет хранить повторяющиеся элементы, в отличие от сэта.
А вообще, если ты не смог ТАКОЕ нагуглить, то земля пухом, анонче.
для laba1 разницы нет
Первый на дереве, второй на хэш таблицах. В первом сохраняется порядок, во втором дешевле операции доступа, вставки, удаления.
Вы согласны?
>Напишите программу, которая просит пользователя ввести число от 0 до 255. Выведите его как 8-битное двоичное число (в парах по 4 цифры). Не используйте побитовые операторы.
Вот это хтоническое нагромождение говна реально самый простой и правильный вариант решить эту задачу? Разве через кучу if else не проще? Мне просто в голове пока ещё трудно держать такой громоздкий алгоритм как тут. Стоит биться башкой в эту задачу пока на 100% её не пойму?
std::string str;
If (i < 256)
while (i > 0){
str+=i%2;
i/=2;}
std::reverse(str.begin(),str.end());
std::cout << str;
https://github.com/xoreaxeaxeax/movfuscator
> The mov-only DOOM renders approximately one frame every 7 hours, so playing this version requires somewhat increased patience.
Что такое reverse я ещё не знаю, но сама часть с вычислениями выглядит проще
Правда я не люблю использовать оператор +=, а предпочитаю писать это в полном виде
Codewars выглядит именно как то, что нужно. Раздражает правда, что там надо каждый раз нажимать kata, выбирать сложность, выбирать упражнение, и нет возможности просто решать их подряд одно за другим
Во я рагуль...
GUID неплохим вариантом выглядит. Там 128 бит, на долго хватит. В Boost есть heade-only реализация (UUID обзывается), хешер в комплекте.
Int'ом обычно и хранят. В UE4 например для строк юзаются идентификаторы строк FName который и является интом.
А как тогда сделать, чтобы для моего кастомного класса работали сигналы и слоты? Он же должен быть наследником QObject.
Какой же ты тупой блядь...
> std::vector<std::unique_ptr<Layer>> layers;
> Layer ★currentLayer = layers[index].get();
И че тут? Ты создал вектор с моим классом? И че? Как это связано с сигналами и слотами?
И я не знаю приемов и апи, как это всё правильно делать. Изи изучить язык и поведение, и как-то не изи собрать этот вебопаззл.
Например, сервер апач, в нем что там, питон-скрипты? А вся красота на js на страничке? А есть что-то красивое из коробки?
Второй вариант - подключить Qt + qml, оно проще, но платно и не веб
class RandomClass {
// private members
public:
// public members
};
Зная, что неявно поля класса имеют модификатор доступа private... Нужно ли явно указывать энивей или так норм?
вкусовщина, но мне персонально больше нравится классика. сначала паблик, а потом прайвет, т.к. интерфейс должен быть выше, чем детали реализации имх
Найс, спасибо.
Выводится только один раз (вывожу в цикле) и только часть строки std::wcout << string;
Почему так? Строка является std::wstring
>чисто стилистически следует ли писать отдельно поле private?
Обычно внизу пишут, но я для своих проектов сверху леплю. Когда сам класс пишешь, удобнее сразу потроха видеть. Когда чужой класс используешь - внутренности не особо важны.
Они оче давно появились, году в 2013 что ли. Но у нас компилятор интеловский. В вижуал студиях новых точно тоже доступно.
>Уже доступно в C++?
В gcc и clang. В msvc - только через интринсики.
https://gcc.gnu.org/onlinedocs/gcc/Vector-Extensions.html
https://clang.llvm.org/docs/LanguageExtensions.html#vectors-and-extended-vectors
>Для таких извращений лучше подойдет Intel комппилятор.
Почему "извращений"? Очень удобно и кроссплатформенно, в отличие от интринсиков.
А потом волшебным образом на не на интеловских процессорах программа будет работать не совсем так, как задумывалось.
https://3dnews.ru/997915
Ну, у меня файл используется только в этой функции, нет никаких лишних данных. Проверки на пустоту сделал, динамическую память нигде не использую.
Сгенерированый файл проверял? В нем все правильно?
5 8
3 6 7
8 9 10 11
1 2 3 4 5
Порядок случайный. Можно использовать только fstream библиотеку.
Делаешь структуру узла бинарного дерева(инфо, указатель налево, указатель направо), делаешь функцию добавления и вывода. Добавляешь по принципу большее слева, меньшее справа(при условии, что в фале всегда большее справа) и все.
Да я вот про эту штуку спрашивал.
https://doc.qt.io/qt-5/qtabwidget.html
Тут еще есть вот такой класс, наверное его проще использовать.
https://doc.qt.io/qt-5/qtabbar.html
Я об этом и говорю. У них есть поддержка встроенной сборки.
Все, нашел. Только у прототипа.
>>16968
Ну а разве там не нужно, чтобы родитель указывал на массив из детей(односвзный список)?
unordored_map мне кажется нормально подходящим под задачу, но есть же ещё unordored_set? (Ключ для map берется тот же, что и player.id)
А если задача взятия i элемента по ключу не популярна, в основном все операции идут со всем контейнером, то может вообще использовать std::list, а при необходимости поиска просто пробегаться через find?
Мышкой наведи на него в ide, тип в подсказке будет.
Игроков много всегда в один момент? Порядок игроков внутри контейнера важен? Структура не очень тяжёлая? Если на все вопросы ответ "нет", то думаю, что итерирование по обычному вектору быстрее будет. Удаление будет просто своп удаляемого элемента с последним. Хотя unordered_map тоже хороший вариант, да и чуть проще в исполнении.
Варианты переката. Куда? Что нынче пишут на плюсах? Бывают ли проекты где используют Жабу и плюсы, чтобы перекат прошел безболезненно?
Да, в раст. Пока освоишь плюсы хотя бы на уровне джуна - раст уже выстрелить успеет.
class Widget : public std::enabled_shared_from_this<Widget>{}
Как же криво реализован shared_ptr
>Как же криво реализован shared_ptr
Попробуй сам сделать, придешь к такому же решению. Если ты не понимаешь зачем так сделано (причем людьми которые гораздо опытнее тебя) - это не "криво", это просто ты недалек.
Лично мне очень редко нужен shared_from_this. Намного реже, чем сам shared_ptr, которым я и так почти не пользуюсь. Хотя емнип в асио это сильно используется.
Через cpuid набор инструкций нужно проверить, конечно же.
Ну так регулярится только первое число, ко второму не переходит с std::regex_search
Просто вот есть у меня куча объектов-прототипов, и у каждого по несколько полей-указателей. Я не понимаю, зачем мне заново прописывать инициализации для каждого из полей в методе Clone(), когда я могу просто создать новый объект, и все точно будет работать.
Один массив объектов класса должен параллельно обрабатываться.
В общем случае, да. Есть исключения (например, если все потоки будут только читать, то это безопасно)
Почитай про понятие "состояние гонки" или на человеческом языке - race condition. Пусть кол-во тредов - N, если N > 1, то если хотя бы один из тредов пишет в общую между тредами область памяти - состояние гонки имеет место быть. Решается это несколькими способами - атомарными переменными, мьютексами (в твоем случае, скорее всего, подойдет больше мьютекс).
Как проще, так и делай.
Clone() - это для тех случаев, когда через new будет либо сложно, либо не то. Например, объект был создан и настроен в коде, который ты не можешь или не хочешь менять, но при этом можешь делать его копии.
пзц, поубивал бы этих придумывальщиков "паттернов проектирования", более бесполезного учения в жизни не встречал
1. Сколько учили язык? В свободное время / во время работы?
2. С какой и на какую позицию перекатились? Сильно ли просели по зарплате?
3. Интересные ли задачи по сравнению с плюсами? Много ли своих заморочек?
4. Оно того стоит?
Работаю НЕ в НИИ, пишу на современном C++17 с пакетным менеджером, CI и всеми возможными плюшками, но чё-то пердолинга всё равно многовато. Что происходит с людьми пердолящими Qt и C++98 на заводе вообще не представляю.
>С какой и на какую позицию перекатились? Сильно ли просели по зарплате?
Лол. В среднем зп джависта на процентов 20% выше чем у крестовика, поэтому при перекате в джаву по зарплате вряд ли кто-то проседал, скорее наоборот.
>Интересные ли задачи по сравнению с плюсами?
>Оно того стоит?
На вкус и цвет, как говорится. Если ты находишь тырпрайз интересной отраслью разработки - джава для тебя. Кресты для игроделов и байтослесарей (разработкой браузеров занимается 1% из всех девов, поэтому я не беру их в расчет, например), то бишь отрасль совершенно другая, требующая совершенно других знаний. Прислушайся к своим интересам, чтоль.
> разработкой браузеров занимается 1% из всех девов
Ты так говоришь, будто это что-то почётное.
капец а я наоборот хочу
>тырпрайз интересной отраслью разработки
Кто-нибудь может пояснить кстати, что такое этот ваш тырпрайз/энтейрпрайз? Какие проекты считаются энтерпрайз? Писать вот те же браузеры это энтерпрайз или нет? Если нет, то чем написание энтерпрайз проекта отличается от написания браузера?
>Почему прототип нужно копировать? Что мешает мне создать точно такой же объект с помощью new?
Чтобы избежать дублирование кода. Don’t repeat yourself
Тебе надо match и перебор групп в матче
посмотри переводик слова enterprise и всё станет понятненько
Тырпрайз это когда пишешь сортировку массива с printf. Потому что консоль это линукс, а линукс стоит на серверах, а серверы стоят в энтерпрайз корпорациях.
Расскажи поподробнее про твое текущее место работы позязя
Что за предметная область, в чем заключается пердолинг, средний уровень крестовиков, почему именно С++17 и какие конкретно фичи из него, смотрите ли на 20 стандарт, че нить поконкретнее про стек неплохо было бы услышать
Добра
upd
Забыл добавить, что хочется исключить polling, а сделать так, чтобы тред сделал свое дело, заснул и по сигналу с другого треда вставил новый элемент в очередь.
Один из вариантов это от std::condition_variable плясать. Если взять как пример кода в https://en.cppreference.com/w/cpp/thread/condition_variable
Код из функции worker_thread() добавить как метод класса очереди listen() и сделать там бесконечный цикл. Тред который хочет добавлять елементы в очередь вызывает queue.listen(callback) - и становится на паузу пока не будет изменена std::condition_variable. Тред который подает сигналы вызывает функцию notify() (в примере это main) которая меняет std::condition_variable, спящие пробуждаются, вызывается колбек и все уходит на новый цикл. Соотвественно нужно придумать способ прерывать этот цикл - очевидный это сделать так чтобы колбек возвращал булеан - нужно продолжать или нет. Но это как-то попахивает, незнаю почему. Колбек нужен чтобы скрыть эту все хуйню от клиенских тредов - они просто вызывают listen()
и потом у них дергается колбек по сигналу - они не ебутся со всей этой кондишионал парашей. Естественно вмест околбека может быть какой-то делегат, функтор любой коллабле который тебе удобен.
https://onlinegdb.com/BkHWgmOsI
Это баг msvc?
Да дело не в этом. Мало того что мув конструктор не работает у packaged_task, так lifetime у callable ровно до того момента пока существует хоть один shared_future, даже если он уже давно готов. Со всеми захваченными в лямбду переменными, которые он, сука, должен был освободить.
Что за хуйня, анон? Есть отсортированный вектор структур по определенному полю (здесь выбран int), вызывая бинарный поиск и через лямбду кастомизирую компаратор (без этого компиль не знает по какому критерию искать значение в векторе), он высирает аж 3 действия. Напоминаю, что временная сложность бинарного поиска - O(log(n)), сам логарифм по базе 2, в векторе 4 объекта.
В таком случае, log(4) = ~0.6, то бишь, округляя, максимум за 1 итерацию поиска должно было найти значение, а тут аж 3 операции! Щито? Мб я чет наговнокодил и надо по-другому? Мб не через лямбду?
Заранее спасибо.
>Напоминаю, что временная сложность бинарного поиска - O(log(n)), сам логарифм по базе 2, в векторе 4 объекта.
Чёт пиздец.
>В таком случае, log(4) = ~0.6,
)))
A foo1(const B& b)
{
return b++;
}
void foo2(const B& b, A& a)
{
a = b++;
}
ирл встречал оба варианта. Особого удобства тоже нет, если параметров несолько, то можно запаковать в кортеж.
Но я нуб в асинхронном и параллельном программировании, какой вариант лучше подходит?
В паралельном наверное лучше через возврат делать - это более чистый вариант (pure function) что плюс при многопоточности, хотя мне сложно привести какой-то конкретный пример, как минимум в плюсах. Передача через ссылку - если это сделано имменно для возврата значения (тоесть это не ссылка на какой-то расшареный на несколько функций ресурс) то единственная причина это делать - попытка экономить. Но с RVO это бессмысленно, и даже вредно учитывая что аргументы у функций не бесплатны. Тоесть в случае одного аргумента это 100% возврат значения. При двух и больше уже стоит смотреть что красивей выглядит. Скорее всего паковать результат будет удобней.
По ссылке обычно передаём то, что нужно именно изменить, т.е. например добавить в список или нарастить bounding rectangle. По значению всё остальное
Сплеш скрин немного сдвигается вверх во время загрузки, то есть в момент когда тема у которой бэкграунд задан как сплэш сменяется на сплэш из манифеста. Сам глюк на пикриле. В статье предлагается просто убрать лого для сплэша и оставть только у бэкграунда темы. Но меня это не устраивает, так как между сплешем и появлением интерфейса приложения будет появляться пустой экран. Мне нужно чтобы сплэш скрин был как на обычных приложениях, без сдвигов и без пустых экранов. Как фиксить?
Нет, анон. Big O notation - это обозначение пространственной или, в этом случае, временной сложности алгоритма. Если возьмем частный случай, в нашем случае - бинарный поиск БЕЗ повторяющихся элементов, то его worst case, равно как и best case и average case, - это O(log(n)), сам логарифм по базе 2, ибо ты каждый раз делишь сортированный массив на 2. Worst case - это максимальное количество действий, в данном случае обращений к ячейкам массива, которое произведет алгоритм. log(4) по базе 2 = 2, но действий, как видно по выводу, 3. В чем подвох? Ошибка явно в коде, математика здесь ошибиться не может.
Причем здесь k? В массиве нет повторяющихся элементов так-то. И твое уравнение верно только если k очень мал по сравнению с n (в идеале, близок к 1), если k ближе к n, то это уже O(n★log(n))
Ты не знаешь матчасти.
Например
O(k*log(n) + n + 5) = O(log(n))
Потому что O показывает как будет расти время при росте числа элементов.
Работает as intended. Наверно происходит сначала сортировка с использованием компаратора, а потом поиск.
> O(klog(n) + n + 5) = O(log(n))
O(klog(n) + n + 5) = O(n) так-то. Линейная функция растёт быстрее логарифма.
Почему это вообще работает? Как он понимает, что 4 ==4, если ему надо лямбду писать для сравнения больше/меньше?
Конечная сложность зависит от значения k. Если оно мало по сравнению с n, то это O(n), да. Если k примерно равен n, то сложность будет равна O(nlog(n)) по твоей формуле.
А как избежать сортировки? Ведь массив по дефолту уже был отсортирован
>>701461
Пикрилейтед. Перед вами массив из 10000 чисел от 1 до 10000 включительно, соответственно, без повторяющихся значений. log(10000) по базе 2 = 13.287
То бишь, самое максимальное количество операций поиска по вышеприведенным данным = 14 (потому что 13 имеет остаток, засим это округляется к бОльшему значению при наличии остатка в таких случаях).
Взяты пограничные значения, чтобы проверить максимальное кол-вл операций поиска. Все сходится, максимум = 14. Про какой k вы говорили яхз, повторяюсь, в массиве не было повторяющихся значения. ВРеменная сложность будет равнa O(k*log(n)) только если в отсортированном массиве будут k повторяющихся элементов.
>>701553
>>701542
Ебать тут парад шизов. У одного бинарный поиск массив сортирует, у другого константа k зависит от n, третий на серьёзных щах считает количество действий по О-нотации.
Как выше пытались пояснить, О(n) означает что при увеличении количества входных данных например в два раза, время выполнения/потребление памяти увеличится примерно в два раза.
Так же и с O(log n). Если ты вместо 10000 элементов передашь 1000, то сравнений будет 10, а может 9, а может 11.
Пчел, погугли про worst case, average case, worst case, ты пытаешься объяснить именно это, но не по-человечески.
Это все равно не отвечает на вопрос почему в том примере с лямбдой есть 3 операции сравнения, если МАКСИМУМ могут быть 2
Потому что worst_case для бинарного поиска это что-то типа O(a + b log n)
Как видно из твоего вычислительного эксперимента, b=1. Но это все равно нихуя не важно, т.к. O(a + b log n)=O(log n).
Бамп, аноны, объясните идиоту, если не сложно.
Благодарю.
Worst case для отсортированного массива БЕЗ повторяющихся элементов - строго O(log(n)) с логарифмом по базе 2, откуда ты высрал a и b, шизоид?
O(2n) шизик, ты? Я узнал тебя по твоим шизоидным словам и высерам
ты обоссан :-)
> с логарифмом по базе 2
Логарифмы по любой базе отличаются дург от друга константой-множителем. Это в школе изучают Поэтому все пишу O(log(n)), а не уточняют что логарифм двоичный, натуральный или что-то в этом духе.
Для этого логарифмы и придумали, можно с помощью таблицы логарифмов заменить трудоёмкое умножение сложением+поиском по таблице.
Дегенераты вроде тебя? Согласен. Ведь вы только высераете бред, не имея ни пруфов, нихуя. Откуда высрано a и b, шизик? Или ты мало того, что слился, так еще и обосрался?
Ну на этот раз-то точно ВСЁ.
Блядь, у меня на ноуте всего лишь 16 гб памяти и не расширить никак... Вот я соснул...
Ну теперь c++ официально только для хакеров.
class MyAppButton1 : public Button
{
public:
OnMouseClick(int x, int y) { / ... / }
};
Какие подводные? Или нельзя сказать однозначно без всего контекста, нормально это или нет?
А нахуя он public?
Ой бля анончик там такие костыли что ебануться можно. Приду домой - скину
Ест у меня std::vector<double>, есть у меня std::transform, в котором pure функция (хз, возводит элемент вектора в степень и делит на 4), есть вектор для ответа.
Анон, я никогда не читал книги про работу компиляторов, но на мой взгляд, в релизе, ему очевидно, что можно распараллелить цикл, зная конечную архитектуру сборки. Почему тогда из коробки, само и неявно, не подключается какой-нибудь #pragma omp parallel for?
используй параллельные алгоримты С++17. За тебя компилятор такие адовые вещи как многопоточка генерировать точно не будет
Ну это да, должен быть приватным. Я хотел понять другое, нормально ли чисто идеологически делать отдельный класс на каждую кнопку в приложении?
>Почему тогда из коробки, само и неявно, не подключается какой-нибудь #pragma omp parallel for?
У распараллеливания достаточно большие накладные расходы, поэтому массив должен быть достаточно большим. Огульно параллелить всё подряд очень сомнительная идея, но она много кому приодила в голову, например, разработчикам компиляторов PGI
Ну если это какая-то навороченная кнопка, то хули нет? Посмотри, как в Qt это сделано: там если QAbstractButton и от него наследуются QPushButton и QToolButton. Если тебе нужно на твой кнопке картинку с аниме добавить - наследуй и добавляй
Собственно, делаю микроминималистический гуй под wasm, соотношу с тем, как сделано в QT и WX. Но пока что так понял, что наследование от классов фреймворка в целом плохая практика?
Создавать новый класс имеет смысл когда тебе нужен блюпринт, с помощью которого можно создавать много одинаковых объектов. Наверняка у тебя у разных кнопок разные обработчики, так зачем делать под это отдельный класс?
>она уже самим этим коллбэком отличается от инстанса своего суперкласса?
Если у неё другое расположение, скажем, то она тоже отличается от инстанса суперкласса. Функции это первоклассные сущности, такие же, как числа
Но ведь OnClick - это самый первый кандидат на полиморфизм, иначе нахуй это все вообще нужно?
Век живи – век учись
Ну раз ты говоришь, что хочешь использовать полиморфизм в кнопках, значит ты хочешь единообразно обрабатывать разнородные кнопки.
Если ты собираешься обрабатывать разнородные кнопки единообразнно (например, в цикле перебирать массив переменных базового класса или писать функцию, которая принимает аргумент базового класса) то нет, имеет смысл использовать наследование. Если не собираешься, то не имеет смысла.
Кнопки отличаются от суперкласса только ивентом OnClick. Но если они отличаются, то это уже?
У тебя есть два пути решения одной и той же проблемы
– Пердолить на каждый вид кнопки отдельный класс
– В базовом классе сделать "указатель на функцию" std::function и переназначать его для каждой кнопки
Обычно идут вторым путём, с точки зрения полиморфизма оба случая равнозначны
Так а че, shared_ptr unique_ptr проблему не решило, им нужно теперь miracle_bugfree_ptr?? Наверняка тот код был написан на c++99 да и еще с самокрутками типа самопальных auto_ptr, или вообще на голимом си со strcpy и strdup и прочим говном. Теперь давай забаним плюсы, раз долбоебы даже c unique_ptr и move semantics не могут в безопасный код.
> единообразно обрабатывать разнородные кнопки
Спасибо анон, за короткое но понятное объяснение полиморфизма
Ты логику прямо в кнопку вешаешь что ли? Лучше заведи класс MyCallbackButton, наследуй его от своей "базовой кнопки", внутри добавь std::function и два метода - setCallback(std::function) и execCallback(). Последняя приватная и проверяет, установлен ли callback. Как только у тебя произошло какое-то нужное тебе событие, пишешь execCallback() и всё
Есть массив одной структуры, в структуре указатели на память. Часть памяти статически определяется, часть рантайм, маллоки и т.д.
Хочу подчищать память универсально, одной функцией, после отработки.
Напрашивается вопрос - как сделать так, чтобы free не выдавал ошибку на статической памяти? Отдельно следить что я там разметил динамически - не хочется, так дебильно.
Двачую двачую двачую
Статически это указатель на глобальную переменную или на стеке? Чет как-то криво звучит - в структуре хранить указатель на такую переменную. Почему не саму переменную тогда сделать частью структуры.
>сюда или в с
очевидно что в С с такими странными задачами. В С++ есть всякие смарт пойнтеры поэтому не нужно париться маллоками. Если хочется статики - делай ссылку вместо указателя.
struct s
{
s(b b) : _b(b) {}
std::unique_ptr<a> _a;
b& _b;
};
std::shared_ptr<s> ss = std::make_shared<s>(b);
в результате а dynamic, b - static и ничего освобождать не надо
только непонятно зачем ебаться со статикой, жалко что ли в shared обернуть.
Двачую, бывало наследовал что-то от basic_ostream, каждый раз охуевал с неочевидности и залупности этой конструкции. Стараюсь с тех пор вообще с std стримами не связываться.
Хитровыебанность этих ебучих стримов выдает авторство страуструпа. У них два десятка параллельных спецификаций, для стримов и соответствующих им буферов, и в результате нет ровно того, что мне надо. И ведь уверен что автор либы, которому подавай это ебучий стрим, у себя внутри просто засасывает весь буфер и передает в какой-нить примитив типа write, т.е. ему можно было бы передать char* и не выебываться, особенно когда скорость важна. Но нет блять он выставил наружу модный стрим, и к нему нужно теперь десять прокладок наклеить, чтобы сраный буфер передать.
int size = (sizeof(arr)/sizeof(*arr)); // == 2
Почему так?:(
Если считать в одном куске кода
Не совсем так..
я передаю в ф-цию function(arr)
внутри fuincton(float arr[])
получается
int size = (sizeof(arr)/sizeof(*arr)); // == 2
Опять указатели шалят?
Потому что функция получает указатель, а передаешь ты ей указатель на массив из 4 символов. Потому результат разный.
Ну да, ты же проебал информацию о размере, когда передал массив в функцию. Для неё arr — это просто указатель.
На 64-битной платформе получится 2, на 32-битной — 1.
Чтобы не проебывать размер, его надо принимать в шаблоне:
template <size_t size>
void function(float (&arr)[size])
вызывать так же - function(arr)
(ну и заодно вычислять ничего не надо)
Тру стори. В каждом более-менее крупном проекте в котором приходилось работать была хуева туча легаси кода со своими поинтерами, строками, аллокаторами и прочими велосипедами разной степени упоротости.
Разумеется, вместо вектора можно подсунуть обычные указатели на начало памяти и конец
Нахуя?
Если проект реально крупный, то строки поинтеры скорее всего использовались в разных подсистемах, следовательно должны быть более-менее универсальными.
Зачем переписывать std::string например тогда?
Есть что-то типа такого https://www.reactphysics3d.com/
А формулы нужно гуглить без привязки к языку и потом разгребать что-то типа https://srri.umass.edu/sites/srri/files/dufresne-2001spj/index.pdf выбирая до какого уровня тебе нужно просчитывать всю хуйню
Че
Если ты про стандарты то к тому времени как вышел первый ISO стандарт stl уже была. Но в последующих редакциях она дорабатывалась вектор из 2020 может отличатся от вектора из 1998. Хотя у меня пример нет, может по факту и отличий нет.
С создания STL
То, что в вакансиях нужно.
array c++11, vector c++98
Все зависит от того зачем ты учишь.
Дошёл до итогового теста в 5 главе https://ravesli.com/glava-5-itogovyj-test/
Намотался на второе задание. Я правильно понимаю, что смотреть ответ явно не стоит, а лучше перечитывать всю главу, потому что я нихуя из неё не усвоил? (Я типа написал код, который работает как надо за исключением самого важного - при выигрыше начинать новую игру. Вот тут у меня просто из головы вылетело как сделать так чтобы при else if(X = Y) ветвление завершалось нахуй и завершался цикл в котором функция с этим ветвлением вызывается. Пробовал goto, но нельзя какого-то хуя вызывать лейбл из другой функции как оказалось. Возможно я вообще не так всё сделал и с моим текущим подходом нихуя не выйдет и надо делать совершенно по другому и с нуля)
Пишут, что так нельзя в c++
Ну тебе уже не помочь, раз такие элементарные задания выполнить не можешь.
Подсказка: бесконечный цикл и break
Да я уже всё сделал. Правда максимально всратно и мне ебло разобьют если я такой код покажу приличным людям. Но поставленную задачу выполняет.
А вообще, все эти помойные сайтики тебя ничему не научат. Советую взять в руки хорошую книгу и учить язык по ней. А начать вообще с книги k&r по си. Там очень хорошие задачи и много интересных примеров, которые заставят поломать голову. Сама книга маленькая, всего около 300 страниц, читается за пару недель.
Мне на плюсах надо, я за шарп не шарю. Получилось вот такое https://ideone.com/hWH6uu . Как видно у меня всё в main лежит, а новая игра вообще через goto блять. У авторов решение конечно гораздо элегантнее
В голос с этой сисярп макаки. В простейшем коде умудрился нахуячить ошибок и наговнокодить:
1. Попыток 8, а не 7, при этом даже если 8 раз ты ответишь правильно, тебе скажут что ты проиграл.
2. Если ответишь правильно, то тебе напишут "Too big", а потом скажут, что ты выиграл.
3. Блок if не нужен.
4. Лишнее присваивание переменной guess
Потому что, как сказал этот >>703757 господин, учиться нужно не по говносайтам. При этом любые обучающие сайты говно, при условии, что это не обучение какой-нибудь динамикопараше вида жопаскрипта, которая учится за вечер и пару бутылок водки.
Читаешь эту 300 страничную книгу, а потом берёшь книгу Страуструпа и начинаешь изучать C++.
Я не он, но опыт такой тоже был и вопрос "нахуя" нужно задавать пионерам, которых уже с нами нет давно, как водится. Если проект реально крупный, то начали его в хуй знает какие времена, когда еще народ табак курил и йогой не занимался, не говоря уже про соблюдение каких-либо best practices в программировании. Интересно было бы узнать много ли народа писало на С++11 в 2012 или С++17 в 2018. Только только начали умирать от коронавируса престарелые писатели самопальных аллокаторов, взрощенные на голых сях и С++99, но дело их еще живет в больших и старых проектах. Но не побеждает.
Да ничего, программирование скоро станет просто хобби, как музыка и искусство. UBI уже почти на подходе, будем получать небольшое пособие, и спорить в форумах, какой язык самый крутой. А реальный софт будет писать AI. Быстрый и без багов.
>std::string
Кекнул на этом, в каждой конторе вижу свои 3-4 вариаций стрингов, уже даже не смешно.
Застукать бы одного такого стрингера с поличным , и просто спросить вежливо - нахуя. Просто интересно знать. При чем неважно даже если это мегалегаси код. За такое и 10-20 лет назад нужно было убивать.
Влажно
Учиться надо программировать, используя для этого средство по душе. А то наслушаются всяких пидоров и прокрастинируют потом. Толку-то с труъшной технологии, если накодил пару часов за месяц? А вот выберешь, что прет, и количеством написанного кода компенсируешь всю нетруъшность своего взросления. Алсо, актуальное на рычноке и подходящее для учебы - взаимоотталкивающиеся вещи. Так что не стоит лучшие годы губить на всякое говно, на первой работе все равно обязательно насосешься, при чем капитально. Кстати, для концептуально прокачанного путь к нормальному трудоустройству короче, просто это беспалевно делается. Какой-нибудь задрот фреймворков даже не заподозрит, что ему отказали за общую тупость, и продолжит дрочить свою охуительную область знаний. Он на своем уровне и не может воспринять эту сторону действительности. А умного паренька, который даже язык в глаза не видел, невзначай возьмут, ведь адекваты негласно понимают, что нет ничего практичнее хорошей матчасти. Рыночек формально не способен этого понять, но жизнь все фиксит. Фактор необучаемости и гавнокода, несущего нулевую пользу для проекта, перечеркивает всю подкованность по стеку.
Сложно представить себе что-то более уебанское чем std::string
LPCTSTR
AnsiString и, о да, строки в ДЕЛФИ, где первым символом длина строки
И после этих двух книг брать ещё одну, чтобы наверстать то, что добавили в язык за последние 20 лет?
Да это пиздец, лучше сразу что-нибудь современное читать, например вот это
https://codernet.ru/books/c_plus/beginning_c_17_from_novice_to_professional/
и не тратить время на всякие strcpy и т.п. Если в книге не упоминается string_view, например, то сразу нахой.
Чтобы стандартизировать кодировку, например. У встроенных строк как-то уж очень долго налаживается дружба с юникодом. С появления char16_t ещё 10 лет не исполнилось, а char8_t вот только подъезжает.
Ну и всякого рода оптимизации. Тысячи их.
А ты как хотел? Или ты один из тех долбоебов, которые думают, что изучив динамикопарашу они стали программистами и знать, что там внизу им совсем не надо? После чего такие удивляются, почему это у них цикл в котором они строки складывают, жрёт пару гигабайт памяти.
Весь сахарок в 17 стандарте строится на том что было до него, поэтому для того чтобы писать хороший код ты должен изучить эти основы, только после этого уже смотреть на сахарок и радоваться, потому что понимаешь как надо было бы писать код, если бы тебе этого сахара не насыпали.
System::String
год-два позанимайся какой-то ебанутой хуйней с ебанутым стэком, и дальше ищи нормальную работу. Я в свое время вообще писал на каком-то ебанутом языке, формально числившись С++ разработчиком. Ради того самого ОПЫТА в резюме.
Раз уж это С++ тред, не самый раковый, но я тоже чтобы вкотиться программировал на какой-то хуите богомерзкой ради ОПЫТА
И начальник\директор тогда сказал
"Вот, молодые то идут к нам, все на javascript\python хотят программировать, чтобы потом в гугле работать, а я всю жизнь был прикладным программистом" - примерно слово в слово
Далеко ходить не надо, просто посмотри на свой пернувший в лужу пост с наездом на стринг без всякого обоснования
Выключили электричество а вместе с ним и мой комп. После этого захожу в проект, а он может прочесть 1 файл из 3. На хедер мне похуй, вся проблема в cpp файле, который открывается через блокнот, в котором ничего не отображается. Шиндовс говорит, что какие-то байты в нем все еще есть. Как его восстановить, не хочу, чтобы 2 дня трудов пропали за зря? Может, у него шапка слетела и попытаться переписать байты с новой шапкой? (Хуй знает вообще, как он устроен)
орнул
Открой в хекс редакторе и посмотри, если там все одинаковыми байтами забито то все.
Так в этом игра и была. Ты проиграл электрикам 0:1. Пиши по новой чтобы счет сравнять.
template <typename T, typename = typename std::enable_if<!std::is_base_of<ParentClass,typename std::decay<T>::type>::value>::type>
> template <typename T, typename = typename std::enable_if<!std::is_base_of<ParentClass,typename std::decay<T>::type>::value>::type>
Ох, быдлу не завезли c++17?
> template<class T, class = std::enable_if_t<!std::is_base_of_v<ParentClass, std::decay_t<T>>>>
Или даже более предпочтительный
> template<class T>
> void foo() {
> static_assert(std::is_base_of_v<ParentClass, std::decay_t<T>>);
...
>}
>производная высоты прыжка по времени
Это просто скорость называется. Может тебе ускорение нужно, тогда это 2-я. 3-я называет джерк. 4-я джолт. По-русски можно придумать типа рывок, потом толчок, потом чпок.
Элементарно, Ватсон!
Убийца std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>::__ostream_type& (*)(std::basic_ostream<_CharT, _Traits>::__ostream_type&)) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>]
тащемта кастомные аллокаторы только щас и писать
инфраструктуру под них доднлали только в 17м стандарте
мимо безработный мамонт
Чтобу не писать аргументы шаблона класса для некоторых аргументов конструктора. Смотри deduction guides
У меня получилось скопипастить с SO, но там нет проверки типов. Моя весрия с дополнением не компилится:
https://onlinegdb.com/SJp5e_hiU
Не совсем. Это чтобы по аргумента конструктора вывести параметры класса.
Например https://en.cppreference.com/w/cpp/container/vector/deduction_guides
Основы — это основы, их в любой книге для начинающего дадут так или иначе.
Я говорю про всякую устаревшую фигню, из разряда, например, что нет смысла сначала учиться не возвращать "большие" объекты из функции по значению, а потом учиться, что теперь так можно. Или читать про какие-нибудь wstring_convert и codecvt, а потом узнавать, что они пукнули и обмякли. Или вникать в фантазии Страуструпа про то, какие безграничные возможности открывает наследование фасетов локалей, чтобы потом выяснить, что они обосрались с кодировками переменной длины.
Ну или те же функции из сишки, которые можно просто посмотреть по докам если приспичит, а специально учить их нет никакого смысла (тем более, какой-нибудь современный вижак тебя заебет варнингами при попытке ими воспользоваться).
Ещё такой момент, книга Страуструпа в основном описывает только стандарт. Про тот же wchar там ты прочитаешь только, что это тип достаточного размера чтобы вмещать неизвестно что. А в книге, на которую я дал линк, например, сразу написано, как оно реально живет на разных платформах, и что с этим делать.
for(auto& [a,b] : mp){
std::cout << a << " " << b << "\n";
}
Почему не компилируется?
Пишет
> error: expected unqualified-id before '[' token for(const auto& [a,b] : mp){
c++17 включен? У меня компилируется.
Спасибо
>русские книги по 17/20
наивный ) "Русское" программирование еще не вошло в эру C++11, а ты про такое ноухау
Книг по 11/14 полно, тот же майерс. По 17 думаю должны были что то хорошее перевести
Спасибо, но тогда компилируется для вызовов типа
f(vector<unsigned>, int), А я хочу чтобы тип был строк одинаковый.
Например, этот вариант рабоатет только для std::array, но он требует, чтобы два типа были строго одинаковые:
template<typename T, std::size_t size>
auto f(const std::array<T, size>& arr, T o)
{
auto it = std::find(arr.begin(), arr.end(), o);
if ( it != arr.end() ) {
std::cout << "found\n";
} else {
std::cout << "not found\n";
}
}
хм, можно ассерт добавить
template <typename T, typename U>
void f(const T& arr, U value)
{
static_assert(std::is_same<T::value_type, U>::value, "array and value must be of the same type");
...
This. Не пользуйтесь стандартной библиотекой, пишите своё.
давай ещё раз.
Почему через value_type без разницы тип, а когда параметр шаблона общий - разница есть?
https://onlinegdb.com/BkcP5b6iU
snippet here:
#include <array>
#include <vector>
#include <deque>
#include <utility>
#include <cstddef>
#include <iostream>
#include <algorithm>
template<typename T, std::size_t size>
auto f(const std::array<T, size>& arr, T o)
{
auto it = std::find(arr.begin(), arr.end(), o);
if ( it != arr.end() ) {
std::cout << "found\n";
} else {
std::cout << "not found\n";
}
}
template<typename T, std::size_t size>
auto f2(const std::array<T, size>& arr, typename std::array<T, size>::value_type o)
{
auto it = std::find(arr.begin(), arr.end(), o);
if ( it != arr.end() ) {
std::cout << "found\n";
} else {
std::cout << "not found\n";
}
}
int main()
{
std::array arr = {0u, 5u};
f(arr, 5u);
// f(arr, 5); //error
f2(arr, 5u);
f2(arr, 5);
return 0;
}
давай ещё раз.
Почему через value_type без разницы тип, а когда параметр шаблона общий - разница есть?
https://onlinegdb.com/BkcP5b6iU
snippet here:
#include <array>
#include <vector>
#include <deque>
#include <utility>
#include <cstddef>
#include <iostream>
#include <algorithm>
template<typename T, std::size_t size>
auto f(const std::array<T, size>& arr, T o)
{
auto it = std::find(arr.begin(), arr.end(), o);
if ( it != arr.end() ) {
std::cout << "found\n";
} else {
std::cout << "not found\n";
}
}
template<typename T, std::size_t size>
auto f2(const std::array<T, size>& arr, typename std::array<T, size>::value_type o)
{
auto it = std::find(arr.begin(), arr.end(), o);
if ( it != arr.end() ) {
std::cout << "found\n";
} else {
std::cout << "not found\n";
}
}
int main()
{
std::array arr = {0u, 5u};
f(arr, 5u);
// f(arr, 5); //error
f2(arr, 5u);
f2(arr, 5);
return 0;
}
Ну собственно по той же причине, почему вот это не компилируется:
template <typename T>
T sum(T arg1, T arg2)
{
return arg1 + arg2;
}
sum(1, 5u);
компилятор не может автоматически определить, какой из двух типов брать за T.
А с value_type у него, видимо, никакой дилеммы нет, и он сразу понимает, что T — это то, что в контейнере.
Изначально value_type добавили, чтобы сделать функцию, которая может принимать как vector, так и array.
Хотя это можно и span-ами делать, если их завезли уже.
> Изначально value_type добавили, чтобы сделать функцию, которая может принимать как vector, так и array.
Пиздос. Скоро динамическую типизацию завезут
Ну ты не сравнивай
>шаблоны
>динамическое
Ну формально компайл-тайм таки статический. Другой вопрос что во время компиляции шаблоны выполняются как бы динамически. даже хотят jit в интерпретатор типов захуярить а то ЧЕ-ТО ТОРМОЗИТ
А динамикопараша регулярно переизобретается еще со времен С. Начиная с void* до СОМ и QObject.
А какие хорошие и современные?
Есть ли предел сложности крестов?
24 дня всего, за такое время даже жопаскрипт не учится
В смысле?
Вопрос из комментов: Не понял синтаксиса функций begin и end. Они должны возвращать объект типа Iterator. Однако, они возвращают объект типа T*.
Спасибо, посмотрю.
>Video games like Assassin's Creed or Rainbow Six
Вангую, там криворучки-аутсорсеры сидят, потому и гавнодвижок
У него в 37 и 38 строке функции типа итератор, но возвращают они указатели на первую строку и последнюю соответственно.
Iterator у него конструируется из указателя (строка 46), и вызов конструктора происходит автоматически.
Ну конструируется по указателю и что?
Я не понимаю все равно. Тут функция класса которая возвращает строку. Как переменной класса можно присвоить строку?
>Тут функция класса которая возвращает строку.
Не строку, а указатель на неё.
T — это char✱
arr - это T✱
следовательно, return arr возвращает char✱✱
>Как переменной класса можно присвоить строку?
Ты про какую переменную?
Блядь, забудь слово "присвоить", понял? Итератор инстанцируется этим return'ом. Не присваивается, а создается. Потому что есть конструктор из указателя (строка 46, как сказали выше), который передан в return.
template<class T, template<class> class Cont>
void foo(Cont<T>, T)
Попробуй, хотя я не уверен, что не нужно указывать ещё и всякие там аллокаторы
И std::any
Ну и что из этого по-твоему привело к багам на твоих видео?
а я поржал
Геймдев просто исторически был довольно консервативный в плане всяких фич. Потому что иначе проблематично, когда не знаешь, на какую ещё мыльницу придется в будущем портировать игру, и какого уровня свежести и разъебанности на ней будет компилятор.
>STL, boost
Так за эту парашу в любой нормальной конторе всегда ссали за воротник и заслужено били по тупому ебалу.
С стл не нужно свой класс строки писать. Несерьёзная разработка получается.
Да. Делай erase–remove.
QVBoxLayout ''vbox = new QVBoxLayout(this);
А некоторые объявляют сначала в хедере:
private:
QPushButton ''okBtn;
И потом выделяют под них память в конструкторе
okBtn = new QPushButton("OK", this);
Как лучше делать?
Тут просто явно показывается, что лейаут ты сделал и забыл, а состояние кнопарика возможно будет дёргаться из других методов (хотя по идее все коннекты можно и в конструкторе сделать).
Лучше забей и научись формошлепить в дизайнере.
Да нужно без дизайнера делать, студень я.
В списке i + 1 не работает.
Список stl
https://stackoverflow.com/questions/3516196/testing-whether-an-iterator-points-to-the-last-item
Там много странных фокусов предлагают.
Например, размер экрана.
Сейчас проебался на этом на этом мальца. При создании установил положение сущности по x в -R_WIDTH использовал эту беззнаковую константу, чтобы не писать -1000 например, т.е. (как думал) за пределами экрана, а нихуя. Оно в UINT_MAX установилось.
Для оконных координат используй знаковые. А то потом заебешься работать с координатами за пределами поверхностей, вроде координат курсора.
Кстати мне всегда интересно было ECS переводится как система компонентов сущности? Или это типо 3 разных элемента как MVC например модель-представление-контроллер.
> У меня есть класс Placeable
Замени на vec2f pos; если это двумерная игра
> Damageable, хранящий прочность и защиту
Сделай класс\структуру Stats
> Temperature, хранящий данные о температуре объекта урона
Перенеси в Stats
> Npc будет наследоваться если ни от них всех
Сделай Object: совсем базовые возможности для объекта
Унаследуй и сделай GameObject, объекты с которыми можно взаимодействовать: двери, рычаги
Дальше NPC: тут уже много чего, атака других npc, получение урона, применение способностей
Можешь посмотреть на структуру классов в mangos (эмулятор сервера для вов, если играл в него то будет несколько проще разобраться)
Правда, думаю, будет слишком сложно сразу так разобраться в нём.
> Ну так, а какой не говно?
Твой личный или тот, который принят в твоей фирме\команде.
Можешь длянуть стайлгайд в nasa
Это вообще пиздос (в хорошем смысле), но он ориентирован на Си кажется
>>707210
Сомнительная какая-то история. Но через подчеркивание мне в любом случае нравится больше, так что да, буду его использовать.
> но он ориентирован на Си
Да, он про С.
Алсо, в их репозитории на гитхабе https://github.com/nasa/fprime/blob/master/Os/Task.hpp всё тот же кэмэлкейс.
Для такой хуйни придумали remove_if
Объясни-ка, как по словам прыгать в снейк-кейсе? Два раза, чтобы через _ перепрыгнуть?
В смысле? Так же как и в кэмэлкейсе. e, w, b. Если ты про стрелочки с зажатым контролом, то у меня через всё слово прыгает.
Да пусть повторяются
Дайте посмотреть на православный с точки зрения геймдева вектор или мапу. Всегда было интересно.
Ну смотри. Есть какой-нибудь идентификатор "my_class". Каретка стоит перед "my". Я жму Ctrl+Right, где будет каретка?
Размещай так, чтобы в хедере было ровно то, что используется - не больше и не меньше. Но при этом старайся по максимуму использовать предварительное объявление.
Вот лучше посмотри на реализацию string от движка сириус сэма
https://github.com/Croteam-official/Serious-Engine/blob/master/Sources/Engine/Base/CTString.h
Ну вот у меня виджеты qt разные, они наследуются от каких-то готовых классов, плюс везде используются всякие типовые классы типа виджетов размещения.
А что за предварительное объявление?
Можешь начать с https://github.com/mangoszero/ это эмулятор классики
mangosone - TBC
mangostwo - Wotlk и тд
Там же есть готовые бинари, но придётся самому базу накатить + кое-какие данные нужно достать из клиента. Вроде, не особо сложно, просто не быстро.
Либо поискать готовые сборки с базой и всеми делами, например https://www.ownedcore.com/forums/world-of-warcraft/world-of-warcraft-emulator-servers/wow-emu-general-releases/613280-elysium-core-1-12-repack-including-mmaps-optional-vendors.html
Также в мангос встроен движок луа который позволяет добавлять функционал не пересобирая сервер: http://eluna.uiwow.com/
Можешь эту структуру кода спиздить и переделать под себя.
Обычно в таком случае подключается заголовок с базовым классом, а остальные штуковины предварительно объявляются (у тебя ведь только указатели, да?)
p1 - типа myClass - там уже что-то лежит
myClass* p2 = new myClass
p2 = p1
То вызовется мой перегруженный оператор?
> inline CTString(void);
Как не умели в 2002 пользоваться ключевыми словами, так до сих пор не умеют
Учитывая состояние компиляторов в 2002 — вполне возможно что это вынужденная мера, лул.
>>707431
Я слышал, что в каком-то компиляторе была такая шутка: в нём был счётчик употребления в коде ключевого слова "inline". Если счётчик превышал какое-то значение, то компилятор дальше игнорировал все инлайны.
А запись вида func( void ); пришла из Си. Там таким образом обозначалось что функция не принимает аргументов, а пустые скобки означали любое количество аргументов.
Благодарю.
Да я не про это. Есть такая штуковина, называется CamelHumps (он же subword navigation). Очень полезная и удобная штука, т.к. зачастую нужно изменить что-то в середине слова и без этого приходится стрелками искать позицию, или ещё хуже - мышкой. Так вот мне интересно, как оно работает со снейк-кейсом.
Не знаю, не встречал такого.
Может быть зависит от алгоритма который встроен в редактор\иде?
Сейчас проверил в qt creator
Для my_title (курсор находится перед m), после ctrl+r переместился к t
Для myTitle аналогично
>Я слышал, что в каком-то компиляторе была такая шутка
Ты слышал шутку.
Не сравнивай сегодняшние компиляторы и их возможности с компиляторами 20-ти летней давности.
>А запись вида func( void ); пришла из Си
Ахуеть, спасибо зумер, я-то и не в курсе был.
Ещё раз — а ты уверен, что на всех таргетах (кроме пк были ещё nintendo gamecube, xbox, ps2) были достаточно поддерживающие плюсы компиляторы? Если что, в 2001 уже был первый релиз и очевидно что разрабатывать начали даже до 2000-х.
Я вот лично сомневаюсь, что в среднем компиляторе по больнице в то время была реализована хотя бы половина 98-го стандарта.
Ты имеешь в виду в хедере класса надо указывать все эти QLineedit и кнопки, там же инклюдить классы для этих объектов, а в cpp файле только подключать этот хедер?
У меня в конструкторе без объявления они создаются через new, доступа к ним не будет что ли?
Если они будут взаимодействовать только через коннекты объявленные в конструкторе, то пофиг.
В 2к20+ уже все хорошо с этим, у Sony юзает LLVM (и вообще x86 процессор а не кастомную залупу) а м$ не лезет в анус и тоже быстро подхватывает последние стандарты, так что такой проблемы нет (ну, разве что последний стандарт может на пару-тройку лет запоздать до выхода нового поколения с новым девкитом, лол). Но такого, как лет 10-15 назад, чтобы у всех были свои процессоры и компиляторы для ц (не всегда даже с классами как в случае с псп) — уже нет и в помине, даже на рынке китайского андроид-скама уже один арм одной версии остался.
>Потом он хочет перенести ее на ps. Сильно ли ему придется менять код?
На первую? Тогда очень сильно. На ps4 - вижалстудия с несвежим clang.
>>702790
Спасибо, я так и сделал, но похоже не судьба. Та либа, которой этот стрим нужен похоже елозеет по стриму туда-сюда, что вроде бы не должно быть проблемой. Но там какие-то косяки. А когда я подсунул ей класс из буста, то все работает - он тоже наследует basic_streambuf и оверрайдит все методы, и оказалось что либа-сука дергает кучу этих других методов зачем-то, которые тоже нужно самому имплементить типа underflow и seek. Короче это майндфак и того не стоит. Придется буст юзать.
Да я пока не очень представляю как они будут взаимодействовать, например кнопка "удалить" должна удалять выделенную строку из таблицы-представления, то есть в слот-обработчик нажатия надо как-то передать это значение столбца выделенной строки, чтобы я мог сформировать запрос на удаление.
Не пилил подобное на qt?
буст так-то это основа всех фичей в новых версиях С++ начиная с 11-й. Но понимаю, с бустом скучно, нет возможности пилить свои собственые примочки, которые гораздо лучше, чем стандартные. Можно свой класс тред написать.
Ну и что непонятного? Подключил кнопку к обработчику, внутри спросил у таблицы выделение, узнал строку, попросил модель удалить эту строку.
Это же basic хуйня, без неё ты в qt глубоко не продвинешься
Не нужно. Используй беззнаковые только там, где оно необходимо (в байтоебстве каком-нибудь).
Даже сам Страуструп и другие авторы признавали, что применение беззнаковых в стандартной библиотеке (типа size_t) было проёбом, и из-за них случается много ошибок.
Кому интересно, смотрите тут https://www.youtube.com/watch?v=Puio5dly9N8 на 9:50, 41:08, и 1:02:50
Беззнаковые нужны только тогда, когда тебе нужно хранить большие положительные числа, самый типичный пример - хранене Id.
И оно не поможет в случае если значение ниже нуля недопустимо. Вычтешь ты из беззнакового нуля единицу, получишь arithmetic overflow или макс значение для этого беззнакового числа.
>Вычтешь ты из беззнакового нуля единицу, получишь arithmetic overflow или макс значение для этого беззнакового числа.
Можно, наоборот, добавлять единицу: ( size_t i = 0; i + 1 < width; ++i ), если нужно i < width - 1.
>А можно без всей этой анальной эквилибристики
Тогда придется постоянно касты делать или ворнинги отключать.
Контрол Ц контрол В в Эксель XD
>Да я пока не очень представляю как они будут взаимодействовать
Тогда выноси в хеадер все, потом будешь смотреть что нужно было что нет.
Нашел только ответ чтобы в таблицу символов не попадали ненужные символы. Это как-то заметно улучшает производительность? Вроде как api определяют заголовочные файлы, которые либа будет предоставлять, так что в плане скрытия внутренних деталей наверное это не особо имеет значение чтобы в таблицу попадали тольок те символы, которые нужны.
Часто индексы юзаешь?
Из личной практики могу вспомнить лишь UI. Для всего остального есть ranges и iterators
Вообще это в духе современного c++.
На винде оно и так всё скрыто по умолчанию, с модулями тоже будет пролазить только то, что явно экспортируешь и зависимости.
Ну а зачем - потому что бритва Оккама
int number = 10;
char buffer[25];
std::sprintf(buffer, "%.2f", (float)number / 100);
>Часто индексы юзаешь?
Регулярно. У меня графоний, часто алгоритмы приходится кодить. Плюс для дебага почти всегда индекс элемента полезен.
Да нет у qobject копи-конструктора, выше писали уже ему.
Мне говорили читать effective modern c++. Но я тогда нвверное вопрос неправильно задал
читай у Мейерса "Эффективное использование С++" и "Наиболее эффективное использование С++". Потом "Эффективное использование STL"
"effective modern c++" нужно читать только когда начнешь хорошо разбираться в C++11
> читай у Мейерса "Эффективное использование С++" и "Наиболее эффективное использование С++". Потом "Эффективное использование STL"
Это же все устарело
>Это же все устарело
Че несешь? Больше 3/4 советов еще актуальны. А с учетом возможности столкнуться со старой кодовой базой то и остальные пригодятся
>наслушаются всяких пидоров и прокрастинируют
Ну так ты сам на это и подталкиваешь, дядь, возводя в абсолют труЪ программиста, который не знает ни одного языка, но зато знает Vатан, задроту фреймворка. Итого у условного вкатывальщика-студента складывается впечатление, что языки изучать - сродни пинанию хуёв, а вот матан знать это ТруЪ. Затем он задаётся вопросом: "А какой же самый правильный способ изучения матана?" - на что его мозг сразу генерит ответ - "Конечно же, по советским учебника, они же ТруЪ!". Затем этот лихой молодец скачивает задачник Демидовича и пару томов какого-нибудь Зорича и начинает хуярить. Вот долго такой протянет на ручной тяге?
P. S.На следующий день же всё бросит и продолжит свою прокастинацию
Да я пока на поверхности плаваю, да, поэтому простые/глупые вопросы такие.
Алсо сделал диалоговое окно ввода данных в таблицу, так вот в слоте не видно модель данных, она у меня чисто в конструкторе создается без объявления. Если вынести ее в объявление как поле класса в секцию public чтобы слот мог работать с моделью, это норм практика?
Или надо как-то через геттер доставать, но я не представляю как потом этот объект передавать в слот.
Нихуя не понял, что ты хочешь сделать.
Если у тебя есть окошко с таблицей, то храни там указатель на свою модель и устанавливай её в таблицу. Если хочешь через диалог вводить данные, то в своём обработчике нажатия на кнопку открытия диалога просто его запускай, а по завершению спрашивай в него данные, которые пользователь ввёл и заноси их в модель - если правильно напишешь методы, то таблица автоматом обновится
В конструкторе виджета с таблицей у меня вот так создается модель:
QTableView "view = new QTableView(this);
QSqlRelationalTableModel "model = new QSqlRelationalTableModel(this);
То есть в хедере я не указывать, что у меня в классе объекты этих классов есть, поэтому слот не может к ним обращаться.
>ошибка: 'model' was not declared in this scope
model->insertRows(0, 1);
Ну вот если я укажу модель в хедере, то слот должен получить доступ к ней, верно?
Все, я понял, там и private будет доступно в слоте, это же метод класса. Просто в конструкторе область видимости ограничена фигурными скобками как и в любой другой функции.
Добавилась запись.
>>707638
buffеrstrеam/basic_buffеrbuf
На buffеrstrеam мне пох, это просто удобная обертка.
Мне нужно спиздить минимум из basic_buffеrbuf.
Он наследует от std::basic_strеambuf, то есть базовая идея та же самая - передать туда указатель на char* и его длину и в конструкторе он вызывает sеtg, который устанавливает указатели на начало - еback() (что за мудацкое название для начала буфера!), текущий - gptr() и хвост - еgptr().
А потом создать istream и в конструкторе ему подсунуть этот хитрый буфер унаследованный от std::basic_strеambuf .
Бустовый basic_buffеrbuf оверрайдит несколько виртуальных методов из basic_strеambuf которые по дефолту возвращают ошибку, и если они дергаются, то нужно их оверрайдить в своем классе. Если из std::istrеam'a просто тупо прочесть один раз, то ничего переопределять не надо и sеtg достаточно. Если же либа по нему елозеет, нужно оверрайдить sееkoff, что в общем тривиально кажется, если нет подводных.
Найс матчасть на матан подменил. Матчасть - это нарицательное для всего концептуального. Я говорю не про матан, и даже не про анализ алгоритмов, а про умение мыслить, как погромист. Можно сказать, про архитектуру, но опять же не дрочить умные практики, а а органично расти в этом плане путем написания своих велосипедов. И велосипеды надо писать на языке, который охунен сам по себе, а не который на рыночке на слуху. Так больше напишешь, меньше напрокрастинируешь, вот о чем речь.
Смотрю на код в бусте seekoff (off) который двигает указатель.
gptr() это текущая позиция, eback() - голова, egptr() - хвост.
Нафига вот так изъебываться:
n = this->egptr() - this->eback();
this->setg(this->eback(), this->eback() + off, this->eback() + n);
зачем вычислять n, как разницу между хвостом и головой и потом в setg снова прибавлять его к голове, ведь получим тот же резултат this->egptr() - this->eback() + this->eback(), пиздец. Тем более голова и хвост фиксируются один раз и больше не меняются в принципе.
По-моему можно прсто
this->setg(this->eback(), this->eback() + off, this->egptr());
Ну у меня две таблицы, связь через внешний ключ, там вместо Id отображается нормальное название.
И я кстати из-за этого не знаю, можно ли добавлять в этот столбец строку или только id(int), ведь этот столбец интовый в самой бд.
Кстати вот так можно удалить запись?
model->removeRow(view->rowAt() );
model->submitAll();
Да. Они так вызывают методы, которые в базовом классе определены. ХЗ зачем, может чисто для визуального эффекта. Кажется разные стайл копы в С++ и C# по-разному к this относятся, одни орут чтобы убрать, другие наоборот его хотят. Хуйня это все.
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
terminate called after throwing an instance of 'std::out_of_range'
what(): basic_string::erase: __pos (which is 18446744073709551615) > this->size() (which is 2)
class MyClass : QObject {
...
signals:
void someChanged();
}
void MyClass::dispatchEvent() {
...
emit someChanged(); //тригерит событие
}
Потом в QML и в QWidgets вот так вот написаное это самое событие имеет вид onSomeChanges почему для чего - хуй знает, что бы путались больше и искали почему не работает.
Как понять стандартные? любой метод в сигналы добавляешь, эмитишь из любого места внутри методов класса, в кьюмеэле и в виджетах у тебя событие вылитает через метод с приставкой on+заглавная первая буква
Я не заметил on, зато заметил последнюю букву разную, подумал что в разных местах метод по-разному назван.
Кстати для чего QML и QtQuick используются?
Файл:
https://github.com/OpenXRay/xray-16/blob/a1da0aa884a32901503ec7a395672741c81387ee/Externals/cximage/ximage.h#L721
>Кстати для чего QML и QtQuick используются?
Это как XAML, только не через жопу. Декларативно реактивный язык описания интерфейсов. Грубо говоря у тебя приложение разбивается на бек на плюсах и фронт на QML и жопаскрипте
Т.е. в твоём бы случае ты бы сделал на крестах поставщик данных, а потом супер быстро накидал интерфейс со всеми финтифлюшками на кюмеэл.
Ты можешь вообще что угодно показывать. В бд будет интовый ключ, а твой метод data() для столбца с этим ключом будет возвращать анимешные картинки
Очевидно, что ты отнял от uint(0)
Не подскажешь метод, который возвращает текущую выделенную строку в моей таблице, чтобы я кнопкой удалил? Что-то могу найти в документации, там какой-то еще новый класс, связанный с индексами, просто не получится получить номер что ли.
model->removeRow(view->???());
model->submitAll();
QModelIndexList selection = view->selectionModel()->selectedRows(0);
if (!selection.empty()) {
QModelIndex idIndex = selection.at(0);
int del_id = idIndex.data().toInt();
model->removeRow(del_id);
model->submitAll();
Так примерно принято делать?
Чел, я не ебу. Лучше загугли, посмотри на примеры всякие. Можешь взять qbittorrent как образец хорошего кутишного кода
Я давно делал, но ты там вроде должен слать сигналы о начале и конце модификации, чтобы вью их отобразил.
Спасибо за совет, действительно посмотрел в sqlbrowser'е их как они удаляют, вроде работает и у меня вот так:
QModelIndexList selection = view->selectionModel()->selectedIndexes();
if (!selection.empty()) {
model->removeRow(selection.at(0).row());
model->submitAll();
model->select();
}
Еще setselectionbehavior задал для вью, не знаю, влияет ли это. Программирование вслепую.
>>708720
Сигналы, насколько я понял, нужны для взаимодействия разных виджетов, а у меня и вью и таблица и кнопка все находятся в одном классе наследованном от qwidget.
Сигналы нужны для общения кюобъектов. Твои вью, кнопка и тд - разные кюобъекты с одним родителем. Виджеты - это частный случай кюобъектов.
> Еще setselectionbehavior задал для вью, не знаю, влияет ли это.
Из названия очевидно, что это влияет на вид выделения - ячейка/строка целиком/етц
> Программирование вслепую.
Не программируй так, открой лучше кутишную документацию и по любому поводу туда заглядывай.
> Сигналы, насколько я понял, нужны для взаимодействия разных виджетов
Не совсем. Если пишешь свою модель, то нужно изнутри посылать сигналы о разных своих действиях. Тот же removeRow. В твоей модели уже это всё написано за тебя, но по идее ты должен наследоваться от абстрактной модели и переопределить этот метод. Внутри посылаешь сигнал, что собираешься что-то удалить, потом удаляешь из своего списка ячеек/базы/файла/етц, потом посылаешь сигнал о том, что закончил удалять.
Уверен процентов на 90, что при вызове view->setModel(...) эта самая view подключается ко всем этим сигналам - rowsAboutToBeRemoved(), layoutChanged() и прочие
Что бы нажатие кнопок, перемещение элементов, списки и вот это вот все в плюсах не писать как это обычно у всех делается. Одна из главных фичь это кастомизация как в вебе - кнопку можно там картинкой нарисовать или тупо текстом, стиль менять динамически, хуверы-хуюверы драгндропы вот это вот все. Относительно хтмл+жс+цсс гораздо проще устроена свистопляска со слоями элементов и отступами от краев синтаксис более приятный чем хмл бяка, но в остальном к сожалению во всем уступает.
Перекот https://2ch.hk/pr/res/1708681.html#1708891 (М)
Перекот https://2ch.hk/pr/res/1708681.html#1708891 (М)
Вы видите копию треда, сохраненную 3 октября 2020 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.