Вместо шапки — https://github.com/sosachbot/cppthreadhat/wikiОтветы на все вопросы:- http://en.cppreference.com/w/- http://www.cplusplus.com/reference/Прошлый: >>1181867 (OP)
Освятил
>>1196795>C++>БогатымС крестами можно заработать только шизофрению или геморрой.
>>1196801>С крестами можно заработать только шизофрению или геморрой.Ну так он и есть живой пример этого.
>>1196795И что это за хуйня?
>>1196878Если умеешь программировать на шаблонах с сохранением состояния (оно же stateful metaprogramming), то ты умственный миллиардер. А если нет, то ты и C++ толком не знаешь и вообще даун, лох и нищенка.
>>1196882А если умеешь протаскивать состояние через повторные вызовы constexpr-функций?
>>1196926Это тоже сорт stateful metaprogrammin. Вопрос снимается.
>>1196801неврозы всякие.
>>1196926Ни хуя себе. Как это?
>>1197010http://b.atch.se/posts/non-constant-constant-expressions/
>>1197015Таки да, сердце этой хуйни вот эта друг-функция: friend constexpr int flag (Tag)Называется оно friend injection и его хотят запретить в последующих стандартах C++, ибо считается, что SMP это oche плохо. Впрочем хотели запретить ещё в C++17, но почему-то оставили.
>>1197016Ёбись оно в рот. Дружественные функции и так пиздецома, а теперь у них будет еще одно правило использования? Узнаю старые добрые плюсы.
>>1197020Насколько я знаю, в C++17 эту хуйню оставили потому что не смогли внятно описать, что именно нужно запрещать и как должно это правило использования выполнятся. Так что если они действительно добавят это ограничение, то его описание обещает быть мучительно непонятным. Впрочем, для C++ это не будет чем-то новым.
>>1197015Неужели в шланге так много багов?
>>1197021Ебать тебя врот, во какая заваруха.
У меня немного странный вопрос. Как известно double не равномерно покрывает ось, а постепенно уменьшая их плотность. А какие два числа из тех, которые можно задать даблом лижат ближе всего друг к другу? 0 и следубщее после него наменшее?
>>1197115В любом компиляторе куча багов, если использовать хоть и валидный, но редко используемый в продакшене код (а smp в здравом уме никто использовать в проекте не будет). Самый забагованный в этом плане msvc (начиная со своего собственного ни с чем не совместимого способа раскрытия макросов и заканчивая кучей багов в шаблонах и constexpr-функциях), но у clang и gcc тоже своих багов хватает.
>>1197164Как-то так#include <limits>double mindouble = std::numeric_limits<double>::min();
Я что-то не врублюсь как этот код работает.
>>1197393https://ru.wikipedia.org/wiki/Частичная_специализация_шаблонаА вообще это древнее дерьмо из времён C++98. Сейчас этот же код можно переписать в виде нормальной constexpr-функции.
>>1197395Можешь пожалуйста написать конкретно верхний пример, как бы он с constexpr-функцией выглядел?
for (i = 0; i < M; i++) { for (k = 0; k < N; k++) { for (j = 0; j < N - 1; j++) { if (array[j] < array[j + 1]) { int temp; temp = array[j]; array[j] = array[j + 1]; array[j + 1] = temp; } } } }Вот эта хуита должна сортировать массив N*M по столбцам, но это не работает. Что тут исправить, чтобы заработало?
>>1197398Господи, я даже вставить код нормально не могу, нахуй так жить?
>>1197397https://ideone.com/IDHF3zpow11 - это для С++11 и выше, где не завезли relaxed constexpr, а потмоу используется рекурсия.pow14 - для C++14 и выше, версия на итераторах.
>>1197398Напиши для одномерного, затем повтори M раз для столбцов. Делать нехуй местным специалистам одуплять твой код.
>>1197403> Напиши для одномерного, затем повтори M раз для столбцов.Ебать ты программист.
>>1197400Напиши входные данные, что должно получиться и что на самом деле получается
>>1197403>>1197408Был неправ, на автомате подумал, что анону нужно матрицу сортировать.
>>1197411Погоди, я тоже ебать какой программист, не понял, где ты неправ?
>>1197400подсказка: индекс k нигде не используется
>>1197417Это, видимо, эффективная реализация пузырьковой сортировки
>>1197417Он там может и не использоваться. Это конечно ебанский пузырек, но работать будет. Но по ходу сортирует он у него по строкам а не столбцам
>>1197421Ну смари. Пузырёк требует 2 индекса для сортировки столбца. Третий индекс нужен для обхода столбцов. А вообще именовать индексы одной буквой это оче не оче.
Уот так уот.
>>1197428Вверху у тебя 6 нулей, а внизу 4, как ты так
>>1197431Так в этом то и дело, что у меня выдает какую то хуйню, а я не знаю в чем проблема.Когда надо было сдавать лабы по сортировкам я бухал, а теперь не могу нормально писать лабы по параллельному программированию в OpenMP.
>>1197413Неправ он в том что судя по формулировке, сортируется не матрица целиком, а содержимое каждого ее столбца отдельно. Хуй знает зачем это нужно, может это я объебался и требовалось именно отсортировать всю матрицу.
>>1197434Объясни задачу точнее. Тебе нужно значения в каждом столбце отсортировать?
>>1197434Друг мой, ты натворил какую-то хуйню в индексах. Что тут непонятного-то? Для одномерного массива:for i = 0 ... Nfor j = 0 ... N - 1if arr[j] < arr[j + 1]Для двумерного то же самое, только обернутое в еще один внешний for для беготни по столбцам.
>>1197443Короче. Напиши любой понравившийся алгоритм сортировки одномерного массива. Затем напиши специальную функцию-геттер, которая принимает указатель или ссылку на матрицу и:1. Так же принимает на вход номер стобца и номер элемента в столбце, после чего возвращает ссылку или указатель на этот элемент. Для задания, где нужно отсортировать столбцы матрицы2. Так же принимает на вход номер элемента в матрице и возвращает указатель на него.Используя вспомогательную функцию, отсортируй матрицу. Если по столбцам, делай цикл по столбцам i от 0 до N, а внутри вставляй код алгоритма сортировки, только вместо обращения к k-му элементу (0 < k < M) одномерного массива делый вызов getter(Matrix, i, k). Для задания, где нужно отсортировать матрицу целиком, в цикле от по n от 0 до N*M вызывай getter(Matrix, n).
>>1197428
>>1197446В индексах, по-моему, всё в порядке, разве нет? Внешний цикл проходит по столбцам, а в пузыре проверяются элементы соседних строк
>>1197434>лабы по параллельному программированию в OpenMPЗа то, как ты собираешься это параллелить, тебя надо отчислять нахуй.
>>1197446Сделал как ты сказал и заработало, спасибо :3>>1197466А как лучше?
>>1197472>А как лучше?Задачка типовая, поищи решение в гугле. Твоя матрица, это один кусок памяти, в котором значения хранятся последовательно по строкам. Данные столбца, которыми оперирует отдельный поток, разрежены и раскиданы по всей длине этого куска. В итоге будет больше копирований в кэш потока, если вся матрица в кэш не влезает (особенно для последнего столбца, у которого первый элемент в позиции n-1, а последний в конце массива). И вторая проблема - кэши потоков будут пересекаться, а так как сортировка редактирует данные, то эти кэши будут требовать постоянного обновления.
>>1197010Это как через жопу хуй сосать. Не для всех.
>>1197402Спасибо, теперь понятно что происходит. Но я все равно не пойму как тот верхний код работает, это какой-то ад.А еще что значит relaxed constexpr, в нем нелья циклы использовать? Вообще какую книгу почитать, где все актуальные фишки C++ ясно и понятно описаны. У Страуструпа, или он шизик?
>>1197850> Но я все равно не пойму как тот верхний код работаетОК, объясняю с самых основ. Начнём с enum { value = 1 };код выше это определение статической константы времени компиляции под именем value равной 1 из времён C++98, в C++11 используется более понятный синтаксисstatic constexpr int value = 1;т.е. в коде нижеstruct MyStruct {enum { value1 = 1 };static constexpr int value2 = 1;};значения переменных value1 и value2 можно получить как MyStruct::value1 и MyStruct::value2. При этом они определены во время компиляции, а значит их можно использовать как параметры для шаблонов. Вместо структуры можно использовать класс, единственная разница, что нужно указывать, что члены являются публичным (у структуры все члены публичные, потому обычно их используют в метапрограммировании, чтобы не писать public).Вот можешь поиграться с кодом: https://ideone.com/LLXYqw
>>1197850Едем дальше. Частичная специализация. Допустим у тебя есть шаблонtemplate<int N>struct NumWriter {static void write() {std::cout << "Передано число " << N << std::endl;}};Этот шаблон вызывается вот так NumWriter<1>::write(); Но что если для некоторых чисел (или типов) ты хочешь сделать особенное поведение? Вот тут можно сделать частичную специализацию шаблона вот так:template<>struct NumWriter<0> {static void write() {std::cout << "Передан нолик" << std::endl;}};как видишь в определении шаблона мы опускаем аргумент, потому что он больше не нужен, но оставляем треугольные скобки и само слово template, поскольку класс всё ещё является шаблоном хоть теперь и не принимает аргументов. А в названии структуры (или класса) мы частично специализируем его, указывая при каких именно шаблонных аргументах он будет вызываться. Частично специализированный шаблон всегда имеет больший приоритет, чем просто шаблон, а потому NumWriter<0>::write(); вызовет именно частично специализированный шаблон.Специализировать можно только часть аргументов. Например:template<int N1, int N2>struct NumWriter {static void write() {std::cout << "Переданы числа " << N1 << " и " << N2 << std::endl;}};template<int N2>struct NumWriter<0, N2> {static void write() {std::cout << "Передан нолик и число " << N2 << std::endl;}};Специализация шаблона будет вызываться если первый аргумент равен нулю, а второй равен любом числу. Если первый аргумент не равен нулю, то вызывается первый шаблон.https://ideone.com/wTZDOV
>>1197850Ну и теперь рассмотрим твой кодtemplate<uint8_t Base, uint32_t N>struct Pow {enum { value = Base Pow<Base, N - 1>::value };};template<uint8_t Base>struct Pow<Base, 0> {enum { value = 1 };};У нас есть шаблон и его частичная специализация при N равном нулю. Если мы напишем Pow<2, 0>::value (вместо 2 может быть любое число), то вызовется частичная специализация и этот код вернёт 1. В остальных случаях вызывается первый шаблон и начинаются вычисления. Допустим мы написали Pow<2, 3>. Он раскрывается вstruct Pow {enum { value = 2 Pow<2, 3 - 1>::value };};Pow<2, 3 - 1> или Pow<2, 2> раскрывается вstruct Pow {enum { value = 2 Pow<2, 2 - 1>::value };};Pow<2, 2 - 1> или Pow<2, 1> раскрывается вstruct Pow {enum { value = 2 Pow<2, 1 - 1>::value };};Pow<2, 1 - 1> или Pow<2, 0> раскрывается в частично специализированный шаблон и на этом рекурсия заканчиваетсяstruct Pow {enum { value = 1 };};в итоге самый первый шаблон получает такие значенияstruct Pow {enum { value = 2 2 2 1 };};и в итоге Pow<2, 3>::value отдаёт 2 2 2 1 или 8.
>>1197850> А еще что значит relaxed constexpr, в нем нелья циклы использовать?Наоборот, без relaxed constexpr можешь писать только constexpr-функции состоящие из одного return и выражения внутри него.> Вообще какую книгу почитать, где все актуальные фишки C++ ясно и понятно описаны.Если с основами C++ уже знаком, то можешь пикрелейтед. Только она на английском, на русском актуальных книг нет.
Что почитать по симдам, векторизации, DOD'у?
>>1196801Жиза. Заработал шизу.
Есть файл с псевдографикой, хочу написаиь конвертер в эксель. Так как там всякие ебучие таблички, т просто так не сохраняется. Есть готовые или интересные решения на плюсах?
>>1198244Рекомендую жаву и Apache POI (сам писал такую хуйню, только вместо жавы использовал котлин). В С++ скорее всего нормальных библиотек не будет.Ну или использовать COM-интерфейсы самого офиса.
using TwoBytes = unsigned short int;using FourBytes = unsigned int;struct HashPair{ size_t operator()(const std::pair<TwoBytes, TwoBytes>& p) const { FourBytes res = (p.first << 16) + p.second; return std::hash<FourBytes>()(res); }};std::unordered_map<std::pair<TwoBytes, TwoBytes>, int, HashPair> dict;Господа, прошу помощи.Есть одна unordered_map, с ключами в виде pair. Я хочу сделать, чтобы коллизий было столько же мало, сколько при ключах типа int. Почему приведенная выше хеш-функция некорректна(или все-таки норм?)? По сути, я формирую число типа int из двух двухбайтовых чисел, и вычисляю его хеш. Но результат все равно гораздо хуже, чем при ключах int.Самописная функция проверки количества коллизий дает около 1300 штук в словаре размера 65535(2 байта) для int'ов и около 24000 для моей функции. Хотя обычные варианты из интернета и boost::hash<unsigned short int, unsigned short int> дают такой же результат(24000). Можно ли вообще сделать лучше?
>>1198475Код хуево вставился, но надеюсь понятно.
>>1198475> using TwoBytes = unsigned short int;> using FourBytes = unsigned int;Есть же uint16_t и uint32_t, который имеют нужное количество байтов на любой платформе. Не забудь подключить хеадер <cstdint>.
>>1198479Да, спасибо, буду знать.Но хотелось бы разобраться во всей этой хуйне с хешем, что я делаю не так.
>>1197889чет проигрываю с этих костылей на костылях
>>1198475Подозреваю, что бакет в хешмапе вычисляется как hash%count. Поэтому, то что находится в верхних разрядах оказывается в пролете. Можешь посмотреть на правильную реализацию в boost::hash_combine, ну или в интернете.
>>1198490>вычисляется как hash%countДа, именно так.>то что находится в верхних разрядах оказывается в пролетеНо хеш имеет тип size_t(4 байта), так что по идее все влазит.>boost::hash_combineА за это спасибо, щас будем комбинировать.
>>1198466Пасиба анон, я через com все же решил.
>>1197887Спасибо, что так разъяснил, вроде теперь понял. Но зачем столько ебатни? Да и еще рекурсия с шаблонами, это же вообще пиздец. Нельзя было просто сделать рекурсивную функцию, как ты в первом примере написал? Или это все ради того, чтобы тупо получить константу? Нельзя было внутри структуры вместо энума, написать static const?
>>1198522Как я говорил это всё костыли времен C++98 (при этом шаблоны языка даже не задумывались для подобного использования). Начиная с C++11 большую часть compile-time кода можно написать в виде constexpr-функций. Подобная шаблонная магия сейчас нужна разве что для написания трейтов, но с приходом концептов (где трейты можно будет писать в более понятном виде и компилятор будет выдавать понятные ошибки если что-то пойдёт не так) необходимость в ней практически отпадёт. Основная суть этого всего что вычисления происходят при компиляции, а в результирующей программе сохраняется только их результат.
>>1198533То есть в будущем (C++ 20?) эти навороченные шаблоны вымрут?
>>1198558Да их и сейчас мало кто использует. Просто станет проще писать шаблонный код. А когда добавят метаклассы (наверное к C++30) вообще зашибись будет. Останется только переработать систему типов сделав её более строгой, а то иногда неявными превращениями C++ уделывает JavaScript в неожиданности. Вот например угадай, что выведет эта программа и попробуй объяснить почему:void fun(int a) {cout << "int";}void fun(unsigned int a) {cout << "unsigned int";}void fun(unsigned char a) {cout << "unsigned char";}void fun(signed char a) {cout << "signed char";}int main() {fun('a');}
>>1198560Слава господу!>наверное к C++30Ахаха лол сука. Будет ли он в 30-м году еще актуален? Может к тому времени какой-то новый низкоуровневый язык взлетит.>что выведет эта программа и попробуй объяснить почемуВ прошлом треде писали, что одинарные кавычки это типо макро для int значения или как-то так. То есть вызовется функция fun(int a). А может и не поэтому, я не знаю короче.
>>1198577> что одинарные кавычки это типо макро для intNYET. Одинарные кавычки - это тип char. И это отдельный, третий тип для символов. Он может быть как unsigned, так и signed в зависимости от настроек конпелятора. Поскольку типы signed/unsigned char и char разные, компилятор выбирает самое простое преобразование, а именно char -> int.
>>1198586> char -> intИ, кстати, выбирается int, а не unsigned int, чтобы сохранить знак, если char в настройках конпелятора выставлен со знаком.
>>1198589>И, кстати, выбирается int, а не unsigned int, чтобы сохранить знак, если char в настройках конпелятора выставлен со знаком. Не гони, для беззнакового char (-funsigned-char) тоже выбирается int.Всё, что влезает в int — промоутится в int.
>>1198560>Вот например угадай, что выведет эта программа и попробуй объяснить почему:КАК СЛОЖНА!!!
>>1198499При перегоне ASCII в CSV без COM правда не обойтись?
>>1198624Это ещё не сложно. Вот пример посложнее:auto vec = std::vector<std::string>{0};std::cout << vec.size() << std::endl;std::cout << vec[0] << std::endl;
>>1198625Может ему хотелось автоматом оформить красивенько документ(ы). Тут простым CSV не обойтись.
>>1198625Можно было обойтись C++\CLI со стандартными дотнетовскими классами для экселя. COM все таки старье.
>>1198626Ничего и не выведет?
>>1198625А потом выясняется, что Excel разделитель между полями берёт из настроек локали, и на половине машин твой csv надо не открывать, а импортить.
>>1198560вангую инт
>>1198626вангую 1 и пустую строку.
>>1198664nullref, логично
>>1198664На самом деле вылетит эксепшен из конструктора std string
Привет, анон. Тема такая, поступаю в вуз и хочу летом за 2 месяца поиграться с крестами, написать что-нибудь на QT. Знаю кресты на уроне написания в процедурке простых олимпиадных задачек(ООП, Поинтеры, темплейты и прочее вообще не шарю). Что почитать(А лучше посмотреть), чтобы быстро вкатиться и написать что-то на QT. Желательно с упражнениями. P.S Знаю немного JS, прошлым летом писал сайтики. Спасибо.
>>1198670угу >>1198668
>>1198673> А лучше посмотретьКек. Какое ебаное поколение растет. Ютуб смотри, где еще ты найдешь братьев по разуму.
>>1198675Ты не прав, если считаешь, что на ютубе нельзя найти полноценных гайдов. Конечно они не будут такими полными как хорошая книга или черновик стандарта, но для начала сойдет. >>1198673Но я тебе рекомендую все таки книжку из шапки. В темплейты пока особо лезть не надо.
Двач-помогач подсоби. Пытаюсь решать на кодворсе задачку. Условие неважно, важно следующее. Есть классstruct PokerHand { PokerHand (const char pokerhand) {}};И есть функцияResult compare (const PokerHand &player, const PokerHand &opponent)Как мне обращаясь в этой функции к player (или opponent) выдрать из него constchar pokerhand, с помощью которого объект был определен?
>>1198896Никак. Полей в структуре-то нет. А указатель pokerhand либо будет удалён вызывающим кодом, либо останется висеть где-то там в памяти.
>>1198896>>1198897Сорян, ступил. Забыл, что кодварс допускает добавление полей
Design View в формах VS 2017 НЕ РАБОТАЕТ. Приходится устанавливать VS 2013.
Как передать int a[5][3] в void( int) ?
>>1199620void( int)
>>1199622void( ^^int), где ^ = звёздочка.
>>1199623void(int^^)
>>1199620Нахуя вы ему сишное говно советуете. Вот как делают профи:template<typename T, size_t A, size_t B>void takeIt(T(&arr)[A]) {// arr - массив// A, B - его размеры}https://ideone.com/tgXycV
>>1199629Лол, вакаба съела вторые квадратные скобки. Смотри кароч код в ideone.
>>1199632>>1199629А без читерства?
>>1199633С каких пор шаблоны стали читерством? Ну можешь передавать в виде указателя, проблем-то.
>>1199634>С каких пор шаблоны стали читерством?Выразился так, да слишком высокоуровнево, хз.>>1199634>Ну можешь передавать в виде указателяТак не могу! Почему и вопрос возник.
>>1199634По идее int^^ и int[][] должны быть одной хуйнёй. Но нет. Понимаешь?
>>1199634Причём в Си вроде работает. Наёбка какая-то.
>>1198673https://www.youtube.com/watch?v=g6fw5n9Gt-E&list=PL0lO_mIqDDFUaZe7H9kY6vWbSVrtwFv4Mпервая ссылка в гугле по вкладке "видео"
>>1199637Ну так используй reinterpret_cast и не еби мозг.
>>1199637В си конпелятор скорее всего выдаёт варнинг, а вот в C++ уже ошибку. Судя по всему кроме шаблонов тут никак. Пиши абстракцию над массивом и не еби себе мозг.
>>1199637Впрочем если совсем хочется, то можно сделать так: https://ideone.com/Q6E0Vx
>>1199648>https://ideone.com/Q6E0VxЧётко. Мерси. Я понимаю, что это вырвиглаз и так писать не нужно, когда есть шаблоны, можно обёртку намутить и тп, но мне просто хотелось инициализировать массив для отладки там, и городить ещё чего-то, затем удалять не хотелось. Спасибо.
>>1199620Void(array<array<int, 5>,3>)
>>1199656>инициализировать массивмассивом
>>1199657Только наоборот внутри 3, а снаружи 5.
>>1199660Я заранее не знаю размера. Я же не могу в определении так сделать(?):void(array<array<int, n>,m>, int n, int m)А вот вариант выше заебись:void takeIt(void^ arg, int m) { auto arr = reinterpret_cast<int(^)[m]>(arg); std::cout << arr[1][2];}
>>1199664>заранее не знаю В смысле я-то знаю, передать его как параметр не выходит, вы поняли.
>>1199664> reinterpret_cast<int(^)[m]>(arg);> error: non-constant expression as array boundНе взлетит. m должен будет быть шаблонным параметром.template<size_t m>void takeIt(void^ arg) {auto arr = reinterpret_cast<int(^)[m]>(arg);std::cout << arr[1][2];}
>>1199667Успешно #stdin #stdout 0s 4532KB6Успешно #stdin #stdout 0s 4392KB6https://ideone.com/1eqMD0Взлетело же.
>>1199664>Я заранее не знаю размераVoid (vector<vector <int>>) Все велосипеды изобретены задолго до вас
>>1199669На msvc отказался работать. Возможно расширение конпелятора.
>>1199670Не думай, что ты умнее всех, заебал. Инициализируй вектор вот так vector = {{1, 2, 3}, {4, 5, 6}};
>>1199673Ок, страдаете дальше
>>1199675Чувак, вектор был самой первой попыткой, мне нужно тестовую хуйню конструктору класса скормить, проверить как будут вычисления работать, дальше я заменю на вектор, который буду заполнять с клавиатуры и всё будет норм.
>>1199677Сделай одномерный массив и не еби мозги.
>>1199677Ты векторы что-ли инициализировать не умеешь? Vector<int> a; a. Resize(5,666);Vector<vector <int>> b; b. Resize (3,a);
>>1199691Там конкретное значение 10 на 10 таблица с числами.
>>1199669>Взлетело же. VLA в C++ — это расширение g++
>>1199629профи обернут не несущий никакой смысловой нагрузки int a[5][3] в класс, а далее будут работать с объектами этого классаблядь
>>1199636Не должны быть.
>>1199620Никак.>>1199633>>1199664Возьми уже https://www.boost.org/doc/libs/1_67_0/libs/multi_array/doc/user.html
2ch, переменные после выхода из области видимости ведь не уничтожаются, почему хозяи запретил нам использовать переменные из других областей видимости текущей функции?
>>1199770>хозяинфикс
>>1199770RAII уничтожаются. В это их весь смысл. А остальное использовать вообще не надо, если только ты не взаимодействуешь с сишными библиотеками или пишешь низкоуровневый особо пирформансный код.
>>1199772Надо нинадо, нужно нинужно, я вроде не в /s/. И я что-то я не вижу что-бы что-то по выходу из областей видимости уничтожалось, всё пишется в новые ячейки - https://godbolt.org/g/9Bji7n. Поэтому у меня прямой вопрос к шарящим, почему хозяин запретил?
>>1199777> не вижу что-бы что-то по выходу из областей видимости уничтожалось> -O0Ты оптимизацию включи, ага. Хотя видимо ты просто троллешь.
>>1199777>https://godbolt.org/g/9Bji7n>-O0Low quality bait.
>>1199780>>1199779Ну так с оптимизацией он вообще нихуя не покажет, а по сути он и с оптимизацией не перезаписывает старые ячейки.
>>1199784> а по сутиЭто астральными путями пообщался с конпелятором и он тебе рассказал? Он вообще эти переменные может хоть в регистры засунуть. У него полная свобода делать с ними что угодно.
>>1199785Ну ладно убедили, он ведь и вправду может эти переменные даже в регистры засунуть, раньше когда хозяин был добрее, он позволял и нам это делать с помощью квалификатора register.
>>1199787Правильно говорить папа бьярне. А вообще из распространённых языков, мне только JS вспоминается, где var'ы кладут толстый на области видимости (да и то в es6 добавили let'ы которые области видимости уже соблюдают). Видимо ты просто поехавший.
>>1199770>не уничтожаютсяА зачем по-твоему нужны умные указатели?
>>1199948Умные указатели нужны для рабов, которые без хозяина сами не могут решить когда переменную нужно уничтожить. Настоящие свободные люди ими не пользуются.
>>1199953Что за хозяин? Ты шизик что ли?
Нужна помощь, вот пример кода из книги Страуструпа:>const int x = 17;>constexpr double max1 = square(x);Функция square:>constexpr double square(double x) { return x∗x; }Он компилируется gcc с++11, все прекрасно. Разумеется, меня посетила мысль, что от смены типа dmv на double ничего поменяться не должно, но хуй там плавал. >const double x = 17; >constexpr double max1 = square(x);>error: the value of ‘x’ is not usable in a constant expressionКак? Почему? То есть в "константности" int он уверен, а в double нет?
>>1199997В msvc у меня square(x) подчеркивает красным, но код компилируется и работает. Я хз почему так. Ждем ответа от экспертов в треде.
>>1199997Версию gcc ты нам конечно не скажешь.
> То есть в "константности" int он уверен, а в double нет? Угу, по той же причине числа с плавающей точкой не допускаются в аргументы шаблона. Поскольку не факт, что a == b в примере нижеdouble a = 1/3.;double b = 2/6.;да и вообще сравнение чисел с плавающей точкой тот ещё геморрой. Нахуй.
>>1200030gcc version 5.4.0
>>1200031Если сделать так, то все начинает работать.>constexpr double x = 17;И я перестаю что-либо понимать.
>>1200081Эквивалентность const и constexpt для целочисленных константных типов, заданных литералом - это костыль из времён C++98, чтобы можно было задавать размер массива константой:const int S = 18;int a = { 0 };Про даблы тогда просто не думали в этом плане, а потому у них такого нет. Нужно прямо говорить constexpr.
>>1200084Макаба сожрала квадратные скобки, вот так: https://pastebin.com/BDpjXdE7
>>1200031>> То есть в "константности" int он уверен, а в double нет? >Угу, по той же причине числа с плавающей точкой не допускаются в аргументы шаблона.Но в constexpr допускаются.
>>1199997https://ideone.com/ALIKPc
Почаны, допустим я получил указатель на приватное поле класса. Пытаюсь его поменять, получаю аксесс виолейшн. Можно как-то обойти этот момент?
>>1200273Потому что в constexpr ты можешь написать свою функцию для сравнения с необходимой точностью. В шаблонах - нет.
>>1198701Он прав. И ты сам ответил, почему. "Для начала" != ""полноценный гайд"" (я даже двойными скобками отметил этот ебаный пиздец, которым ты именуешь последовательность действий для макак, считая ее ниибацо раскрытием темы). Да и как правило весь ютубный мусор запутывает и сбивает с толку. Да как и большинство книг. Но хорошие книги объясняют правильно и набело, а ютуб каналов таких нет, везде какая-то херня, куда ни ткни.
>>1200315на ютуб выкладывают видео с cppcon, плюс с русскоязычных конференций
GetLastInputInfo дает значение координат указателя мыши. Как сделать чтобы функция давала значения постоянно (а не один раз) при появлении нового значения (перемещения указателя)?
>>1200383Опрашивать в цикле. Если это фреймворк там скорее всего навешивается обработчик эвента.
>>1200414>Опрашивать в цикле.
>>1200416>пук
>>1200357Ну это видео неофиты не осилят, да и многовато там мусора для них вперемешку с полезной инфой.
Можно ли в одном проекте часть либ линковать статически, а часть динамически? Если да, то поделитесь скриптом для cmake
>>1200479> Можно ли в одном проекте часть либ линковать статически, а часть динамически?Если либы используют разную линковку рантайма и ты передаёшь указатели между ними, то жди проблем.
Сап. Помогите начинающему со списками, только вкатываюсь в них. Имеется https://pastebin.com/Jq6RHZv7 . Задание: убрать повторяющиеся элементы в группах чисел. То есть если есть 1 1 2 2 2 3 3 нужно вывести 1 2 3.В коде есть функция udalenie, в ней я ифаю (ptr2->info==ptr2->next->info) если всё окей, то free ptr2 и прыгаю на через одно число. Но почему-то ничего не работает. Хелп.
>>1200705>https://pastebin.com/Jq6RHZv7ты зачем с си кодом тут в пласплас тред лезешь?
>>1200705c++ code#include <iostream>#include <list>int main() { std::list<int> mylist{1, 1, 2, 2, 2, 3, 3}; for (auto& i : mylist) { std::cout << i << ' '; } std::cout << std::endl; mylist.unique(); for (auto& i : mylist) { std::cout << i << ' '; } return 1;}
>>1200705Во-первых используй delete вместо free(). Запомни new/delete, malloc/free, не смешивай их. Во-вторых, вместо макроса NULL используй nullptr.
>>1200718>return 1;
Отвечу сюда, т.к. бомбануло а тот тред закрыт:>>1200725Вот бесят такие мамкины умники, думающие за других, хотя у самих опыта никакого нет. В 99.99999999% случаев инлайн ускоряет код, иногда в разы/десятки раз. Кто-то когда-то специально написал такой код, где это не выполняется, и вот, теперь все это повторяют, мол компилятор лучше разберется. Да не лучше ваш тупой компилятор разберется, не работают эти эвристики. Всегда надо инлайнить в критическом коде, вот вам работающая эвристика, дарю.
>>1200772Вот только инлайн это только совет компилятора, он сам думает инлайнить или нет. Иначе ты наинайлешь больше кеша и кирдык твоим оптимизациям
>>1200705Я тоже ньюфаг, я вот так сделал и вроде работает https://ideone.com/iyjj3HНо я не уверен с удалением с heap'а, удаляется ли оно действительно или нужен указатель на указатель (две звездочки). Пусть эксперты поправят.
>>1200772Не нравится: сделай свой вариант макроса FORCE_INLINE для поддерживаемых компиляторов, где будут использоваться проприетарные атрибуты, которые конпелятор уже не будет игнорировать. У всех современных конпеляторов такие есть.
>>1200850Ну в gcc и так есть __attribute__((always_inline)). Меня само рассуждение покоробило, что мол компилятор лучше разберется, такое мнение видел неоднократно. Он разберется лучше чем Вася с laba1.cpp, но в реальном коде всегда нужно руками инлайнить. И если бы такой возможности не было, то писать высокопроизводительный код было бы невозможно.
>>1200881Ну это проблема не компилятора, а стандарта. В расте, например, если сказано инлайн, значит инлайн и никаких но. А в C++ никаких гарантий нет.
>>1200841Никто мне не скажет, правильно ли я сделал?
>>1200881Профилирование уже сделал?
Здесь же много диванных экспертов? Я тут написал кастомный аллокатор для игрового движка. Оцените вообще идею, ну и реализацию. Аллокатор представляет собой односвязный список, ноды держат N байт каждая. Аллокация -- выдергивание первой ноды списка, если она есть, либо аллокация новой. Деаллокация -- пуш в начало списка. В игрушке за один фрейм выделяется 10000 нодов, например, а потом куча не трогается вообще, в предположении эквивалентности фреймов. Ну и можно заделать композицию таких аллокаторов вместе со стандартным, чтоб была пушка. Большие дяди так и делают?мой кот https://github.com/Pearduck/listalloc
>>1201067Ну ничего революционного ты не изобрёл, скажем так.
Двач, помоги. Многого не прошу.Нужен код для Visual C++ с быстрой сортировкой + выводом времени работы, кол-ва обменов и кол-ва сравнений
>>1201195Ну раз нужен так напиши. Тыжпрограммист! А вообще в гугле этого говна под завязку.
>>1201195Загугли просто быструю сортировку и все, кол-во обменов и сравнений я думаю ты сможешь сосчитать, а насчёт времени работы есть функции специальные, их тоже сможешь нагуглить.
>>1196791 (OP)В QT нет поддержки pdf и svg?
>>1201104Я понимаю, последний вопрос к этому был. Я больше по реализации, как вообще, адекватно?
>>1201297Про pdf не скажу, но svg точно умеет.
>>1201067Прочитав по диагонали пополам, вроде нормально. Но:1) Не многопоточно (но, может, это в твоём случае и не нужно)2) Нет локальности между нодами.Я бы выделял по несколько страниц сразу и ноды размещал в них. Или вообще самый простой вариант, если юзкейс позволяет: выделить овердохрена страниц с помощью VirtualAlloc/mmap, и писать в них. Так как страницы физически не выделятся, пока к ним не будет обращения (хотя на линуксе это ещё от настроек зависит), лишней памяти потреблятся не будет.
>>1201360И сразу тогда такой вопрос -- как вкатиться в многопоточность? Что написать для полного осознания проблемы?
>>1201360Насчет локальности ещё. Думаю, можно просто этот аллокатор обернуть в другой, который будет как раз по страницам выделять, получится более гибко.
>>1201364
>>1201371Не люблю прогу по книгам учить. Медленно и не так затягивает, как пилить что-нибудь работающее. Я люблю ставить себе тяжелые задачи, явно демонстрирующие необходимость тех или иных действий. По моему скромному мнению, книгу читать стоит, когда есть представление о проблеме.
>>1201371И всё-таки я начал её читать. Годно, спасибо.
>>1201385Ты не можешь себе задачу придумать?Сделай, например, параллельное скачивание пикч с двача/инстаграма/вк.
>>1201405Это не показательный пример просто. Я думаю, хорошим примером будет реализация сервера какого-нибудь. Как раз много ебли с параллельностью, то, что нужно.
>>1201419И в итоге не доделаешь до конца т.к. постоянно будет чего-то не хватать.
>>1201422Зато поем говна.
Блядь, плюсы охуенный язык. Ухх бля. Ухх бля. Что будет, если всю жизнь быть плюсовиком?
>>1201483Либо прогнивание в каком-нибудь сраном нии где просто никто других языков не знает и плюсы пишутся, как будто сейчас 1989, либо 300к в наносекунду, если тебе повезло и ты гуру своего домена. Ничего посередине.
>>1201495Поэтому легче идти в си или питон.
>>1201483Написал свой первый хелло ворлд?
>>1196801Хотел-было спалить годноту, которая отсюда бы утекла в ру-коммьюнити, но нахуй, быдлу палить годноту это пиздец, потом без денег останешься.
Крч, нихуя не понимаю winapiЕсть ли книга, где объяснения, как для тупых ?
>>1201589Петцольд - Программирование для Windows 95. А вообще:>winapi>2018Ну ты понел
>>1201589книжки рихтера топчик
>>1201563>отсюда бы утекла в ру-коммьюнити>отсюдаты физику чтоли в школе не учил?как может что то утечь из самой глубокой ямы,
>>1201563> спалить годнотухотя нет, давайте удадыватьчто это?геймдев на мобилки где по старинке на крестах ебашат?
>>1201605Ну вот смотри, есть золотая жила, где из-за отсутсвия пидорашек русскоязычных высокая оплата и хай-деманд. Набегут тысячи миллионы пидорашек и будут работать за 500р/проект, хотя я беру до 10k. Все это из-за неизвестности и отсутсвии в СНГ хоть-какой то так скажем ниши. Но обучиться может каждый с уровень инглиша на разговорном уровне. Я все сказал.
10к в $$$ , если что.
как в интерфейсе vs2017/с помощью cl из vs developer tools скомпилировать только один объектник из единственного .срр файла и слинковать статическую либу из уже имеющихся скомпилированных?
>>1201623
>>1201589http://www.winprog.org/tutorial/start.html
>>1201623грязь? если на россию то нахуй не нужно - садят на четверть века
>>1201621>пидорашек зачем оскорбляешь собственных соотечественников?я никогда так не говорю
>>1201594А что ты предлогаешь в 2018 для C++?
>>1201743не писать приложения с GUI
>>1201750Двачую этого.Кто нибудь скажет нахуя это происходит? Я же либу импортнул, всё как в мануале делают. А тут вот...
>>1201752Лол. Я понял что не так. Но интересно, кто-то найдет?)))0
>>1201750А с чем тогда писать?>>1201752Qt с js, это что ещё за хуйня?
>>1201764Ну с питухоном жи есть pyqt, так и тут.
>>1201752Когда понял что это, блевать захотелось. Это не тред кьюта если что.
Правильный ответ - import QtQuick.ControlsЕсли пишешь import QtQuick.Controls 1.4 - выводит старый барПишешь import QtQuick.Controls 2.3 - выводит новомодныйПишешь import QtQuick.Controls 2.2 - сосёшь хуй.>>1201769А чего это тред? Чистого C++ без буста и qt?>>1201764Это чисто "фронтэнд" логика. Бэк на крестах.
>>1201750https://www.youtube.com/watch?v=QCnyqMWPkQk
https://www.daniweb.com/programming/software-development/threads/77173/c-gui-graphical-user-interface-for-beginners
>>1201750Пизда, 80% софта на с++ с ui сделано, хмммм что-то сдается мне что ты тралл.
>>1201796Блять аж чаем захлебнулся когда открыл видео.
>>1201796CLR это же .NET
>>1201798имхо десктоп - мёртвое направление разработки за редкими исключениями. сделав веб интерфейс ты охватишь гораздо больше пользователей из за независимости от ОС и от железа.
>>1201878Qt как раз в веб продвигают
Что может произойти, чтобы вывод данных в консоль и вывод данных в файл друг от друга так отличались?
>>1202035В дебаг-режиме внезапно возникает исключение, а во время работы программы – нет. try/catch исключение не поймал. Почему работа программы просто тихо прекращается, ещё и к тому же в зависимости от потока вывода в разных местах, непонятно.
>>1202035>>1202044Извините, ретард, пытался по null-указателю взять информацию
>>1201878Пиздец, ты посмотри на количество софта, написанного на с++.
>>1202061пиздец, ты посмотри на дату релиза и посмотри на количество появляющихся онлайн сервисов для решения тех же проблем.
>>1202084Если честно, я просто не представляю, как люди пользуются любыми веб-приложениями. Либо я вырос на десктопных, не тормозящих приложениях, и такой требовательный, либо что-то не так с моим софтом, либо люди не знают, каким вообще приложение должно быть.Вот, скажем, открываете вы документ в Google Docs. Открываете страницу, начинаете набирать, и понимаете, что полностью страница еще не загрузилась, и джаваскрипт не успел перевести фокус на поле ввода. Первые три набранные буквы пропали.Это просто первая мелочь, пришедшая мне в голову, но она для меня столько значит, что сразу ставит крест на Google Docs.Или, например, нажимаете во многих веб-приложениях правую кнопку мыши на каком-нибудь объекте, ожидая, что вы получите меню объекта, и видите там «назад», «вперед», «сохранить страницу», и так далее. Понимаю, что нажатие правой кнопки мыши можно перехватывать, как это делает тот же Google Docs, но когда ты такое видишь в, казалось бы, десктопном приложении (написанном на node.js, который тащит с собой chrome.exe и ffmpeg.dll, и простейшее приложение занимает больше 50 мегабайт в архиве), то это просто неприемлемо.«Десктопные» приложения Slack, Mattermost, текстовый редактор Atom, который раньше не умел открывать файлы с размером более 2 МБ, а сейчас открывает мегабайтный файл несколько секунд — просто какой-то мусор, непонятно, кто в здравом уме будет пользоваться такими программами, пока есть альтернативы в виде нормальных десктопных приложений.
>>1202085мне кажется, паста написана году так в 2012. уже 3 года пользуюсь таблицами, документами и презентациями гугл докс, музыку слушаю онлайн, фильмы/сериалы по возможности тоже. почти нет необходимости в флешках, открываю всё с любого устройства, зависимость есть, брат жив.
>>1202114Написана полтора года назад.
>>1202085> я вырос на десктопных, не тормозящих приложенияхЭх, вспоминаю все эти "не тормозящие" кады, фотошопы и офисы, как же охуенно было (нет).
>>1201775Это тред C++, а не вольных пересказов всех его библиотек на других языках. Не понимаю зачем ты это сюда притащил, если джаваскриптеры там <-
>>1201878Ага, особенно когда сам софт завязан и на ОС и на железо.
Подскажите новичку, очень хочу изучать с++, есть-ли веб-ресурс с курсами/задачками? Сам знаю прог на уровне студента на паскале, но очень хочу вкатиться! Может, кто-нибудь хочет взять ученика себе, падавана? Буду служить за еду!
>>1202238Ты долбоёб? Почему ты игноришь шапку?
>>1202238Всё просто, без задней мысли, берешь и программируешь. Для понимания можно оптимизирующий компилятор написать.
>>1202241Там нет именно курсиков и туториолов.
>>1202301Ищи заголовок почти в самом конце "Другие обучающие материалы".Там будет три ссылки (туториал и курс на stepik).https://github.com/sosachbot/cppthreadhat/wiki
>>1201621crypto """"currencies"""? Нахуй и впизду.
Помогите с FLTK, которую используют в книге Страуструпа. Слил FLTK, собрал с помощью make install. Когда пытаюсь скомпилировать #include <FL/Fl.H>#include <FL/Fl_Box.H>#include <FL/Fl_Window.H>int main() { Fl_Window window(200, 200, "Window title"); Fl_Box box(0,0,200,200,"Hey, I mean, Hello, World!"); window.show(); return Fl::run();}Выдает ошибку FL/Fl.H: No such file or directory #include <FL/Fl.H>Пытался и через VSCode (inb "поставь Visual Studio" - не хочу забивать гвозди микроскопом) и через обычную командную строку. В VSCode добавлял путь "C:/FLTK/include". Убирал "FL/" в заголовках. Добавлял переменную окружения. Один хуй - та же ошибка. В чем проблема? (Win10)
Плюсаны, кароч проблема такая, вкотился в ойти, год уже пишу на плюсах кроссплатформенный код для флота за копейки, но суть не в этом. У нас используют внутренний фреймворк написанный какими то джедаями С++, я смотрю на охуенную шаблонную магию и оргазмирую. Подскажи, как научиться так охуенно писать на шаблонах? Книжки, курсы, все что угодно.
>>1202551 --> >>1197889Сам после этой книги начал понимать шаблонную магию и даже умеренно использовать её.
>>1202546>Пытался и через VSCodeСам виноват.
>>1202551Александреску читай
Вопрос от совсем зеленого.Не всегда понимаю как работает составной оператор. Вот есть условие:if ((a > b && k > b) || (c > m && f > m)).В этом случае условие работает так, что сначала проверяется этот блок "(a > b && k > b)", а после (если он не true) (c > m && f > m)?Или здесь можно написать так, а сам язык разберется за тебя:if (a > b && k > b || c > m && f > m).Благодарю за ответ.
>>1202674Составное условие*
Подскажите по винапи. Есть утилита консольная в папке с прогой. Как ее лучше цеплять? ShellExecute или WinExec? И как бы ебашить логирование у утилиты? ( стандартная виндовая консольная).А еще я ебал опять пилить кому-то интерфейсы на винапи. Пмздец, сука, блядь.
>>1202677>И как бы ебашить логирование у утилиты? ( стандартная виндовая консольная).имеешь в виду писать из оконного приложения в консоль? есть группа WinAPI методов для работы с консолью. работа заключается примерно в следующем - хватаешь хэндл на активный буфер консоли и через WriteConsole пишешь в него
>>1202674>В этом случае условие работает так, что сначала проверяется этот блок "(a > b && k > b)", а после (если он не true) (c > m && f > m)?да>Или здесь можно написать так, а сам язык разберется за тебя:if (a > b && k > b || c > m && f > m).в этом случае да, можно. чтобы лучше понимать тебе стоит почитать про логические выражения и их приоритет. конкретно && имеет больший приоритет, чем ||. это как плюс и умножить - сначала умножение, потом сложение
>>1202686Про приоритет я читал где-то, но если будет пример из типа:if (a>b && k >b && s<k && m>f).Тут приоритеты будут равны, то есть здесь надо работать со скобками как в алгебре, да? if ((a>b && k >b) && (s<k && m>f)).
>>1202692в приведенном тобой примере результат одинаковый в обоих случаяхчто больше1 + 2 + 3 + 4 или (1+2) + (3+4)?
>>1202698Что-то опять хреновый пример привел. Но суть такова, что сами по себе скобочки будут функционировать и будут более понятны для меня? Cпасибо за ответы!
>>1202701да, скобки меняют приоритет действий.
>>1196791 (OP)Стоит ли учить c++ после питона ? или лучше дальше дрочить очко синтаксическим сахаром и смотреть аниме ?
>>1202684 а если я делаю шеллэкзикьют и там ебану спулинг, так получится?
>>1202707второеспециализируйся, ептчем разбрасываться
>>1199629Блять почему оно работает? В функцию же по идеи просто передается указатель на массив без его размеров. Как называется вид такого шаблона?
>>1199636>^^CLI выйди вон
>>1197889Анончек, спасибо за книженцию, очень пиздатая. Можешь подкинуть чего-нибудь >=C++14 для не начинающих?Мейерс естьМного классики есть хорошей, но она вся до одинацатых. Или её тоже стоит почитать?
>>1203097> чего-нибудь >=C++14Да там по сравнению с 11 ничего такого особенного (по крайней мере, что не описывается а той книге) и не добавили. Легче прочитать всякие блоги о новых фичах и сразу решить что тебе из них нужно.
>>1203020Не указатель, а ссылка. При этом ссылка на тип, у которого явно указано, что это 2d массив с известными (шаблонными) значениями. Вот компилятор при вызове функции и заполняет все шаблонные значения T -> int, A -> 5, B -> 3.
>>1203100А как ты мне объяснишь вот это? https://www.ideone.com/LCcSqe Как видишь внутри функции параметр уже не массив, а указатель (Pi это pointer int). К тому же sizeof теперь показывает размер адреса, на который указывает указатель. Но использовать ты его всё равно можешь как массив. Вообще нет разницы что ты объявляешь в параметре, хоть указатель, хоть массив, результат у них одинаковый, что доказывает вторая функция. Да что я это рассказываю, ты и так наверно всё знаешь. Ты мне лучше объясни, где вообще хранится инфа о размере массива, т.е. откуда ее sizeof достает?
>>1203109Ты, видимо не понял. Передача массива по значению - int(a)[] и передача указателя - int(*a) это действительно одно и тоже. А вот передача массива по ссылке int(&a)[N] - это уже совсем другая хуёвина. И только в последнем случае можно (точнее нужно, int(&a)[] не скомпилируется) добавить шаблонный параметр для размера массива.https://www.ideone.com/7wtqyb
>>1203110Вот именно, что я не понял. Откуда этот ебанный шаблон получает размер массива? Ты же не передаешь его в функцию как дополнительный аргумент, например как func(x, sizeof(x)/sizeof(x[0])), а просто func(x).
>>1203112Именно что передаю, просто во время компиляции. Когда я определяю шаблон я говорю, что переменная a должна быть ссылкой на массив размера N. Просто компилятор вместо N подставляет реальный размер массива при специализации шаблона. Т.е. вызов funcArrayRef(x); аналогичен funcArrayRef<sizeof(x)/sizeof(int)>(x);
>>1203112Ну вообще размер хранится в метаданных выделенной для тебя памяти.
>>1203112Возможно у тебя путаница с Си где есть VLA. Однако в C++ VLA нету и sizeof(массив) является константой во время компиляции, а значит может использоваться в качестве шаблонного аргумента.
>>1203112Компилятор очевидно размер знает. А это сахар. Вроде в 17 добавили подобное, но я не джедай и могу сильно наёбывать.
>>1203117> Вроде в 17 добавили подобноеДля функций эта хуйня была всегда. В С++17 добавили ещё и для конструкторов классов.http://en.cppreference.com/w/cpp/language/template_argument_deduction
Поясните за эту книжку, если я полный нуфаня? Она чем-то лучше/хуже того что написано в оп-посте?Просто мне советуют конкретно ее и Совершенный код Макконела чтоб стать прохрамистом.
>>1203165лучше учи C# или какой нибудь современный js-фреймворк
>>1203167Нет. Я хочу быть гейдевом.
>>1203168C# & unity
>>1203169Чому лучше?
Тормоза, фризерочки. Зачем эта песочница для детей со специальными потребностями когда есть бозжественные Unreal движки написанные на высокоскоростных плюсах. И куча библиотек для создания своего движка.
>>1203169>>1203173
>>1203172>>1203173Unreal&BPюнити имхо хуже хотя я ничего серьезного в них не делал, но если тебе прямо хочется писать скрипты, вместо того, чтобы разрабатывать игру, то для C# много всяких фреймворков и прочего, позволяющих делать что угодно, и если геймдев не выстрелит, всегда сможешь пойти в бездушный энтерпрайз или фрилансить на коре. мне кажется, у тебя какое то романтическое заблуждение, что геймдев - это написание кода, когда на самом деле это левел дизайн, моделирование, анимирование, текстурирование и лишь немного скриптов, которые на UE прекрасно пишутся через ВР
>>1203177На чем в UE пишутся скрипты? Или ты имел ввиду под скриптами BP?
>>1203181под скриптами я имею в виду набор инструкции для всего происходящего на сцене. и их писать можно на крестах, а можно на ВР.
>>1196791 (OP)Подскажите, пожалуйста. Я сижу через Вижал Студиа. Что мне надо открыть, чтобы я мог работать с этой книгой? Постоянно выскакивает проблема какая-нибудь. Сейчас класс не читает.
>>1203194Скрин скидывай
>>1203194P.S. Sales_item.h Мне как полному нулю очень сложно, а тут в учебнике вообще ерись написана. Мне постоянно приходиться обращаться к кому-нибудь, чтобы мне объяснили задачу.
>>1203196Ты мне подскажешь?
>>1203197Я у тебя не вижу заголовочного файла Sales_item.hСоздай его или что бы не ебатся вообще удали.
>>1203206Мне вот такую надо было написать.
>>1203194А вообще если очень сложно с визуалом работать, то скачай для начала лучше DevC++. Там все просто . Но это только на момент обучения.
>>1203210У тебя в проекте должен быть файл с расширением .h.А именно Sales_item.hСоздай его в проекте и впиши туда то что написано в книге. Или читай где его достать и суй в папку с проектом а потом подключай через инклюд.А вообще вот что посоветую https://stepik.org/lesson/534/step/1?unit=857Пройди весь урок 1.5. чтобы понять что такое заголовочные файлы обьектные исполняемые и тд и тп.
>>1203210Как дила Игоряша?)))
>>1203220Неаааааат, так и знал на двочах задианонят)
>>1203221Ебать ты еще и дотер
>>1203224Бывший, молодость и панк-рок
>>1203224А как ты это узнал?
>>1203226Ты очень тупой, сразу видно - днотер.
Я сейчас дописываю программу за одним чуваком, который был невероятным фанатом синглтонов, он понатыкал их просто везде. Особенно меня возмутила его обертка MPI.К примеру, чтобы узнать номер процесса, необходимо сделать MPI::instance()->rank()Разве использование статических классов не красивее? жаль в C++ такой концепции нет, как в шарпеРейт мейн функцию https://ideone.com/i6QynO (5 строк кода)Видел на stackoverflow обсуждение (в контексте шарпа) и насколько я понял, синглтоны полезны только если синглтон с наследованием, если экземпляр необходимо передавать как аругмент (нахуя?) или сериализовывать (опять же зачем?)Какие ещё подводные камни в использовании статических классов?
>>1203287Если используешь C++17, можешь упростить код ещё сильнее и будет меньше ебли с .h/.cpp файлами. Ну и конструктор надо бы сделать приватным.https://ideone.com/gy7JuT
>>1203287>Какие ещё подводные камни в использовании статических классов?Можно соснуть когда статические классы начинают дергать друг-друга в конструкторе. Сам на такое нарвался. Синглтон Маерса корректно работает в таком случае
>>1203307>конструктор надо бы сделать приватнымНаверное, лучше вообще delete конструкторы сделать.А насчет inline членов надо посмотреть, выглядит как-то непривычно. Хосподе, сколько же в плюсах ключевых слов стало, ехал inline через decltype(auto), видит в constexpr noexcept.
>>1203397> Наверное, лучше вообще delete конструкторы сделать.Рекомендуют делать приватным, чтоб сообщение ошибки было понятней (мол запретили создавать объекты), а при delete будет выводится что конструктор не найден: сразу и не поймёшь что оно значит.
>>1203169Это говно не является движком.
>>1203173>Тормоза, фризерочкиТы крузис собрался делать? Если ты делаешь игру в одиночку, у тебя ресурсов хватит максимум на пиксельную хуиту. С трехмеркой требования к ассетам возрастают в разы. Анимацией из двух кадров уже не обойдешься, надо делать скелетку, спрайтами 32х32 тоже, надо рисовать текстуры, настраивать материалы. Это все требует большого опыта, времени и денег, которых у тебя конечно же нет. Кодить 3Д в разы сложнее, даже без учета графики, надо понимать матан: попробуй, например, написать функцию пересечения луча со сферой без гугла. Если хочешь делать игры, начинать с крестов - самое худшее решение.
>>1197889В свободном доступе только первое издание нашел.Поделитесь ссылкой, пожалуйста.
>>1203647ох, ты скозал?
>>1203685В утке ~ третья четвёртая ссылка.
>>1203657>функцию пересечения луча со сферойНе уж-то все так плохо? Мне бы хотя бы ОСНОВЫ, книжку, курс по >Кодить 3Дна русскомА в крузисе хотя бы отчасти понимать исходный код движка. На звание супер специалиста я, конечно же НЕ претендую но нацелен и понимаю, что это ад и пиздец, но также и понимаю что все знать я не могу. Ну а че, кому сейчас легко. Я уверен что те кто кодит 3д не родились такими, и тоже начинали с рисования условного треугольника в каком-нибудь ОпенДжеЭле.А плюсы считают некоторые лучшим языком как первым для освоения, и это отчасти понятно т.к. получив в кровавой схватке с самим собой понимания основ назревает вопрос, а нужно ли оно вообще? Дальше идти по пути боли и страданий или стать смузи-питонщиком? Тут то происходит естественный отбор. Чем сложней условия тем крепче шкура, тем ты лучше уже по-умолчанию.
https://ideone.com/bRYdZ0В чем собственно говоря проблема. Функция возвращает указатель на элемент в векторе. Вектор в функцию я передаю НЕ по ссылке, то есть создается его копия. В Visual Studio 2015, если я использую функцию authorize с обычным циклом for, то она возвращает какой-то мусор (что логично), а используя range for она почему-то возвращает корректный указатель. Я понимаю, что правильно передавать вектор по ссылке, но блядь, почему это все работает так криво?
>>1203882Сейчас бы ещё думать почему в одном случае UB ведёт себя так, а в другом иначе.
>>1203882И, кстати:for (auto user : users) {Здесь (в отличии от обычного цикла) во время каждой итерации создаётся копия user (чтобы не создавалась надо писать auto& или auto&&). Видимо поэтому возвращается указатель на верные данные: потому что стек ниже с ними ещё не успели засрать.
Если я обучаюсь по 11-й версии, как мне посоветовали в треде, много ли я говна наемся, если работать мне нужно будет на 17?
>>1203959Ничего не наешься. В C++17 можно разве что использовать if constexpr вместо некоторых уродливых SFINAE, но я сомневаюсь, что ты будешь обучаться премудростям SFINAE вообще.
>>1203962Спасибо, добродвач!
"Everything you ever needed or wanted to know about C++"
>>1203959"работать"ой, бляговно лепить, ты это хотел сказать?
>>1203882какие нахуй циклы в 2к18ты совсем ебобо?
>>1204023А что не так?
Анон, посоветуй годных статей eng/rus по умным указателям, актуальным на 2018. И еще, нужны ли мне они, если я не пишу приложения с GUI?
>>1204116> Анон, посоветуй годных статей eng/rus по умным указателям, актуальным на 2018.Пикрелейтед книга. Целая глава посвящена им. Алсо, с C++11 эти указатели особо не изменились.> И еще, нужны ли мне они, если я не пишу приложения с GUI? А то! Это наоборот если пишешь, например, на Qt нужно использовать указатели осторожно и с костылями (например писать особые функции, вызывающие deleteLater для удаления QObject'ов).
>>1204176>Целая глава посвящена им. Алсо, с C++11 эти указатели особо не изменились.Разве с C++ 11 auto_ptr не стал deprecated? И где то читал, что то ли unique_ptr то ли shared_ptr какашками обмазывали. Я в целом имею небольшое представление что это за умные указатели, мне бы хотелось узнать когда их стоит использовать, в чем pros&cons, и как они изнутри устроены. А то я пишу околосистемную дичь и мне кажется, что я пишу "не на С++, а на С с классами". Попробую поискать ответы на вопросы в книге
>>1204192Я имею в виду в 14 и 17 особо не изменились по сравнению с 11. В 14 добавили make_unique, а в 17 удалили auto_ptr.
РАБотающие аноны, что нужно кроме джентельменских stl/boost на вашей работе? Пошерстил вакансии, в каждой компании своя область с сильно отличающимся стеком. На полюсах сейчас и так нужны одни джедаи пишущие с 85года, поэтому проебаться с областью вкатывания не хочется.
>>1204222Не лезь, нет там вакансий для начинающих, нет их.
>>1204192>как они изнутри устроеныНу грубо говоря умные указатели это оболочка вокруг сырых указателей. Используются они для того, чтобы избежать утечки памяти. Создаешь класс, внутри конструктора выделяешь память, а в деструкторе освобождаешь. Фишка в том, что когда объект выходит из скоупа, его десктруктор автоматически вызывается и выделеная память освобождается. Самый банальный пример https://ideone.com/4McLZp
>>1204235Только вот самая мякотка умных указателей в том, что они либо только перемещаются (unique_ptr) либо имеют счётчик ссылок (shared_ptr). Твой пример только скрывает реализацию удаления и ничего не говорит о владении указателем, т.е. его можно как копировать так и перемещать, а значит непонятно кто его должен удалять при передаче в качестве аргумента: вызывающая функция или вызываемая.
>>1204176на пике, да, оче годная книгав отличие от более ранних книг мейерсаimho, канеш
>>1204102обход коллекции циклом
Пиздец, все такие умные. Я только cout hello world написал, тут есть такие же новички, желающие получать по 500к в месяц?
>>1204231Труизм. Попробую через стажировки влезть. Один хуй писать диплом два года на плюсах и небольшой около проект на qt.
>>1204239Он только Раи и показал, по факту основной принцип именно в этом.
Пусть есть кусок кодаstd::array<int, 2> arr;int a = arr[1];Я правильно понимаю, что произойдет оптимизация и адрес второго элемента массива вычислится на этапе компиляции, то есть на асме не будет кода вроде int a = *(arr + 1);Пусть теперь у меня есть классclass Foo {std::array<int, 2> arr;int get(int k) const { return arr[k]; }}Foo foo;int a = foo.get(1);Получу ли я эффект как в прошлый раз, если добавлю constexpr к функции get?Кстати, я и в первом своем утверждении не уверен, как наиболее просто посмотреть ассемблерный код функции/куска программы? CLion
>>1204272Раи был и в auto_ptr, что не мешало ему быть говном.
>>1204274Ну не таким уж и говном он был, юзался же, другое дело, что у него присваивание было деструктивным и немного нарушало логику программы при чтении.Но в целом да, твоя правда.В этом плане юник намного более читаемый.
>>1204273> добавлю constexpr к функции getВ данном случае от constexpr не будет толку. Constexpr-функция работает во время компиляции только если возвращаемое значение используется в constexpr-контексте (например присваивается constexpr-переменной или используется как аргумент шаблона), в остальных случаях никаких отличий от простой функции нет. Были предложения по добавлению constexpr-аргументов для функций, но даже к C++20 этого не будет, возможно примут позже.Если хочешь сделать 100% код, вычисляющийся во время компиляции, используй шаблоны:template<int k>int get() const { return arr[k]; }int a = foo.get<1>();
>>1204286> int a = foo.get<1>(); А если быть точнееint a = foo.template get<1>();Всё время забываю это ключевое слово добавлять.
>>1204286Впрочем в данном случае шаблон не нужен и компилятор сам заинлайнит и соптимизирует функцию. Можешь добавить inline перед функций на всякий случай.
>>1204250мы не умные, у нас тупо бекграунд и года задротстване лезь в кресты в 2к18, рядом php и js треды
Хочу написать видеостриминг для себя по фану. С мобилы видео снимаю, на другую мобилу отдаю.При этом хочу сохранить архив разговора на серваке.Как должен выглядить сервер?Как вообще делать стриминг видео с ffmpeg в С++?
>>1204311Может использовать что-то вроде битторрента?
Так для чего нужен inline? Чтобы функции инлайнить или чтобы можно было определенную в одном файле функцию подключать и использовать в разных сурсах?
>>1203169Маловато вакансий, а вне мобильных игр тем более. Работал с этим какое-то время, приходилось пердолиться с багами Mono.
>>1203657>Если ты делаешь игру в одиночкуНадо быть оторванным от жизни человеком, чтобы порываться делать игры в одиночку. Имхо. А ты его к таким не глядя приписал.>Кодить 3Д в разы сложнееПричем тут 3д?>попробуй, например, написать функцию пересечения луча со сферой без гуглаПопробуй, например, <вставить типовую задачу твоей сферы> без гугла. Да и конкретно в пересечениях хули понимать, взял да написал. Там матан уровня первого курса.>Если хочешь делать игры, начинать с крестов - самое худшее решение.Ну хуй знает. Я постом выше высказался о шарпе и его протекающих абстракциях.
>>1204340Ну я хочу что то типо скайпа навасянить, для себя чисто
>>1204360Чтобы говорить компилятору, что тебе было бы приятно, если бы он вместо вызовы функции встроил код функции.
>>1204426>А ты его к таким не глядя приписал.Потому что таких вкатывальщиков 99%. И все хотят писать FPS или MMO.>Причем тут 3д?Потому что он хочет кодить 3Д в УЕ4, как я понял.>Там матан уровня первого курсаВся 3Д графика - это линейка первого курса, только первокурсник хуй чего напишет. Нужен опыт и понимание, как оно работает.>Я постом выше высказался о шарпе и его протекающих абстракцияхДа это не важно. Важно то, что можно взять юнити, и за выходные слепить игрушку уровня пекмена. С крестами так сделать гораздо труднее, особенно без опыта.
>>1204569>Потому что таких вкатывальщиков 99%Хуита и пиздёж. Большинство вкатывальщиков в программирование хотят вкатиться в крупную компанию и получать от нее бабло за программирование игры. Ты путаешь со вкатывальщиками в бизнес, но у них же ручки отсохнут программировать.>Потому что он хочет кодить 3Д в УЕ4, как я понял.Он хочет писать игру, и разговор о том, делать это на Юнити или Уе. Причем тут вообще 3д? Если он будет делать 3д-игру, он будет пердолиться с трёхмерным представлением вне зависимости от инструмента.>Вся 3Д графика - это линейка первого курса, только первокурсник хуй чего напишет. Математические операции над этой графикой - легко напишет. Саму игру со всей обвязкой - да, нужно "понимание" (читай еще один семестр ТПМ ему почитать и будет понимание). >Важно то, что можно взять юнити, и за выходные слепить игрушку уровня пекмена.Да можно, конечно, но много ты на ней заработаешь? Скорее всего нет. А много ли ты на нее потратишь, учитывая что мог бы за это время научиться чему-то более дельному (за что больше платят)? Дохрена, особенно на поддержку того, что написал в выходные. Короче, к чему я это всё говорю - программирование игр на юнити это типичный случай протекающей абстракции, когда ты можешь что-то наговнокодить в одно лицо по пошаговым руководствам, но программист на Юнити всё равно должен знать скажем половину того матана, которым ты пугаешь человека который хочет перейти на кресты. Если ты будешь его пугать и он не понюхает этот матан, его просто не возьмут на работу. Или ты отталкиваешься от того что он сейчас прочитает гайд, напишет сам игру, заработает кучу бабла, и советуешь ему юнити для этого?
Вы оба правы.
>>1204307Я умею 3Д модели делать. Осталось немного с++ поддрочить и буду игрушку пилить. У меня анальный вектор в сторону эстетики направлен, вполне вероятно моя игра выстрелит.
Я набираю в VSStudio name, подсказывается из дропдауна нужный мне namespace. Какую клавишу нажать, чтобы выбрать нужный мне из дропдауна элементик/слово?
>>1204519cppreference пишет иначе.
>>1204360>Так для чего нужен inline?Для того, чтобы класть на one ODR-rule.
>>1204273>как наиболее просто посмотреть ассемблерный код функции/куска программы?God Bolt.
>>1204785Tab.
>>1204666>Хуита и пиздёжВ /gd спроси или на gamedev.ru. Каждый первый школьник хочет делать крузис или доту.>он будет пердолиться с трёхмерным представлением вне зависимости от инструментаНа юнити вполне можно 2Д делать, на УЕ - затруднительно.>Математические операции над этой графикой - легко напишетТы очень высокого мнения о первокурсниках. Для абсолютного большинства даже выпускников написать скелетную трансформацию - невыполнимая задача. Хотя там тупо умножение матриц. Кватернионы для большинства - вообще темная магия.>Да можно, конечно, но много ты на ней заработаешь?Если напишешь flappy bird или samoliotik - заработаешь. А если не заработаешь, получишь навык написания игры. А этому никто и нигде не учит, в отличие от матана. Например, знания как сделать физику платформера, чтобы хорошо игралось, можно получить только практикой. Если он сядет за кресты, он вероятно научится кодить графику, физику, потроха движка, но игры он делать не научится, потому что ни одной законченой игры не сделает, и опыта не приобретет.
>>1204817+1
Почаны, а вот есть вопрос. Как мне сделать что-то типа того?Govno` pgovno = new Govno;pgovno->setMocha(42,42, "hui");Mocha` pmocha = &(Mocha)pgovno->getMocha(42,42);cout << &pmocha <<endl; //печатает huipgovno->setMocha(42,42, "pizda");cout << &pmocha <<endl; //печатает pizda
Кто-нибудь платно тут хочет взять в ученики дауна? Направление - Unreal engine rapid prototyping и Shader graphics programmer. Денег мало, могу брать в процессе ваши фриланс-заказы на себя, свободно владею английским, могу делать вам простые 3Д модели сосать член.
>>1205025https://wandbox.org/permlink/Dsp4NRykR6iPoHJW
>>1205053Это не то, мне нужно, чтобы можно было получить указатель на поле поля класса грубо говоря.
>>1205056Присвой массив.
>>1205059Не понял.
>>1205056Используй умные указатели.https://ideone.com/jMPyC4
>>1205069Ты АСД изучал?
>>1205072Да, оно, благодарю.>>1205073Нет.
Анончики, а что это за библиотека такая - MFC?Есть опыт ковыряния Qt, WxWidgets и прочего. С MFC получится дней за пять разобраться?
>>1205077> Анончики, а что это за библиотека такая - MFC?Говно мамонта.
Философский вопрос, но мучает меняКак назвать шаблоные названия типов? тип template <typename T....>Вот есть у меня класс template <typename XUI>, но сам тип XUI не нужен, я потом делаю внутри XUI2 = std::decay_t<XUI>, и вот как адекватно называть? чтобы потом не абасали
>>1205140Да называй как хочешь. Я вообще с подобной хренью не заморачиваюсь.
>>1205144Шаблоны внутри шаблонов, ну еб твою мать. Вот эту книгу советовали >>1197889 , в ней 800 страниц, и это все только о шаблонах, это же ебануться можно. До того как я начал учить C++, я в основном слышал о нем хейт типа, байтоебство, указатели, работа с памятью. Да, после языка с сборщиком мусора это не совсем комфортно и можно накосячить, если нет опыта, но работа с ними как мне кажется практически всегда логична, т.е. причины и последствия понятны. Но вот я думаю, что самый настоящий пиздец в C++, это шаблоны. С ними вообще всякую хуйню можно вытворять. Ну если глянуть на гитхабе какой-нибудь проект, где их по полной используют, то можно нервный срыв получить, пока ты будешь пытаться расшифровать этот спагетти код. Я хуй знает, может я что-то не допонимаю или ума не хватает, но это же какой мозг надо иметь, чтобы серьезно такой код писать?
>>1205197> Шаблоны внутри шаблоновЭто не шаблоны, а шаблонные алиасы для типов. Если часто пишешь хуйню вроде std::variant<std::optional<Tazaza>, std::vector<Tbobobo>>, то легче сделать алиасtemplate<typename TA, typename TB>using MyType = std::variant<std::optional<TA>, std::vector<TB>>и писать простоMyType<Tazaza, Tbobobo>
Аноны, почему decltype не может вывести тип decltype(int) ? или template <typename T> auto plus() -> decltype(T + T)Что за кастратсво?
>>1205302Потому что decltype получает тип из переменной. Тебе же нужна обратная операция: получение (псевдо)переменной из типа. Ключевое слово: std::declval (не забудь подключить хеадер <utility>). Вот твои пример, написанные правильно:decltype(std::declval<int>())template <typename T> decltype(std::declval<T>() + std::declval<T>()) plus() { ... }
>>1205302Мб потому - что аргумент decltype выражение или значение? Зачем ты туда типы пихаешь?http://en.cppreference.com/w/cpp/language/decltype
>>1205309ебать костыли
Анончик, приветТы сталкивался когда-нибудь с OCCI?У меня упорно ResultSet падает на getString() (причем на 17 студии падает из-за строк длиной больше 15 символов, а на 12 студии - на следующем шаге цикла при вызове getString() heap corruption выпадает).Чё с этим вообще можно сделать? Я-то нашел способ, перевожу все в clob, читаю его в вектор и перевожу в строку, но блядь, это же костыли и ну их нахуйПодключал через NuGet, instant client ставил не сам (не разобрался нихуя)
>>1205302decltype(T a + T b)Держу в курсе.Ты не понял, как деклтайп работает.
>>1205427Так делаешь, если у тебя plus имеет сигнатуру plus(T a, T b).
>>1205197чел, книжка джосаттиса вообще чтиво по умолчанию для кодера на крестах, без нее вообще нахуй не надо допускать человечков к боевому коду в продакшоне..
Можно на плюсах поменять две переменные любого типа/класса на месте (не создавая новый переменных, не добавляя в стек и тд)? Я хотел вот так:a = a ^ b;b = a ^ b;a = a ^ b;Где ^ - побитовый xor. Однако чтобы сделать такое для объектов произвольного типа, нужно каким-то образом интерпретировать их как последовательность бит, опять же без доп. памяти.Мне интересна реализация, про std::swap я знаю.
>>1205559Можно перегрузить operator^
>>1205563Я хотел написать универсальную функцию, которая работает для любого класса. По сути своя версия swap.
>>1205559>две переменные любого типа/класса на месте (не создавая новый переменных, не добавляя в стек и тд)? for(i=0;i<sizeof(Object);i++){ ((uint_8t)&obja)=((uint_8t)&obja)^((uint_8t)&objb); ((uint_8t)&objb)=((uint_8t)&obja)^((uint_8t)&objb); ((uint_8t)&obja)=((uint_8t)&obja)^((uint_8t*)&objb);}
///*/
>>1205595Хуита. Моя версия на шаблонах (оптимизированная для 64-битных систем) круче: https://ideone.com/P1tE8A
>>1205603Алсо, на С++17 выглядит даже понятно: https://ideone.com/gcvvsw
>>1205603Объясни, как это работает. Идею я понял, а откуда берутся +1, +2, +4 -- нет.
>>1205613Хотя кажется понял
>>1205613Смотри C++17 версию. Я просто забыл про if constexpr когда писал код.
>>1205613Это просто оптимизация. Можно xor'ить побайтово, а я сделать что будет xor'ы выполняться с 64-битными значениями, а потом с 32 и с 8 в конце. Можно ещё сильнее ускорить с SIMD, но скорее всего компилятор сделает это и сам.
>>1205617>>1205620Круто, молодец, но ты все равно использовал стек, потому что считаешь рекурсивно.
>>1205623Алло, это шаблоны. После конпеляции никакого стека не будет, оно всё заинлайнится.
>>1205627Я думал он создает определения функций по одной на каждую специализацию, а потом вызывает как обычно.
Как же нахуй все запутано в этой мув-семантикеВот положим есть класс A и B (B без copy-конструктора)A { B field_b; }A(B &&b) : field_b(move(b)) {}1) Это правильная практика?2) Что происходит? Я так понял просто копируется весь объект.3) Теперь с функцией:f(B &&b) { f(move(b)); }Я не могу переварить asm-код от gcc, но в этом случае сохраняется ли b на стек при рекурсивном вызове, т.е. плодятся ли копии?
>>1205629Ну так шаблоны обычно все встраиваются. В итоге весь этот код превратится в xor'ы нужного количества байтов без каких либо циклов и вызовов функций.
>>1205634Немного не до конца сформулировал 3Что передается в данном случае? Указатель или весь объект?Если он передается через регистры, сохраняет ли callee его на стек?
>>1205638Опять проебалсяcaller конечно же
>>1205634move это каст из обычной ссылки в rvalue-reference. Если ты уже принимаешь объект как rvalue, то move делать не нужно.
>>1205645Но ведь внутри A() он уже становится lvalue, и чтобы передать его в B() надо сделать move?
>>1205635Как я и говорил. Впрочем конпеляторы даже xor'ы не генерируют, а тупо меняют местами элементы запихивая их во временные регистры, лол.
>>1205641Насчет этого не уверен. Могу только заметить, что в твоем примере писать && необязательно. Если переменная представляет собой rvalue, то при вызове функции ее содержимое автоматически будет перемещено внутрь b. Тогда ты сможешь сделать field_b(move(b)), вновь протолкнув содержимое изначального объекта из b в field_b, то есть копирования снова не будет.
это >>1205652сюда >>1205647
>>1205652Так, уже немного яснееЯ могу принимать B&&, B и const B& и везде поведение будет разное.Вопрос только какое. Касается рекурсивной передачи через регистры.
>>1205652По той же причине, я думаю, не нужно писать field_b(move(b)) в случае, когда аргумент является B&&. Достаточно написать field_b(b), значение все равно будет перенесено внутрь (хотя реализация мув-конструктора от тебя зависит)
>>1205657Вон книга выше: >>1204176Там вся эта хуйня в пятой главе разжёвывается.
>>1205659Спасибо, пойду читать>>1205658Хуй знает, у меня просит copy-конструктор если писать field_b(b)
>>1205665> Хуй знает, у меня просит copy-конструктор если писать field_b(b)Если у тебя B - шаблонный тип, то B&& - это универсальная ссылка. Чтобы сделать её rvalue-ссылкой надо написать const B&&.
Кто-нибудь работает с Unreal или Cryengine на про уровне?
>>1205668Нет, B просто объект без copy-конструктораС const B&& опять же просит copy-конструктор (не важно стоит move или нет)А теперь такой вопрос к вамСколько вам платят за подобную хуйню? Я блядь дерево решил запилить и уже ебусь с этим move. Просто интересно, стоит ли игра свеч? Просто в других языках, даже в C, нету move, ну кроме раста мб. Это просто синтаксический сахар чтобы сложнее было в ногу выстрелить агаканеш или оно реально нормально перемещается?
>>1205702фикс, B - это класс
В продолжение беседы про rvalue-reference. Что должно быть выведено на экран? Я думал будет создан дефолтный объект a, потом в ретурне он станет xvalue, поэтому будет перемещен в новый временный объект как A&&, а затем остатки a будут уничтожены в результате выхода, после чего будет конструктор перемещения для b (снова A&&) с последующим уничтожением остатков временного объекта, и наконец уничтожение b. На практике не происходит и половины из этого. Я найду ответы на эти вопросы в книге с птичкой?https://ideone.com/XD5q9O
>>1205702Тебе move в дереве нужен зачем? Ты динамически выделяешь память, и хочешь оптимизировать копирование?
>>1205659Кстати проблевался с переводаЗачем писать "псевдоним", "перечисление"?
>>1205731Ну например у меня мудреное ленивое дерево и нужно при вставке/поиске рекурсивно я передаю всякие аргументы которые нужны в единичном экземпляре. Вот для этого я и спрашивал про оптимизацию.Либо если дерево строится на unique_ptr-ах и нужно двигать узлы, опять же рекурсивно, то move будет красиво смотреться.
>>1205729> Что должно быть выведено на экран?Зависит от стандарта. В C++17 перемещение в данном случае не выполняется вообще. Во всех остальных зависит от конпелятора.
>>1205741Это все меня раст испортил, кстатиТам нормально move разжеванНо как-то неохота писать что-то на расте
>>1205613Я вообще нихуя не понял, но выглядит круто.объясните кому не лень, пожалуйста
Эх, видимо придется сейчас окунаться в говно, чтобы в будущем писать на божественном C++17-20
>>120576811 от 17 ничем не отличается, читай тред.
>>1205756Просто различные спецификации функции в зависимости от размера переменной в битах. Любой объект интерпретируется как череда байт (reintepret_cast из указателя на void в указатель на int). Пока можно, разбиваем на 8-байтные инты, то есть на группы по 64 бита. Остаток делим на меньшие куски и работаем соответственно с интами меньшего размера.
>>1205834Хм, так понятно, спасибо, пойду ещё подумаю немного.
>>1205789Странное утверждение. Идиомы меняются. То же компайл-тайм дрочево с 11 на 17 очень сильно изменилось
>>1205083А вообще - годная штука? Работаю программистом на машиностроительном заводе. Решили написать собственный CAD под станки. Под это дело нашел библиотеку (OpenCASCADE), но она имеет поддерживаемые биндинги только под Qt у начальника не хватит терпения докрутить Qt под тулчейн Visual Studio и MFC. Я так понимаю, MFC приложения нативно собирается под Windows? Посоветуйте книг/статей по MFC.
>>1205896Пизда, собирать CAD. Поставь себе Fusion 360 его даже посетитель /b освоит. ЗАчем велосипед?
>>1205936Такая идея руководства. CAD/CAM специально сделанный под линейку оборудования предприятия. Я могу выбирать только средства. И мне хочется программировать на С++ больше, чем на C# (это любимый язык руководителя).Так это, под MFC есть тюториалы какие-то?
>>1205952Кореша научрук заставил писать на MFC, он дико плювался хоть сам виндузятник. Туторов и гайдов нормальных нет даже на msdn, нашёл только на корейском.
>>1205896>Решили написать собственный CAD под станки. не надо этого делать, так как годная cad - это десятилетие труда нескольких программистовдостаточно написать плагины под самую распространенную cad в вашем сегменте производимого оборудования
> MFCНЕ ЛЕЗЬ ОНА ТЕБЯ СОЖРЁТ
>>1205514А не Вандевоорд главный автор?
>>1205896MFC это классовая обертка вокгруг WinAPI. Но она в свое время особо не взлетела, лучше сразу пиши на WinAPI, инфы в инете много.
std::async() – эта штука создает асинхронный тред. Использует ли она при возможности дополнительные ядра/потоки процессора? Или оно работает как в Javascript, где асинхронные функции работают параллельно, но в одном треде не блокируя друг друга, ну как молния на штанах.
>>1206104Зависит от переданных флагов первым аргументом. Если передать std::launch::async первым аргументом, то запустится в новом потоке, если std::launch::deferred, то просто будет ленивое синхронное выполнение .По умолчанию может запуститься как угодно. И это, что в JS принципиально другая система асинхронщины, там промисы никогда не выполняются синхронно, и как минимум пропускают один цикл в цикле событий. В C++ встроенного цикла событий нет. Так что это принципиально разные штуковины.
>>1205963>научрук>туториалов и гайдовУ твоего друга лишняя хромосома? Он знает что такое документация? Он реально вместо того чтобы разобраться в MSDN и написать свою хуйню, добрался до корейских видосиков с пошаговым обучением, чтобы осилить MFC? Ну это пиздец несмотря даже на то что это MFC.
>>1205638Кароче ебал я ваш конпелятор и лучше не париться по таким мелочамcaller расширяет стек, просто оставляя там пустое место, и callee его не использует. Кстати это правда не только в случае move, но и в случае когда аргумент не используется после рекурсивного вызова.
>>1206179И тогда получается что:void f(int* a) > void f(std::unique_ptr<int>&& a) > void f(std::unique_ptr<int> a)По производительности. C опять победил.
>>1206184Поэтому нужен новый тип - rvalue, вместо universal reference. Предлагаю назвать его && const или &&&.
>>1206179>ароче ебал я ваш конпелятор и лучше не париться по таким мелочам>caller расширяет стек, просто оставляя там пустое место, и callee его не использует.Это RVO называется, иксперт>void f(int* a) > void f(std::unique_ptr<int>&& a) > void f(std::unique_ptr<int> a)Открыл америку. Ты в первом случае хоть память-то выделяешь или со стека указатель передаешь, лол.>std::unique_ptr<int>А ты неплох.
>>1206189> rvalue> Предлагаю назвать его && const или &&&.Уже есть. Называется const T&&.
>>1206196Нет, это все равно reference. Я скорее имел в виду move-семантику без move-конструкторов.>>1206192RVO это вообще не про то, у меня функция возвращает void> Открыл америку. Ты в первом случае хоть память-то выделяешь или со стека указатель передаешь, лол.Я нихуя не делаю, я просто функцию скомпилировал. И мне вот не очевидно зачем int* и unique_ptr<int> генерируют разный код, хотя по сути это одно и то же (понятно что втрое это класс с конструктором, но это же минус)
>>1206206> Я скорее имел в виду move-семантику без move-конструкторов.Тогда вам дорога в раст. Там везде по-умолчанию move-семантика.
>>1206206Ни хуя себе одно и то же. Объект, автоматически управляющий указателем со счетчиком, и голый указатель.
>>1206228У unique_ptr нет счётчикаМаксимум что может быть это указатель на deleter, если он в виде простой функции, а так это ровно один указатель
Бля, как же заебали заголовочные Circular dependency, уже 3 года программирую на этом языке, всё окей кроме этой проблемы, каждый раз ебёшь мозг где там делать forward declaration, а где включать заголовочный файл. Я в этом нихуя не понимаю, но там какие-то модули планируют вводить, это поможет избавиться от проблем с этими ёбаными заголовками?
>>1206376Избавит, но ещё очень не скоро. Стандарт только выйдет к 20 году (возможно ещё позже), пару лет придётся подождать пока конпеляторы его начнут нормально поддерживать (хотя модули многие уже ввели как экспериментальную фичу, м.б. ждать и не придётся) ну и надо будет переделывать кучу кода (объединять .cpp- и .h(pp)-файлы и дописывать что должно быть видимо за их пределами).
В 2018-м году с++ актуален только , я подчеркиваю, только в геймдеве. Не учите его, если не планируете вкатываться в геймдев, алсо платят очень хорошо (в РФ/СНГ работы нет вообще), есть лифты.
>>1206675Не только в геймдеве, в любом мультимедиа реального времени сишка с плюсами или без НЕ имеет каких-то кандидатов на замену, по крайней мере в ближайшие дцать лет. Аргументируй, плиз.
>>1206376>Бля, как же заебали заголовочные Circular dependency,Не пихай все в хидер. В хидере должен быть самый минимум, в идеале только сигнатуры. Реализации - в отдельных файлах (в том числе для темплейтов), тогда и проблем с циклическими зависимостями не будет, и конпеляция будет быстрая.
https://old.reddit.com/r/cpp/comments/8prqzm/2018_rapperswil_iso_c_committee_trip_report/
>>1206724>реализация в отдельных файлах>для темплейтов
Я правильно понимаю, что std::shared_ptr работает примерно как GC?
>>1206680>мультимедиа реального времениЯва и прочая.
>>1206675 Мимо: - трейдинг (да, это там, где за свитч у биржи платят миллионы) - куча систем с требованием малого времени отклика (ближе к С обычно) - внутренности тонн библиотек, которые зовут из питонов, джав и прочих нод - куча всякого легаси говна, которое ещё лопатить-не перелопатить (за деньги) Но посыл правильный: учите другие языки и технологии, чтобы не быть слишком нишевым спецом и иметь опыт разного, а не задрачивайте инструкции асма 99% это никому не понадобится
Кто сколько получает? Чем занимаетесь?
>>1206848Нет, он работает приблизительно как счётчик ссылок.
>>1206850Ты ебанутый?
>>1206850>Ява>сборщик мусора>мультимедия реального времени>реального времени
>>1206836>what is extern template?
>>1206724Ну так я всегда так и делаю, только если 2 класса требуют друг-друга, то 2 заголовка и будут включать друг-друга, получается циклическая зависимость.
>>1206836Вот, например:https://github.com/g-truc/glm/blob/master/glm/gtx/common.hpphttps://github.com/g-truc/glm/blob/master/glm/gtx/common.inl
>>1207073> если 2 класса требуют друг-другаВ заголовках только forward declaration и указатели на другой класс. Все использование класса - в cpp/inl. Тогда никакие циклические ссылки не страшны.>и будут включать друг-другаВ смысле поле одного класса - еще не объявленный класс? Это невозможно - компилятору надо знать layout всех полей класса, чтобы с ним работать (если это указатель).
>>1207091Мимоанон - >указатели на другой классТогда все преимущества ссылок летят в пизду, потому что использовать их нельзя, поскольку у препроцессора, компилятора и линкера едет крыша.
>>1207091>если это указательесли это НЕ указательfix
>>1207099>поскольку у препроцессора, компилятора и линкера едет крышаСкорее всего проблема у тебя, а не у компилятора. Если все грамотно объявить, никаких проблем со ссылками не должно быть.
>>1207087https://github.com/g-truc/glm/blob/master/glm/gtx/common.hpp#L76Это не в отдельных файлах, просто один инклудится в другой.>>1207099> Тогда все преимущества ссылок летят в пиздуУмные указатели (как и простые) не требую полного определения класса. Используй их.
>>1207107>>1207105Никакие указатели не требуют полного определения класса. Но ссылки требуют. И чем больше классов, взаимно друг на друга ссылающихся (по ссылкам собственно), тем тяжелее препроцессору с линкером сохранить рассудок, хоть ты грамотно обобъявляйся.
>>1207107>Это не в отдельных файлах, просто один инклудится в другой.Да, я просто принцип хотел показать. Это первое, что на глаза попалось. Никто не мешает два отдельных файла сделать, и реализации темплейтов в объектном файле задавать.
>>1207113>Но ссылки требуют.Не требуют по стандарту. У тебя, видимо, объявлений конструкторов/деструкторов или каких-то функций не видно, вот компилятор и шумит.
>>1206961Ну это шутка такая, почему ты такая бака =3
>>1207116Это значит что мне надо делать forward declaration класса и declaration его конструктора/деструктора там же, лол? Можно пример кода где есть десяток классов (в разных .h и .cpp), которые друг друга агрегируют по ссылке (именно С++ -ссылке) и ничего не ломается, и код собирается норм?
Ребят, извините за глупый вопрос, я тут первый раз, да и вообще недавно начал заниматься, прочел только 200 страниц у Страусотрупа. Я не понимаю, как работает эта штука по выявлению простых чисел.Почему is_prime не возвращает, например, 4? Ведь в первом лупе 4 делится на 2, ок, остатка нет, но во втором 4 делится на 3 и есть остаток и поэтому должно быть return true. Но 4 в вектор не попадает...vector<int> prime;bool is_prime(int n){ for (int p = 0; p<prime.size(); ++p) if (n%prime[p] == 0) return false; return true; }int main(){ prime.push_back(2); for (int i = 3; i <= 100; ++i) if (is_prime(i)) prime.push_back(i); cout << "Primes: "; for (int p = 0; p<prime.size(); ++p) cout << prime[p] << '\n';}
>>1207173> Ведь в первом лупе 4 делится на 2, ок, остатка нетНу так цикл сразу на этом месте заканчивается и возвращается false. Дальше перебор просто не происходит.
>>1207206А что с числом 9?9/2=есть остаток, но оно все равно false.
>>1207215Цикл продолжается, дальше 9 делится на следующее простое число - 3. Тут уже остатка нет и цикл завершается.
>>1207224Я думал, в случае 9 цикл сразу же после деления на 2 остановится, всю голову себе сломал над этой херней.Спасибо!
Какой язык программирования сейчас считается "убийцей с++"?
>>1207623Rust.
>>1207623Nim
>>1207623c++
>>1207623D
>>1206675Пишу кернел драйвер в России за 270к рублей в месяц. Так что не, ты не прав. Да и геймдева в России полноценного-плюсового раз два и обчелся. В основном говно на юнити же
В цикле передаю в асинки лямбды с захватом this. Как мне лучше проследить что потоки завершились, если класс решил уничтожится? Пока придумал сохранять фьючеры куда нибудь в лист. На следующих итерациях цикла удалять те, что готовы не ожидая через wait_for(0). А в деструкторе уже ждать пока не завершатся все. Может есть способ получше?
>>1207787> Как мне лучше проследить что потоки завершились, если класс решил уничтожится?Запихнуть принудительное уничтожение в деструктор не вариант?
>>1207787Да у меня не совсем асинки а тредпул. С методами вроде AddTask (закинул и забыл). AddTrackedTask (возвращает future).
>>1206386> Стандарт только выйдет к 20 году (возможно ещё позже)Тут посоны из iso c++ порешали:https://www.reddit.com/r/cpp/comments/8prqzm/2018_rapperswil_iso_c_committee_trip_report/> It became clear the Modules TS will probably not be adopted as-is and may miss C++20.Так что модули скорее всего будут только в C++23. Так что ждать придётся ещё минимум пять лет. А-ха-ха!
Как помягче перекатится с шарпов в плюсы?
>>1208165>trip_report/
>>1208495лолЗачем? Сколько C#-кодеров видел все поливали грязью С++
>>1208495Закупи побольше вазелина. Будет больно.
>>1208503Дебы потому что.
>>1208495Берешь и вкатываешься, языки во многом похожи. Не так как джава с сисярпом, но всё же. Очень тщательно изучай поведение ссылочных типов, в плюсах оно вообще не такое как в решетках. Заглядывай почаще на cppreference и вообще на сайты с матчастью. Ну и не унывай.
>>1201563Аналогично. Я тут работу меняю, повесил в профиле, что свободен, и неожиданно оказалось, что плюсы нужны, причем до 120000 евро годовых.
>>1201067https://www.boost.org/doc/libs/1_66_0/libs/pool/doc/html/index.htmlизучал?
>>1205702move семантика позволила использовать класс оптимизаций, связанный с созданием временных объектов в выражениях.
>>1208746Это разве не к perfect forwarding относится?
Суп, двач. Недавно попробовал написать что-то в emacs - это полный пиздец. Я привык к visual studio и Qt Creator.Как научиться пользоваться emacs? У кого-то была learning curve? Пока что только заставляю себя каждый день сидеть в emacs туториале и практиковать хоткеи
>>1208792Правильно. Emacs появился в древние времена и по тем временам он был современным и удобным редактором. Сейчас в нем смысла нет никакого вообще.Я слегка знаю emacs и юзаю его когда надо что-то поправить в коде на удаленной машине через SSH. Использовать его как основной редактор - да ну нафиг. Простейшие операции вроде навигации по дереву файлов уже магия.
В своем домашнем проектике я решил для пробы отключить исключения.И знаете что? Это просто охуенно! С++ внезапно стал куда более приятным языком. Больше ненужно бояться, что поток выполнения внезапно прервется. Больше не нужно заворачивать все в RAII. Можно просто писать код, который будет выполняться как написан.С обработкой ошибок проблем нет - в большинстве случаев я просто пишу ошибку в лог и выхожу. В редких случаях пишу в лог и возвращаю nullptr.
>>1208794Я когда только на убунту сел думал что из менеджера пакетов не вылезу. В apt-get'е не было поиска, категорий и звёздочек, а там были. Да и быстрее мне это казалось, чем гуглить сначала how to install что-то, ибо не всегда угадаешь как называется пакет нужного приложения. Но сейчас привык через терминал обновлять. Может здесь так же всё?
>>1208795Тоже мне удивил. Это обезьянья практика. Ещё после выхода Go народ понял что зря оно надо. Прикинь если бы ASIO вместо ec использовал эксэпшоны?
>>1208796Какие-то вещи через консоль действительно делать удобнее, какие-то нет (gdb, например). Что ты ожидаешь от emacs чего тебе не хватает в современных редакторах? Дух опенсорса ступней Столмена?
>>1208798На первой работе 2 с лишним года использовал windows, так как мы писали клиент-сервер, и клиент был только виндовский. Плюс работа была с железяками, а к ним утилиты все были ТОЛЬКО ПОД ВИНДУ.В итоге привык к Visual Studio, гуишным службам контроля версий и всему другому на Windows. На собесах смотрят как на говно, хочу хотя бы немного поучить ЭЛИТАРНЫЙ СТЭК.На самом деле меня не переубедишь что Visual Studio - это самое удобное что есть на земле.
>>1208792Рекомедую тебе вот такую клавиатуру, чтобы полностью погурзиться в emacs.
>>1208799Мы пишем на работе под Linux. Большинство пользуется QT Creator и VSCode, кто-то Sublime Text. emacs'ом пользуются только несколько человек.Ради элитности подучи cmake лучше, а в чем код редактировать - нет разницы.
>>1208803C++ в VSCode? Оно хоть нормально работает? Там же вроде все в ебучем JSON настраивать надо, проект, дебаггер, компайлер, и тд.
>>1208803Об этом речи не идёт. Всё что кросс-платформенно я более менее-знаю. Вот вручную с makefile буду страдать. Думаешь нормально на собесе сказать "юзаю так ибо мне так нравится, мамку вашу ебал"?
>>1208804Он же написал что на линуксе работает. Что значит "настраивать надо"?А по другому бывает что ли?
>>1208804Да, работает. Ставится плагин и все. Работает подсветка, отладка, автокомплит, clang-format, интеграция со сборкой и переход к ошибкам.Да, настраивается через JSON. Но несложно, все хорошо описывает.
Вопрос по explicit.А что, это вообще правило хорошего тона в пользовательских классах конструктор делать explicit?
>>1208792emacs это что-то типа vim?
>>1208833Конструктор с одним параметром рекомендуется, во избежание сюрпризов
RAII это чисто C++ идиома или актуальна для всего ООП?По статье в википедии непонятно, других языков настолько не знаю, поэтому спрашиваю тут.
>>1208863Явно не для всего. Если в ЯП есть сборщик мусора, то RAII работать не будет.Но, например, в расе есть RAII, хотя там нет полноценного ООП (там нет наследования).
>>1208882> расерастеfix
Могут ли скрытые приведения приводить к Undefined Behaviour и нужно ли их бояться?
https://2ch.hk/pr/res/1208905.htmlhttps://2ch.hk/pr/res/1208905.htmlhttps://2ch.hk/pr/res/1208905.htmlhttps://2ch.hk/pr/res/1208905.html
>>1208794У меня до сих пор vi открывается при использовании гита, а перенастраивать лень. Вот освоить базу вима это мастхев. Представь как тяжело тем, кто вима ни разу в жизни не видел и первый раз делает git commit или того хуже резолвит кофликт лол.
>>1206104С++ использует треды, предоставляемые ОС. ОС предоставляет настоящие железные треды
>>1208908>первый раз делает git commitюзаю tortoise svn, команды гита не помню вобще
>>1206963Сильные дяди пишут на яве мощные, быстрые, масштабируемые во все стороны приложения, при этом сборщик мусора не собирает мусор ВООБЩЕ.
>>1209765>Ява>мощные>быстрые
>>1208908Есть nano, зачем vi и прочее?
>>1210063Есть VS Code
>>1201752нахуя ты это говно в c++ тред принёс? уноси
Есть класс, который есть абстракция приложения. У приложения есть графические пассивные элементы (надписи и иконки). Их всего в районе 5-7 и возник вопрос как лучше внедрить поддержку хранения этих элементов в класс. Создать отдельный метод для каждого графического элемента?Или создать список, на подобии Map и вызывать их по ключу?Или создать вообще отдельный класс для их хранения?Предположим, чтобы поменьше париться для текущих 7 элементов проще и правда создать отдельные элементы.Предположим, что их больше, в районе 70. Как в таком случае реализовать их хранение в классе? Интересует именно как правильно это сделать, а не "ну, работает жи".