Это копия, сохраненная 31 марта 2018 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Ответы на все вопросы:
- http://en.cppreference.com/w/
- http://www.cplusplus.com/reference/
Прошлый: >>1119750 (OP)
Под Windows нет IDE, кроме MSVC.
Между RUN и запуском руками разница в working directory, в которых ищется дллка. а ошибка - хуй знает вообще почему, может АБИ не то, может либа не той версии.
> c++
> windows
> codelite
> mingw
Раз уж решился писать на крестах под виндой, так скачивай visual studio, для винды лучше нее пока что ничего не придумали
Гугли отличия между статической и динамической линковкой. А чтобы все работало, то просто скопируй дллки, которые просит программа, из /MinGW/bin/.
Да вроде бы они в одном месте ищутся. Я еще использую sfml-system-2.dll (вроде так), и когда ее нет, он ругается при RUN и при запуске руками.
>>29299
Первое, что я попробовал. Только там нету libgcc_s_seh-1.dll , зато есть libgcc_s_seh_64-1.dll. Я пробовал его переименовывать и засовывать в директорию с exe файлом, и как итог - та же самая ошибка.
>>29294
А могу ли я не используя их среду использовать их компилятор? Она у меня медленно работает.
>Первое, что я попробовал. Только там нету libgcc_s_seh-1.dll , зато есть libgcc_s_seh_64-1.dll. Я пробовал его переименовывать и засовывать в директорию с exe файлом, и как итог - та же самая ошибка.
Непереименнованный файл тоже пробовал? Хз в чем проблема, но тогда компилируй с параметром "-static", может поможет.
>А могу ли я не используя их среду использовать их компилятор? Она у меня медленно работает.
Да, из командной строки. Правда студия все равно должна быть установлена.
>Правда студия все равно должна быть установлена.
Не, там компилятор можно отдельно установить, точно помню.
Дебил, нумерацию проебал
В который раз
Хотите - можете почитать МСДН, но разница в том, где ищутся дллки для процесса, запущенного из под другого процесса.
>>29289
В папке компилятора есть папка bin, добавь её в PATH (фгугл).
>>29315
Если программа просит какую-то либу, то она, блядь, где-то таки есть. Найди её поиском по ЖД.
>>29330
Из последних SDK его исключили, компилятор из WDK убрали. Качаёшь инсталятор коммьюнити-студии - выбираешь декстоп ц++ - получаешь визуал студио коре едитор с неотключаемой галочкой.
>>29331
Чиркнул моду.
>В папке компилятора есть папка bin, добавь её в PATH (фгугл).
Уже добавлена
>Если программа просит какую-то либу, то она, блядь, где-то таки есть. Найди её поиском по ЖД.
Искал, нашел только libgcc_s_seh_64-1.dll
Такой пиздец
Проверь еще нет ли разделения на дебаг и релиз версии. Откомпилируй и запускай именно релиз версию. Дебаг может быть расчитана на запуск с помощью иде через какие-то местные мокрописьки, а не обычное исполнение. Посмотри еще в консоли иде какой командой запускается файл на исполнение - там обычно(часто) пишутся команды запуска. Есть ли такое в CodeLite не знаю.
Есть такая хуйня:
C:/TDM-GCC-64/bin/g++.exe -o ./Release/sockets @"sockets.txt" -L. -LC:\SFML-2.4.2\lib -lsfml-system -lws2_32
в sockets.txt object файлы прост прописаны. Тут просто линковка вродь, хотя я хз. У меня даже надежда появилась когда ты про Release сказал (есть такое разделение да), но в итоге все та же хуйня происходит.
Блять, может все таки сесть на стул с майкрософтом и не ебаться, но мне уже тупо интересно что за хуйня.
Не баг, а фича.
Ну да это компиляция. Посмотри может в консоли когда программа запускается - может там команда запуска есть. Поищи в настройках где флаги компиляции можно добавлять и попробуй добавить -static-libgcc -static-libstdc++ это статическая линковка рантайм библиотеки. Еще может почитай про динамическую линковку в операционной системе виндоуз. Потому что в линуксе для динамической линковки не достаточно просто закинуть библиотеку в нужные папки. Еще должен обновиться кеш динамического линкера (ldconfig) - может в виндовс тоже что-то подобное есть.
>Из последних SDK его исключили, компилятор из WDK убрали. Качаёшь инсталятор коммьюнити-студии - выбираешь декстоп ц++ - получаешь визуал студио коре едитор с неотключаемой галочкой.
Три наносекунды в гугле: https://blogs.msdn.microsoft.com/vcblog/2016/11/16/introducing-the-visual-studio-build-tools/
В чем проблема может быть? Я наверное должен был понять, но я пока еще не совсем шарящий.
Тогда лобовое решение: качаешь process explorer и смотришь список путей к DLL-кам у своей программы, запущенной из коделите, раз ты такой пиздоглазый.
>>29411
Я про это не знал, но там линк мёртвый, и в каталогах этих билд тулз нет.
https://www.visualstudio.com/downloads/?q=build+tools#build-tools-for-visual-studio-2017-rc
>>29454
Тебе нужно либы подключить (наследие 80х годов).
Берёшь одну функцию, ищешь ей так:
https://www.google.ru/search?q=WideCharToMultiByte+winapi+msdn
На MSDN есть название либы:
https://msdn.microsoft.com/en-us/library/windows/desktop/dd374130(v=vs.85).aspx (в самом низу описания каждой функции)
А дальше пихаешь эту либу куда-то в аргументы линкера (без расширения .lib ).
http://codelite.org/LiteEditor/BuildSystem#toc5
Потом собираешь снова и ещёшь ошибки снова. Каким образом это упрощается в обычной студии - хуй знает, она, скорее всего, генерит список зависимостей из заголовочных файлов.
Есть строка, выполняется проверка: присваевается ли её содержимое через StrToFloat переменной типа float. Является ли это действие проверкой на то, что содержимое строки - вещественное число?
Смотря что этот StrToFloat делает. Он может, к примеру, зажрать первые символы, которые могут составлять float и на этом закончить
>>29550
Спасибо за ответ.
Тогда я правильно понял, что наиболее верной будет сперва проверка строки на содержание только цифр + не более одной точки (при этом не первым/последним символом) + возможным минусом первым символом?
Краем уха слышал про регулярные выражения, но вот беда, поскольку я совсем-совсем начинающий и в синтаксисе языка ещё не разбираюсь, а в интернетах примеры в основном для всякой джавы и пхп, то не мог бы кто подсказать учебник или статью, где пишут про регулярные выражения для с++ (операторы, их атрибуты, какие нужны библиотеки)? Ну или тут рассказать. Думал с помощью них попробовать вытаскивать из строки заданные выше символы и сравнивать потом с оригинальной строкой.
> Тогда я правильно понял, что наиболее верной будет сперва проверка строки на содержание только цифр + не более одной точки (при этом не первым/последним символом) + возможным минусом первым символом?
Возможно, он пропускает начальные пробельные символы (табы, перенос строки и прочее), и затем считывает float в одном или нескольких форматах (научный, который представляет собой запись с показателем десятичной степени, например 10e5, или какой-нибудь еще). А вот когда он натыкается на неожиданный символ - тут уже без знания доков или механизмов по одному названию ничего не скажешь. Ну разве что может быть семантика у метода с указанием флага успешного выполнения, к примеру.
> Краем уха слышал про регулярные выражения, но вот беда, поскольку я совсем-совсем начинающий и в синтаксисе языка ещё не разбираюсь, а в интернетах примеры в основном для всякой джавы и пхп, то не мог бы кто подсказать учебник или статью, где пишут про регулярные выражения для с++ (операторы, их атрибуты, какие нужны библиотеки)? Ну или тут рассказать. Думал с помощью них попробовать вытаскивать из строки заданные выше символы и сравнивать потом с оригинальной строкой.
Регулярные выражения слишком жирные, чтобы заниматься парсингом чисел. Думаю, что методов, которые представляет те же стандартные потоки, тебе будет вполне достаточно.
А если ради интереса, то синтаксис там вполне простой, для этого книг читать не надо, достаточно мануалов.
>семантика у метода с указанием флага
>заниматься парсингом
>стандартные потоки
Для меня это пока нецензурные выражения, но всё равно спасибо. Буду смотреть что это.
Чего такой агрессивный? Читаю, но медленнее чем хотелось, особенно учитывая, что задачки нужно сдать гораздо раньше, чем успею это все нормально почитать.
Падажжи, когда отменили золотое правило С++ треда?
ЛАБЫ ИДУТ НА ХУЙ
Я бы тебе все подробно объяснил, но это бессмысленно.
А я и не просил мне ничего решить. Не хочешь - не объясняй, твоё дело.
> парсинг
В твоем случае парсинг - выделение чисел из строки
> стандартные потоки
Имеется в виду cin/cout/fstream
The trick is to keep the size of all public classes of a library constant by only storing a single pointer. This pointer points to a private/internal data structure that contains all the data.
http://wiki.qt.io/D-Pointer
Для того, чтобы это проверить, тебе нужно использовать потоки - создаёшь stringstream из строки, считываешь оттуда число, узнаешь число сожранных символов. Если число сожранных символов не равно длине строки, то в строке не только число.
Пока понял что мне нужен QAuthenticator в который я кладу логин и пароль
Затем мне нужен QNetworkAccessManager, а так же слот, который бы обрабатывал запрос ресурса.
Со слотом всё в целом понятно
void onAuthenticationRequestSlot(QNetworkReply aReply, QAuthenticator aAuthenticator) {
aAuthenticator = &myLoginPass;
}
Но непонятно как при помощи QNetworkAccessManager сделать запрос на аутентификацию.
Пытался
myNM->get(QNetworkRequest(QUrl("\\\\Test\\")));
Никакой реакции.
Как это правильно сделать?
Есть ли подобный гайд, но по плюсам?
И где я их возьму, если даже на офф сайте 2 с половиной команды и те на собачьем?
Пробую использовать cURL для smb-целей. Норм?
Может ты слишком глубоко во вложенность функций лезешь? Например внутрь библиотек кути, которые распространяются как бинарники.
Там листинг даже для простой программы без модулей в виде дизассемблерного листинга показывается.
>А это дебуг билд хоть?
Спасибо, переключение в дебуг билд помогло. Привык, что на линупсе сразу в таком режиме шло.
и я создаю
А<int> a(1,2);
что это вообще за контейнер или объект??
встретил в коде и не могу понять
Что за хуйню я только что прочитал. Не мешай STL с шаблонами как частью языка.
(1,2) - это параметры конструктора (и если их много, выбирается подходящий). Что там у тебя конструируется - контейнер, мутекс, или ещё какая залупа - никому, кроме тебя, неизвестно.
Олсо, если ты не в курсе, A - это шаблон класса.
Отвечаю на свой тупой вопрос:
Достаточно просто сложить все bool переменные и получится число сколько bool переменных стоят в true.
дерьмо, там где я неправ. (Про то что синглтоны вообще считаются злом я знаю).
Ещё хотелось бы задать вот какие вопросы:
1) Правильно я понимаю, что правильнее будет заменить (const std::string& message) -> (std::string_view message)?
2) Почему, когда я закомментировал в статическом методе Get() последнюю строку(т.е. return *pThis) у меня всё нормально
скомпилировалось и работало. У меня было два указателя, которые указывали на разные адреса, но откуда они это взяли, если
функция ничего не возвращала?
3) Правильно ли я понимаю, что здесь избыточно явное запрещение функций с мув-семантикой?
4) Насколько вообще рационально создать обертку для более удобной работы с файлами из функций filesystem(ака QFile)?
5) Что делать с деструктором? Ну, то есть, код деструктура вообще же не будет вызваться, а по-хорошему ведь нужно же
файл закрывать. А что делать, если в деструктуре надо удалять динамическую память, это же утечки, как решают тогда
такую проблему?
https://pastebin.com/yUTL2hrW
Код - кошмар. Перенеси все внутрь класса и используй синглтон Маерса
Logger& getLogger()
{
static Logger logger;
return logger;
}
Сырые пойнтеры тоже не используй. Тогда будет все разрушаться как надо. Но не здесь, здесь пойнтеры вообще не нужны.
Что значит не вытащили?
>The filesystem library was originally developed as boost.filesystem, was published as the technical specification ISO/IEC TS 18822:2015, and finally merged to ISO C++ as of C++17.
"Вытащили из experimental" != "сразу стало поддерживаться всеми компиляторами"
Ну и вот: https://www.reddit.com/r/cpp/comments/7o9kg6/gcc_80_support_stdfilesystem_include_filesystem/
>GCC 8.0 support std::filesystem (#include <filesystem>) now
Обновляйся
В каком плане производительности? То, как быстро они собирают твой код, или производительность генерируемого кода? Если второе, то гцц пока лучшее, что придумал мир в общем случае. Интел в конкретных ситуациях может использовать оптимизации, т.к. знает устройство своих процов лучше других. vc - говно.
>то гцц пока лучшее, что придумал мир в общем случае.
>vc - говно.
Можешь объяснить почему? Работаю в VS2017, на другие IDE кроме вижака без злости вообще смотреть не могу, но если разница между компиляторами значительная, то пересилю себя.
Господа, есть пара вопросов.
Как можно в 2к18 получить адекватные графы всех сортов из исходников?
И ещё один.
Давно юзаю cmake для сборки, но это же полный аутизм. Есть сейчас смысл укатываться на всякие там мезоны и ниндзи?
IDE - это не компилятор. К студии уже можно подключть и кланг и ICC (сто лет как).
Да, только для этого всё равно нужно заморачиваться как это сделать, настроить, что делать если какая то хуйня в тексте ошибок компиляции и т.д. И я вот спрашиваю, стоит ли оно того. В чем охуенное преимущество g++ над vc++? Можно со всякими низкоуровневыми подробностями
Просто насколько я помню, динамические массивы объявляются через new, а тут у меня байт body_length вообще из recv приходит.
Принял
>Он каждый раз выдает одни и те же последовательности?
Его в таком виде используют в алгоритмах шифрования.
Пояснение для дебилов: Очевидно что он собирает программы для никому не нужной windows параши.
Почему линуксодрочеры такие тупые?
> никому не нужной windows параши
> виндой пользуются 82.68%
> никому не нужной
Проиграл с 1.43% дебила
Дурачок-максималист не зарабатывает деньги программированием.
поясните, почему binary_search возвращает bool, а не итератор на нужный ( или end() ) элемент
какая-то неявная (как по мне) хуйня
Есть lower_bound
Пояснение для совсем умственно отсталых: Очевидно же никому не нужная windows параша никому не нужна среди нормальных людей и уж тем-более для программистов, школьники гоняющие крузис в перерывах написания хелло ворлдов не в счёт.
Помимо удобства, в С++ что угодно может выбросить исключение, и до delete дела не дойдет.
Ну это всё понятно, арряя, кроссплатформенность, лепукс рулез венда маздай)0.
А вот так чисто в сухом остатке на уровне сырых байтов в чем преимущества gcc++ над vc++?
RAII базовое понятие C++, почитай. В принципе shared ptr в большинстве случаев нахуй не нужон, а юник это лучше нововведение эвер, 20 лет ждал.
Конечно, дурачок. Ты же один в мире, и твое мнение единственно верное. Но ты не переживай - через некоторое время пройдет
У гцц стандарты лучше и быстрее поддерживаются. Другое дело что мсвс сильно удобнее. Под никсы нормальной иде нет просто
На работе пишу под линукс и использую VSCode. Оказалось лучше, чем я думаю - легко настраивается сборка и отладка, более-менее сносно работает навигация по коду и автокомплит. Сам редактор как в студии практически.
Между более менее сносно и идеально + статический анализ + авторефакторинг все таки большая разница
>У гцц стандарты
в каком плане? понимаю, никому не захочется по пунктам расписывать, в чем vc++ с заглотом всасывает у гцц, но хотя бы один убойный пример можно?
Вывод тимплитов в конструкторах. Студия все еще не умеет. Вроде структуред биндингс еще не умеет
Помню, когда в MSVC13 перемещающие операции компилятор не генерировал... во жара была.
Я то думал, хули = default не работает.
Да ладно? Помню в средней школе изучали бейсик, так там вроде был рандом. А бейсик - это самый днищеязык.
Он не был честным. Для честного рандома нужен источник энтропии - или аппаратный, или его имитация на основе нажатых клавиш/трафика/содержимого экрана/звука с микрофона и т.д.
Все это слишком сложно, чтобы запихивать в стандартную библиотеку.
Почестнее чем в С. В бейсике он хотя бы выдавал разные значения при каждом запуске программы.
Ага, если подключить ctime и использовать srand от времени. Но это такие костыли, что пиздец
И как же он работает?
cmake работает, спору нет, но у мезона уже неплохой список проектов появился. Интересны идеи про потенциал, хотелось бы перекатиться чуть раньше чем вся индустрия на что-нибудь более удобное.
Коротко вопрос, такой. Где качать компилятор и нубовской набор библиотек. IDE среды идут без компилятора, насколько я понимаю.
Пока установил голый VS Community 2017 без нихуя.
Студия или кьют. Если совсем начальный уровень можешь попробывать ideone обойтись.
Студии тебе за глаза навсегда - это топ1 профессиональный инструмент разработки под С++.
Нубовской набор библиотек у тебя на первый год есть - собстно, стандартная библиотека С++.
Где взять ссылку на комьюнити версию? На сайте только триал и всякие предложения для студентов и опен-сорса.
Портэбл стэндэрт конформинг коуд? Вотс зэт?
>>31617
Расширение стандарта, нинужно.
>>31921
Вы к нам их РНР-треда причапали?
>>31815
В блогах MSDN сам найди нововведения и их даты.
http://en.cppreference.com/w/cpp/compiler_support
Community версия есть у божественной Вижуал Студии. У Слиона ее никогда не было. Либо плати, либо пирать, либо сиди на EAP'ах
Кстати, в 17 студии завезли какой-никакой рефакторинг, но работает это все, как обычно, хуево.
Resharper C++ ?
Resharper от jetbrains
его ценой
Ты забыл добавить. Решарпер для крестов продается только в Ultimate-версии, которая стоит пиздец как дорого, если уж о ценах речь зашла
Решарпер для крестов продается отдельно, лол. 200 баксов для конторы, 100 для себя.
Ох ты, не знал. Круто, но для дома я предпочту использование пиратского сервера ключей
Только на VS
Подобная реализация возведения в степень - говнокод?
воднустрочкужыыыы
1. Алгоритм быстрого возведения в степень придумали чуркобесы?
2. Нахуй тебе рекурсия глубины power, да ещё и нехвостовая?
3. Не используй тернарный оператор, пока не научишься в форматирование.
>Отрицательные степени?
https://ideone.com/9VwwEe
Но теперь уже тоже говнокод, а вообще >>33983 этот господин все верно написал, нахуй нужна именно рекурсия, хотя если это просто задачка какая, то ладно.
Стек - не твоя баба.
Выходит у тебя баб нет, а только есть указатели на них?
Сильно.
Неплохо.
21 век
>если больше одной переменной стоят в true, то завершать программу
>больше одной
>Использовать ||
Земля тебе пухом.
мимо
У меня работа, что и на плюсах и на питоне кодю.
Поясните насчёт этого файла, как он работает? Можно ли сделать decoder
как будто в стл с тех пор что-то изменилось. Как степанов написал, так и пользуемся до сих пор.
Освой хоть на каком-то уровне, пойми дизайн СТЛ. И потом уже сам по cppreference догонишься
1280x720, 0:01
Я к тому, что эти книги по стл как фундаментальный матан, врядли когда-то устареют. это классика блять
Большая часть кода — это огромный однородный свитч, так что реального чтения там намного меньше.
Писал эту портянку не я, но мне надо внести туда изменения и пересобрать. Проблема в том, что там есть некая UB-дыра, приводящая к segfault под линуксом, но нормально работающая под виндой.
Возможно, чей-то опытный глаз поможет быстрее определить проблему.
> приводящая к segfault под линуксом, но нормально работающая под виндой.
Худшая система снова обоссана
Ну толсто же.
Ctrl-alt-L
Ну так подебажь. А, постой, у вас же консольный кусок залупы вместо дебаггера
Здарова, котаны. Студент-почти-второкурсник итт.
Выбрал своим профилем кресты, посмотрел требования на hh и появился ряд вопросов
1) Под какой осью сидеть/ разрабатывать?
2) Насколько большая разница между кодингом под никсы и форточки?
3) Когда осилю Страутструпа , в какую сторону копать?
4) Классика вопросов для джуна? Два стула, какие библиотеки?
>Выбрал своим профилем кресты
худшее решение в твоей жизни с точки зрения будущего
хуже наверное только начать ставится герычем по вене
1. Винда\Студия.
2. Разница огромная, у красноглазых ублюдков нет нормальных тулзов. Щас бы в 2018 пердолиться в сосноли.
3. В любую другую, чем дальше от С++, тем лучше.
4. Любые, главное, не С++ные
1) Вложеный тернарный оператор говно, особенно в одну строку.
2) У тебя одинаковое условие в подоператорах и одинаковый исход для false.
3) Рекурсия с хуй знает каким числом вложений - это охуеть.
4) сукоблядь, в большинстве процессоров с FPU есть инструкция для этого! В стдлибе есть функция для этого!
>>34620
> Разница огромная, у красноглазых ублюдков нет нормальных тулзов. Щас бы в 2018 пердолиться в сосноли.
Кому пиздишь тут? Есть нормальный qt editor.
Говна кусок твой qtCreator.
3. Дальше от лучшего и безальтернативного языка, а этот школьник в ударе сегодня.
Хуево, когда у тебя все обосраное. Но ты продолжай из сельского толчка вещать, с тобой весело.
Ебаный пиздец.
В шапке все есть
> 1) Под какой осью сидеть/ разрабатывать?
Это требования проекта, а не твой выбор.
> 2) Насколько большая разница между кодингом под никсы и форточки?
Если писать хорошо, то никакой. Иначе будешь чинить под другой осью.
> 3) Когда осилю Страутструпа , в какую сторону копать?
Копай шапку дальше
> 4) Классика вопросов для джуна? Два стула, какие библиотеки?
Копай шапку
Задания обрезать первый символ в строке и засунуть новую строку в переменную a. Сделал через memcpy. Как можно там автоматизировать 3 аргумент с количеством копируемых байт? Шоб через sizeof. Помогите, пожалуйста:3
QtCreator уебищное говно, а все кто в нем пишет - умственные инвалиды. Вообще все qt несвежая подзалупная смазка. Сука вот же ебучий фреймворк, заставили на новой работе на этом говне писать.
Тру крестобляди, вы согласны? Может создадим тред унижения qt-дебилов?
А что насчёт Clion? Или ты за создание только программ под одну платформу? Windows конечно же
Нет я уже давно угорел по кроссплатформе.
Но вот только дестопные приложухи лучше уж на джаве какой нибудь писать.
А как студия разработки кроссплатформенных либ - очевидный Clion, да.
Хотя недавно открыл для себя https://nuclide.io/ и https://buckbuild.com/, просто ульмитативное ультракроммплатформенное решение.
Ну вот пришлось из-за кучи легаси писать либы с использование qt (не ui), это пиздец, ну есть же boost ребята. Для асинхронности - boost::asio, он скоро въедет в стандарт, а qt - тухлое несвежее дерьмищще.
Книги на амазоне, что я видел, это вода о воде. Статьи всякие про декомпозицию читал. Когда читаешь, это кажется так легко. А потом делаешь сам и ловишь рейдж.
Помогите, или я поеду. Может есть какая нормальная книга, чтобы даже такой даун, как я, просветлился.
Refactoring Фаулера почитай. А лучше начинай писать, в процессе хождения по граблям сам до всего дойдешь.
Отталкивайся от глобальных паттернов и потом начинай декомпозицию к более локальным. Для первого случая советую к прочтению Pattern Oriented Software Architecture, да и для остального тоже. Одна из самых годных серий книг по паттернам в архитектуре приложений.
Есть ли смысл использовать в качестве аргумента функции std::shared_ptr<Someclass> someobj, если для Someclass определен move constructor?
Т.е., чтобы в некоторых случаях не писать
somefunc(std::make_shared<Someclass>(args));
, а писать
somefunc(Someclass(args));
когда я хочу сэкономить на памяти и вызовах всяких конструкторов копирования, при передаче объекта через несколько функций подряд.
В чем может быть проблема?
Ага, спасибо, действительно, там есть целая глава про это.
>, а писать
> somefunc(Someclass(args));
В этом случае конструктор тоже будет вызван. Если ты хочешь создать объект из нихуя (только из аргументов) то move constructor никак не поможет.
> при передаче объекта через несколько функций подряд
Создание копий std::shared_ptr будет скорее всего быстрее чем вызовы move constructor (так как std::shared_ptr в большинстве случаев будет меньше чем остальные классы). Как-то ускориться можно только через allocate_shared - чтобы не дергать кучу, зависит от ситуации, может и нихуя не помочь, а то и замедлить.
шаред птр там на каждое копирование каунтеры на атомиках инкрементирует и проверки делает, что конечно легкая операция, но не бесплатная, может и не быстрее move быть
>В этом случае конструктор тоже будет вызван. Если ты хочешь создать объект из нихуя (только из аргументов) то move constructor никак не поможет.
Ну я имею в виду, что в случае вот такого кода и наличия move constructor для Someclass:
// тут вызывается обычный конструктор, потом move constructor при передаче аргумента в функцию do1
do1(Someclass(obj));
void do1(Someclass obj)
{
// move constructor при передаче аргумента в функцию do2
do2(obj);
}
void do2(Someclass obj)
{
// move constructor при передаче аргумента в функцию do3
do3(obj);
}
void do3(Someclass obj)
{
// move constructor при передаче аргумента в функцию do_final
do_final(obj);
}
Таким образом за всю цепочку вызовов функций (do1 -> do2 -> do3 -> do_final), обычный конструктор вызывается 1 раз, а все остальные разы move constructor.
Я прав? Не знаю, понятно ли написал, лул.
Просто я обычно использую в таких случаях std::shared_ptr, но писать std::make_shared<Someclass>() каждый раз довольно длинно, да и читать это не так удобно.
>В этом случае конструктор тоже будет вызван. Если ты хочешь создать объект из нихуя (только из аргументов) то move constructor никак не поможет.
Ну я имею в виду, что в случае вот такого кода и наличия move constructor для Someclass:
// тут вызывается обычный конструктор, потом move constructor при передаче аргумента в функцию do1
do1(Someclass(obj));
void do1(Someclass obj)
{
// move constructor при передаче аргумента в функцию do2
do2(obj);
}
void do2(Someclass obj)
{
// move constructor при передаче аргумента в функцию do3
do3(obj);
}
void do3(Someclass obj)
{
// move constructor при передаче аргумента в функцию do_final
do_final(obj);
}
Таким образом за всю цепочку вызовов функций (do1 -> do2 -> do3 -> do_final), обычный конструктор вызывается 1 раз, а все остальные разы move constructor.
Я прав? Не знаю, понятно ли написал, лул.
Просто я обычно использую в таких случаях std::shared_ptr, но писать std::make_shared<Someclass>() каждый раз довольно длинно, да и читать это не так удобно.
Но нахуя ссылки? Они просто заменяются препроцессором на имя ссылочной переменной или как то по другому? Есть профит от использования ссылок, кроме как создания константного типа ссылки чтобы не покрашить данные случайно?
Про ссылки вот я кстати не помню, были они в С++99 или нет.
ссылка ощутимо "безопаснее" чем указатель, за счет того, что не может быть нулем. А висячую ссылку сделать сильно сложнее, чем кривой указатель.
> вызывается 1 раз, а все остальные разы move constructor
Да
> std::make_shared<Someclass>() каждый раз довольно длинно
Если под "каждый раз" ты подразумеваешь один раз на цепочку вызовов, то да. Если рассматривать именно со стилистической точки зрения то использовать смарт поинтер может быть действительно не совсем правильно. std::shared_ptr нужен для того чтобы гранить указатели на объект в нескольких местах, с автоматическим контролем за использованием. Просто передача объекта по цепочке вызовов не совсем использование по прямому назначению. Лучше передавать просто объект и надеяться на оптимизации. Может в будущем компиляторы смогут вообще оптимизировать эту хуйню, так чтобы никаких мув конструкторов не вызывалось (они то в принципе нахуй не нужны). Но по эффективности это примерно одинаковые подходы. Асло, есть же еще std::unique_ptr - я где-то читал что компиляторы во многих случаях способны оптимизоровать std::unique_ptr так что у него вообще нет накладных расходов, незнаю насколько это правда - но он может оказаться эффективней.
Бамп.
>Асло, есть же еще std::unique_ptr - я где-то читал что компиляторы во многих случаях способны оптимизоровать std::unique_ptr так что у него вообще нет накладных расходов, незнаю насколько это правда - но он может оказаться эффективней.
Я изначально его и попытался заюзать, но в моем компиляторе был какой-то косяк, поддержка shared_ptr была, а unique_ptr не было или типа того. Ну, это давно было.
Поэтому заюзал shared_ptr, чтобы не греть голову по поводу своевременного освобождения памяти.
От какого переполнения?
bool++ - так делать просто не надо и все. Скорее всего даже варнинг схватишь.
explicit B(int a);
};
class A : public B
explicit A(int a, int c);
};
A::A(int a, int c)
: B(a) // 1
{
DoSomeShit(a); // 2
B(a);
}
Можно ли сделать, чтобы конструктор предка вызывался не перед вызовом конструктора, а после? Без аггрегации
Нет. Предок должен быть полностью сконструирован перед тем как конструируется потомок.
А что не так? Как правильно, сеньор?
У тебя десять массивов, которые являются элементами другого массива. Ты стер массив из десяти указателей на десять массивов, но те десять массивов по десять чисел в каждом всё ещё существуют.
Да, вот так.
Юзают, абсолютно верно - векторы, или std::array. Сырые владеющие указатели после 2011 года юзать запрещено.
Меньше что ли жрут?
exception safety равный нулю. И да, человеческий фактор с утечками.
>>37504
std::array - жрет столько же сколько обычный массив на стэке.
vector - чуточку тяжелее. Но если ты будешь делать reserve\resize для пре-аллокации нужного количества памяти - то по производительности будет почти тоже самое
лучше сначала профайлером пройтись, а потом уже на скорость дрочить.
да, будешь. Макросы в современном С++ использовать строжайше не рекомендуется, кроме для кроссплатформенной разработки ну или когда код шарится между кернел-модом и юзер-модом, как у меня на работе
С++ вообще такой язык, где нужны только мидлы и выше, а лучше вообще одни сениоры. Это не ангуляр-мартыха.
Не рождаются же C++ кодеры мидлами. К тому же, на hh есть вакансии, где указано без опыта, но как-то подозрительно всё это. Что вообще в сейчас на крестах пишут?
Без опыта != студент-интерн. Я собесил на вакансию "без опыта", приходили совсем нулевые дауничи. То, что у тебя нет опыта - это значит, что ты что-то заебись умеешь и знаешь.
Что пишут - я писал в разное время;
qt-парашу для железной дороги, сервер управления поездами для нее же, бэкенд-утилитки для хостинг панели, прошивку для роутера, сейчас пишу драйвер для винды.
> То, что у тебя нет опыта - это значит, что ты что-то заебись умеешь и знаешь.
Да как так то. Ну знаю всякие основы ОС, сетей, алгоритмы, жму/пинусы с гитами и С++ на уровне базового курса, я нулёвый даунич?
>
>Да как так то. Ну знаю всякие основы ОС, сетей, алгоритмы, жму/пинусы с гитами и С++ на уровне базового курса, я нулёвый даунич?
Знание алгоритмов и прочих основ не делает из тебя не говнокодера. Нужно иметь умение структурировать код и проектировать его, чтобы потом через полгода или год, тебя ногами не пиздили за то, что ты написал. Ну еще знание всяких жизненных ситуевин очень помогает. Опыт карочи.
C++ на уровне базового курса == не подпускать к продакшен кодбазе на расстояние пушечного выстрела.
>Понял, пойду выпиливаться, спасибо за ответы.
Короче блять. Совет тебе. Пробуй делать хоть какие-то мизерные, но все же проекты. Со временем ты увидишь, что у тебя начинают возникать бойлерплейты и ты постараешься их избегать и изобретешь для себя паттерны, но пока ты ничего не понимаешь в этом, паттерны будут только во вред, потому что их нужно грамотно применять.
Попробуй написать какой-нибудь обменник сообщениями по TCP, потом улучшай, улучшай и улучшай. Переписывай все заново. Так и набивается опыт.
> Попробуй написать какой-нибудь обменник сообщениями по TCP, потом улучшай, улучшай и улучшай. Переписывай все заново. Так и набивается опыт.
Спасибо за совет, няша. Родители уже гонят на работу, а на собеседования страшно идти. Может ещё успею, а то сейчас вообще тьма, депрессия и боль.
template<typename T, typename std::enable_if<
std::is_signed<T>::value ||
std::is_void<T>::value
,T>::type>
void f(T t = 0);
Можно ли вообще такое сделать валидным?
вдогонку - в вариадик шаблоне да, sizeof...(), а в обычном - только специализация\перегрузка и тд
Не было доступа к родной пеке, быстро накатил dev-c++ на виндах, написал всё, прогнал тесты - всё ок.
Перегнал исходники на никсы, написал скрипт, который генерирует скрипт запуска по передаче 500+ аргументов в последовательных запусках. Где-то на сотом файле всё умерло. Ну, думаю, что-то упустил. Ручками запускаю с этим файлом под виндой - всё ок. Ручками запускаю в никсах - обрабатывает файл по кругу, не останавливаясь в eof, лог вырастает в гигабайт за 10 секунд.
Хуле ему надо.
Нет, это, блядь, невозможно просто.
Шапка цикла: while(pos < length) {
Вывод в конце цикла:
[code]
code_length = length - pre_pos;
rintf("END OF FILE in %d bytes\n", code_length);
printf("length is %04x\n", length);
printf("pos is %04x\n", length);
[/code]
END OF FILE in 5 bytes
length is 0f5b
pos is 0f5b
pos больше не меняется. length больше не меняется.
После этого проверяется шапка цикла.
Под виндой ок, под никсами файл начинает обрабатываться заново (то есть pos = 0).
>Родители уже гонят на работу
>ещё успею, а то сейчас вообще тьма, депрессия и боль
зря ты решил в кресты инвестировать свое время
>Возможно ли в 2018 студенту устроиться стажёром с++ в ДС за еду?
если совсем кратко, то в случае если ты учишься по профильной специальности, те на программиста, тогда, да, возможно
все же различия между std::vector и std::array глубже рассуждений быстрее-медленней..
А что-нибудь не для винды и не для vs?
Это одно и тоже, просто квадратные скобки - это синтаксический сахар для читаемости кода, особенно, когда у тебя двух-, трех- и т.д. мерный массив через указатели совершенно нечитабельно. А так компилятор генерирует абсолютно один и тот же код. Пруф: https://godbolt.org/g/5oxxc6
Что сделал то?
Сильный.
Чтобы ты вопрос задал.
Прости, что доебываю, но у меня вопрос. Массив же состоит из элементов типа int? Почему тогда при смещении адреса указателя на единицу выдается другое число? По идее же, должно быть смещение адреса на 4.
Выходит, в массиве хранятся указатели на числа по которым можно так проходить?
Вот, что написал Прата в "Языке программирования С": "добавление
1 к указателю" означает добавление одной единицы хранения. Для массивов данный
факт означает, что адрес увеличивается до адреса следующего элемента, а не просто
до следующего байта. Это одна из причин того, почему нужно объявлять
вид объекта, на который указывает указатель. Одного лишь адреса недостаточно, т.к.
компьютер должен знать, сколько байтов требуется для хранения объекта.
Спасибо большое. Добра тебе.
Не знаю, многовато воды и совершенно неинтересные упражнения, но очень подробно все объяснено, так что решай сам.
>>38400
Будет прибавлять к адресу sizeof(int) байт. Стандарт не гарантирует, что это будет 4 байта, но, как правило, это именно столько. Чтобы прибавлять по байту нужно сделать приведение в Си-стиле к указателю на char.
замени на 'new long long'
я нихуя не понял, но .cpp файлы надо руками указывать, а хедеры "подцепятся автоматически" (препроцессор их хуйнет текстом в cppшники)
Может и я чето подзабыл, может и не было такой функции в geany чтоб *.cpp подхватывались сами
я не знаю, что такое geany, но абсолютно точно уверен, что .cpp нужные надо вручную перечислять
<пример. где такая хуйня встречается https://pastebin.com/Qstf02Wv
Зачем ты так с неокрепшим умом...
>>38238
Анончик, если уж занялся изучением плюсов, то дам пару советов:
1. Создавая проект в Visual Studio, создавай "Пустой проект". Тогда, у тебя не будет лишних файлов в твоем проекте по типу stdafx и иже с ними. Плюс уберутся лишние флаги к компилятору, суть которых ты не будешь понимать еще пару лет.
2. Изучая разделы плюсов, отвади по 1-2 дня на каждый раздел, нарешивая задачки. Или придумай задачку по-крупнее (написать консольный калькулятор, игру в слова, крестики-нолики, решить квадратное уравнение, запилить класс Matrix для матричных вычислений и т.п.)
3. Даже не пытайся запилить игры. Minecraft ты не напишешь еще очень долго. Могут уйти годы. Причем, minecraft это пожалуй один из немногих проектов, которые вмещаются в одну голову, все дальше только командная разработка, готовые фреймворки (Unity, UE4, CryEngine и т.п.).
Gamedev это вообще, глубокая область. Тебе придется разобраться в матане, графических библиотеках, работе со звуком, работа с артефактами (ассетами), разобраться как работает GPU (что такое Vertex Shader, Fragment Shader, Computer Shader и т.п., Shader buffer и т.п.). Плюс тут еще много подводных камней касаемых target platform, drivers, deploying, native OS API, hardware, build (dynamic linking vs static linking). Понятно, что тут еще будет накручен сбоку VCS, и всякие гиты ты должен будешь знать как пять пальцев. Это Single Player Game.
Если игра будет Multi-player specific, то нужен будет чувак, который еще шарит в сетях, сетевых протоколах, знает про то как мониторить и тестировать RPS, будет знать в каких БД хранить инфу о пользователях и т.д и т.п....
Еще можно долго писать про наличие Художника, Звуковика, Сценариста.
_______
Если хочешь для себя сделать что-то не сложное и за короткие сроки (пару месяцев, год). То бери только готовые решения - Unity (C#), UE4 (Blueprints, C++), м.б. какой-нибудь GameMaker. (GoDot не трогай, там много нюансов).
4. Если не планируешь изучать в дальнейшем английский, хотяб на уровень B1, C2, то спецом ты НЕ станешь однозначно. В доках ты ничего прочитать не сможешь - инфа 100%. Статьи ты будешь понимать коряво, а не то что пытался передать автор. И т.д.
5. (Если знаешь EN, или хотяб планируешь его изучать). Начинай смотреть канал - TheCherno (https://www.youtube.com/channel/UCQ-W1KE9EYfdxhL6S4twUNw). Отруби русский язык везде, где только возможно. Телефон и Компьютер на анг. поставь. Каждый день пытайся проговаривать в слух все что говорят Англоговорящие с youtube.
6. Держи в голове поговорку: "Повторение - мать учения". Также следуй принципу: "Все решения доводить до конца". Старайся концентрироваться на задаче/проблеме. Хотя, пох, можешь не следовать им, все равно через пару лет ты к ним придешь. Не всё сразу....
7. Старайся мыслить своей головой, и лишь затем пользоваться готовым решением.
Думаю к остальному, что я здесь не перечислил ты сам придешь или столкнешься в скором времени.
______________
П.С. Сам 23 лвл. Играл лет 10 в дотку и лол, а потом захотелось создать игру.
За 5 лет, так игру и не создал, зато прочитал 20 книжек по программированию. Узнал кучу полезной и бесполезной инфы. И еще 10000 статей с хабра и прочей фигни. По-работал по 2+ лет на каждой из популярных ОС.
Похоронил для себя C++ и перешел в web (пару лет назад) - мучу RESTful сервисы.
Зачем ты так с неокрепшим умом...
>>38238
Анончик, если уж занялся изучением плюсов, то дам пару советов:
1. Создавая проект в Visual Studio, создавай "Пустой проект". Тогда, у тебя не будет лишних файлов в твоем проекте по типу stdafx и иже с ними. Плюс уберутся лишние флаги к компилятору, суть которых ты не будешь понимать еще пару лет.
2. Изучая разделы плюсов, отвади по 1-2 дня на каждый раздел, нарешивая задачки. Или придумай задачку по-крупнее (написать консольный калькулятор, игру в слова, крестики-нолики, решить квадратное уравнение, запилить класс Matrix для матричных вычислений и т.п.)
3. Даже не пытайся запилить игры. Minecraft ты не напишешь еще очень долго. Могут уйти годы. Причем, minecraft это пожалуй один из немногих проектов, которые вмещаются в одну голову, все дальше только командная разработка, готовые фреймворки (Unity, UE4, CryEngine и т.п.).
Gamedev это вообще, глубокая область. Тебе придется разобраться в матане, графических библиотеках, работе со звуком, работа с артефактами (ассетами), разобраться как работает GPU (что такое Vertex Shader, Fragment Shader, Computer Shader и т.п., Shader buffer и т.п.). Плюс тут еще много подводных камней касаемых target platform, drivers, deploying, native OS API, hardware, build (dynamic linking vs static linking). Понятно, что тут еще будет накручен сбоку VCS, и всякие гиты ты должен будешь знать как пять пальцев. Это Single Player Game.
Если игра будет Multi-player specific, то нужен будет чувак, который еще шарит в сетях, сетевых протоколах, знает про то как мониторить и тестировать RPS, будет знать в каких БД хранить инфу о пользователях и т.д и т.п....
Еще можно долго писать про наличие Художника, Звуковика, Сценариста.
_______
Если хочешь для себя сделать что-то не сложное и за короткие сроки (пару месяцев, год). То бери только готовые решения - Unity (C#), UE4 (Blueprints, C++), м.б. какой-нибудь GameMaker. (GoDot не трогай, там много нюансов).
4. Если не планируешь изучать в дальнейшем английский, хотяб на уровень B1, C2, то спецом ты НЕ станешь однозначно. В доках ты ничего прочитать не сможешь - инфа 100%. Статьи ты будешь понимать коряво, а не то что пытался передать автор. И т.д.
5. (Если знаешь EN, или хотяб планируешь его изучать). Начинай смотреть канал - TheCherno (https://www.youtube.com/channel/UCQ-W1KE9EYfdxhL6S4twUNw). Отруби русский язык везде, где только возможно. Телефон и Компьютер на анг. поставь. Каждый день пытайся проговаривать в слух все что говорят Англоговорящие с youtube.
6. Держи в голове поговорку: "Повторение - мать учения". Также следуй принципу: "Все решения доводить до конца". Старайся концентрироваться на задаче/проблеме. Хотя, пох, можешь не следовать им, все равно через пару лет ты к ним придешь. Не всё сразу....
7. Старайся мыслить своей головой, и лишь затем пользоваться готовым решением.
Думаю к остальному, что я здесь не перечислил ты сам придешь или столкнешься в скором времени.
______________
П.С. Сам 23 лвл. Играл лет 10 в дотку и лол, а потом захотелось создать игру.
За 5 лет, так игру и не создал, зато прочитал 20 книжек по программированию. Узнал кучу полезной и бесполезной инфы. И еще 10000 статей с хабра и прочей фигни. По-работал по 2+ лет на каждой из популярных ОС.
Похоронил для себя C++ и перешел в web (пару лет назад) - мучу RESTful сервисы.
нет, не норм. Потенциальное замедление компиляции - плюс в наших петушиных кругах принято отделять интерфейс от реализации
[fq
>Даже не пытайся запилить игры
Я уже сделал гениальные крестики-нолики и арканоид... Дороги назад нет?
АХУЕТЬ. ЕБАТЬ СПАСИБО. АХ ВОТ КАК КВАДРАТОСКОБКИ РАБОТАЮИТ.
Если тебе интересна эта тема (gamedev), то развивайся конечно!!
Просто сделать что-то большее чем minecraft в одного будет почти нереально, если ты конечно не со школьлной скамьи фигачил лин.алг, computer science и т.п.
Арканоид - норм. Если прям шаришь, в том что сделал и все понимаешь, и можешь уместить весь проект в голове, то пробуй что-то большее. А если нет, то смотри в сторону UE4.
Лично, я дальше 2д поделок не смог уйти. Теперь понимаю, что нужно было в школе учить косинусы, тангенсы и нарешивать всякие СЛАУ. Щас, уже времени нет на все это, да и голова не свежа.
У тебя память кстати норм? Родичи заставляли в свое время учить стихи и прочее?
ЕБАТЬ МОЙ ХУЙ
>У тебя память кстати норм? Родичи заставляли в свое время учить стихи и прочее?
С памятью все хорошо. В школе много зубрил всякой терминологии гуманитарной.
>Теперь понимаю, что нужно было в школе учить косинусы, тангенсы и нарешивать всякие СЛАУ. Щас, уже времени нет на все это, да и голова не свежа
Насколько нужен сильный уровень математики? Если он чуть выше/равен школьному, то сойдет?
>UE4
Мне почему-то удобнее работать с SDL. Уеч слишком монструозен.
Вот коммутативность такой операции нихуёвый такой брейнфак
https://pastebin.com/4vzmApEi
Слишком сложно для меня. Много нерелевантной инфы.
https://github.com/mapsme/omim/blob/master/CMakeLists.txt
Я хочу скомпилить только нужный мне кусок.
https://github.com/mapsme/omim/blob/master/qt/CMakeLists.txt
Но как я не ебусь с этими мэйклистами нихуя не выходит, постоянно какая-нибудь хуитка не находиться.
1.Можно ли в cmake как то добавлять префиксы для инклюдов в исходниках?
Т.е. если у меня huilta1.hpp и huita2.hpp чтобы между собой в коде писать не #include "huita1.hpp", а #include "PREFIX/huita1.hpp"?
2.Можно ли как-то вывести список всех директорий, которые подключаются к проекту?
3.Можно ли то же самое сделать для всех файлов?
Память это core resource. Успех интеллектуальной деятельности от нее слишком сильно зависит. Мне вот не повезло, я прочитал от силы 3 книги за всю школу и выучил "Бородино". Теперь, вот даже не получается запомнить функции фреймворков с которыми работаю, каждый день. Всегда держу откртыми доки и стак.
Углубленный матан нужен, если ты пишешь с нуля физический движок. (движение частиц, упрогость объектов, кинематические функции для скелетов гуманойдов, баллистические уравнения и т.п.), все это нужно будет быть способным понять и реализовать.
Конечно есть готовые либы и функции на github, в частных блогах, книгах.
Если с матаном будет не очень складываться, то тогда только готовые движки, либы и т.д. Ну хотя, может с школьными знаниями (геометрия, тригонометрия, лин.алг) дейсвительно можно делать примитив на уровне 2Д платформеров и др. жанров.
>3 книги за всю школу и выучил "Бородино"
Ничего себе. У нас в школе палками пиздили если ты не читал и не учил.
Спасибо за ответы вообще. Ты сам почему с плюсов ушол?
>если ты пишешь с нуля физический движок
Можно про вот это по-подробнее? Как их вообще пишут? На OpenGl и DirectX?
В проверке символа ты делаешь переприсваивание. поставь ==
Всяким пыхаблядям, джаваскриптопидорам и питонистом проще.
C++ активно используется в яндексе и мейле из русского. В Фейсбуке, Гугле, Майкрософте, Амазоне из зарубежного.
Я ответил на твой вопрос?
>>Ты сам почему с плюсов ушол?
0. Ну про память я тебе написал свою. Как рыбка Дори =).
1. Слишком долго разбирался в тонкостях языка и его экосистемы, как итог - просто перегорел, стало даже тошнить от расширения файлов cxx, cpp и тд. Теперь понимаю, что нужно было искать работу после двух лет изучения (и идти пусть даже стажером). Пожалуй, основная причина. Все-таки, на старте нужна хоть какая-то отдача. Если то, чем ты знаимаешься не приносит тебе денег в течение года, то что-то тут не так..
2. Интерес к основным штукам для которых предназначен сейчас C++ - у меня пропал. (Embedded, gamedev, ROS, OS, "SUPER ULTRA HIGH PERFORMANCE SYSTEMS", и т.п.) - эти области Мне более неинтересны.
3. Архаичность. Когда имеешь дело с C++, то нужно всегда помнить про тонкости и хаки чистого C. Количество подходов к тому как писать либы и код, менялось более 40 лет, отсюда слишком разная структура у third party либ. Каждый раз нужно разбираться, как inject-ить либу в проект, потом настривать compiling, linking, building. Всегда нужно читать все header файлы. Ибо может быть какая-нибудь особенность конкретной либы. Порядок подключения хедеров, тоже иногда может быть важен.
4. Просто выпишу из своего дневника пару минусов:
- Total absence of Unified Package manager
- Total lack of Unified Best Practices
- Exuberant Syntax, therefore it has Poor Readability && Many ways to solve a problem
- If you write C++ code, then you need understand old C code. Because C++ founded on top of C.
- Hard to configure IDE or code editor to make a builds. Real good IDE is just for Windows.
- Dependency Injecting is so fucken mindgames. You always need to read source code and headers to understand library specific traps and pitfalls.
- (RAII) Manual work with memory allocation/deallocation. (OFC if you work with C++ approx 5 years, then you know about SMART POINTERS), but this approach has overhead, and decrease performance of target system.
В целом я рад, что начал в свое время с C++. Мир веба, кажется теперь простым детским садиком.
"Куда ушел?"
Веб. Здесь гораздо проще людям с памятью рыбки "Дори". Программирование, как таковое выливается в чтение доков, а затем примение какого-то готового шаблона из фреймворка. Почти что декларативный стиль программирования. Ситуаций, когда ты можешь что-то сломать на уровне логики - очень мало.
>>38914
>>Можно про вот это по-подробнее? Как их вообще пишут? На OpenGl и DirectX?
Да это обыкновенный набор cpp, h, c, cxx, hpp, dll, lib, dll.lib, so и д.р. файлов.
В этих файлах описываются шаблоны игрового мира, шаблоны объектов, шаблоны устройств ввода (джойстики, клавиатуры, мышки, геймпады, рули, стики и т.п.), шаблоны свойств объектов и т.д. Там очень богатая иерархия шаблонов классов.
Там будет обязательно реализация state machine. Реализация renderer (отрисовщика кадров) и т.п. В отрисовщике кадров уже используются всякие функции Direct3D (если проект собирается под Windows платформу), OpenGL (под все поддерживаемые им платформы, опять же видеокарта должна поддерживать соотв. стандарт OpenGL-ля), Metal (для MacOS), Vulkan (под все, если производитель карты замутил соотв. драйвера) и тд.
Понятно, что пишут их только спецы, которые понимают как работает ОС и Железки.
Остальные их только дорабатывают, фиксят баги.
>>Ты сам почему с плюсов ушол?
0. Ну про память я тебе написал свою. Как рыбка Дори =).
1. Слишком долго разбирался в тонкостях языка и его экосистемы, как итог - просто перегорел, стало даже тошнить от расширения файлов cxx, cpp и тд. Теперь понимаю, что нужно было искать работу после двух лет изучения (и идти пусть даже стажером). Пожалуй, основная причина. Все-таки, на старте нужна хоть какая-то отдача. Если то, чем ты знаимаешься не приносит тебе денег в течение года, то что-то тут не так..
2. Интерес к основным штукам для которых предназначен сейчас C++ - у меня пропал. (Embedded, gamedev, ROS, OS, "SUPER ULTRA HIGH PERFORMANCE SYSTEMS", и т.п.) - эти области Мне более неинтересны.
3. Архаичность. Когда имеешь дело с C++, то нужно всегда помнить про тонкости и хаки чистого C. Количество подходов к тому как писать либы и код, менялось более 40 лет, отсюда слишком разная структура у third party либ. Каждый раз нужно разбираться, как inject-ить либу в проект, потом настривать compiling, linking, building. Всегда нужно читать все header файлы. Ибо может быть какая-нибудь особенность конкретной либы. Порядок подключения хедеров, тоже иногда может быть важен.
4. Просто выпишу из своего дневника пару минусов:
- Total absence of Unified Package manager
- Total lack of Unified Best Practices
- Exuberant Syntax, therefore it has Poor Readability && Many ways to solve a problem
- If you write C++ code, then you need understand old C code. Because C++ founded on top of C.
- Hard to configure IDE or code editor to make a builds. Real good IDE is just for Windows.
- Dependency Injecting is so fucken mindgames. You always need to read source code and headers to understand library specific traps and pitfalls.
- (RAII) Manual work with memory allocation/deallocation. (OFC if you work with C++ approx 5 years, then you know about SMART POINTERS), but this approach has overhead, and decrease performance of target system.
В целом я рад, что начал в свое время с C++. Мир веба, кажется теперь простым детским садиком.
"Куда ушел?"
Веб. Здесь гораздо проще людям с памятью рыбки "Дори". Программирование, как таковое выливается в чтение доков, а затем примение какого-то готового шаблона из фреймворка. Почти что декларативный стиль программирования. Ситуаций, когда ты можешь что-то сломать на уровне логики - очень мало.
>>38914
>>Можно про вот это по-подробнее? Как их вообще пишут? На OpenGl и DirectX?
Да это обыкновенный набор cpp, h, c, cxx, hpp, dll, lib, dll.lib, so и д.р. файлов.
В этих файлах описываются шаблоны игрового мира, шаблоны объектов, шаблоны устройств ввода (джойстики, клавиатуры, мышки, геймпады, рули, стики и т.п.), шаблоны свойств объектов и т.д. Там очень богатая иерархия шаблонов классов.
Там будет обязательно реализация state machine. Реализация renderer (отрисовщика кадров) и т.п. В отрисовщике кадров уже используются всякие функции Direct3D (если проект собирается под Windows платформу), OpenGL (под все поддерживаемые им платформы, опять же видеокарта должна поддерживать соотв. стандарт OpenGL-ля), Metal (для MacOS), Vulkan (под все, если производитель карты замутил соотв. драйвера) и тд.
Понятно, что пишут их только спецы, которые понимают как работает ОС и Железки.
Остальные их только дорабатывают, фиксят баги.
А если это как у дверного массива? Andron [3][3]
нет.
почему эта хуйня работает? Под неё будет выделена какая то память или что?
const int &r=42;
Спасибо) И тебе удачи, не забрасывай, не теряй мотивации, доделывай дела до конца и все будет пучком. :)
Это я знал. Так в Qt пишут.
проебал указатель
Чтобы макакопараша не сходила с ума {} - это []
звездочка это 'з'
arr{a}{b} это з(з(arr + a) + b)
Это валидно и для статических двумерных массивов, и для динамических
Хм...
И если не утомил тебя, то ты не можешь сказать о том стоит ли учить Си? Мне он просто больше как-то заходит.
Гей плез
понадобилось подправить cout, это я нагуглил, но не пойму, как его использовать правильно в нескольких файлах .cpp(с одним работает), компилятор говорит что-то об ошибке линковщика.
https://pastebin.com/bXEz814y
Неправильно ты понял. Компилятор делает из всех условных конструкций последовательности cmp и jump
Спасибо!
Не, не утомил)
В первую очередь определись с тем, что тебе интереснее - какая конкретно область тебя интересует (может тебе хочется железки программировать, писать драйвера для GPU, или там Движки писать для игр).
Твой вопрос очень сильно похож на:
"Какой язык учить? немецкий, японский, итальянский или иврит?"
Без доп. информации я не смогу нормально ответить)
__________
Если ты точно не знаешь, или еще не определился с областью, то тогда три КЛАССИЧЕСКИХ варианта для старта:
1. Архаичный вариант (Turbo Pascal), неплох для совсем новичков, чтобы пройти именно след. темы: Алгоритмизация, Структуры данных, Array, functions, procedures, input/output stream, и тд. Потом перескакивают на прагматические языки, на которых можно будет зарабатывать.
В отличии от C, имеет понятный для новичков синтаксис.
2. Более сложный вариант (C). В начале будет сложнее, но зато не нужно тратить время на Turbo Pascal. Изучая язык, ты столкнешься со всеми важными топиками: Алгоритмы, структуры данных, looping, conditional statements, память, stack, heap, calling conventions, functions, functions returning void (procedure), linker, compiler, input/output streams, descriptors, pointers, constant values, ascii, posix/winapi, memory allocations/deallocations/reallocation и т.д.
3. Самый простой в начале это Python. Но многие моменты (по типу адресной арифметики, указателей (pointers), структуры данных, типы, и почти все выше перечисленное из пункта 2 - пройдут вскользь, а следовательно - будет плохая база, если ты соберешься делать что-то крутое и продвинутое. Тот же CPython будет уже так просто не заюзать. Но зато, на нем ты быстро можешь заценить результат твоих трудов, сможешь делать более крупные задачи раньше чем на C или C++. Начинать вкатываться в программирования с применением этого языка, это как - учиться вождению на Mercedes S Class, а потом придется вдруг пересесть на Subaru (у которой еще движок не собран), а потом вообще в копейке придеться копаться. К хорошему быстро привыкаешь. Не советую начинать вкатываться с этого языка.
_______________
Прямой ответ на твой вопрос:
C++ не бывает без C. Используя C++, ты так или иначе юзаешь C.
А юзая C ты всегда используешь часть C++.
С лишь подмножество C++.
Если ты новичок, то иди по пункту 2 (выше).
В противном случае бери любую Толстую книжку по C++ и прорешивай, осмысливай все что там написано. В таких книжках косвенно объясняется весь твой C. А затем начинается специфика самого C++. Параллельно можешь, смотреть канал - "TheCherno" на youtube. Как только наберешься умных слов и практики, начинай мутить сколько-нибудь сложные программы (десяток консольных программ и пару графических). Дальше ищи работу стажером.
Вообщем, действуй!! Карты еще могут сто раз переиграться.
Не, не утомил)
В первую очередь определись с тем, что тебе интереснее - какая конкретно область тебя интересует (может тебе хочется железки программировать, писать драйвера для GPU, или там Движки писать для игр).
Твой вопрос очень сильно похож на:
"Какой язык учить? немецкий, японский, итальянский или иврит?"
Без доп. информации я не смогу нормально ответить)
__________
Если ты точно не знаешь, или еще не определился с областью, то тогда три КЛАССИЧЕСКИХ варианта для старта:
1. Архаичный вариант (Turbo Pascal), неплох для совсем новичков, чтобы пройти именно след. темы: Алгоритмизация, Структуры данных, Array, functions, procedures, input/output stream, и тд. Потом перескакивают на прагматические языки, на которых можно будет зарабатывать.
В отличии от C, имеет понятный для новичков синтаксис.
2. Более сложный вариант (C). В начале будет сложнее, но зато не нужно тратить время на Turbo Pascal. Изучая язык, ты столкнешься со всеми важными топиками: Алгоритмы, структуры данных, looping, conditional statements, память, stack, heap, calling conventions, functions, functions returning void (procedure), linker, compiler, input/output streams, descriptors, pointers, constant values, ascii, posix/winapi, memory allocations/deallocations/reallocation и т.д.
3. Самый простой в начале это Python. Но многие моменты (по типу адресной арифметики, указателей (pointers), структуры данных, типы, и почти все выше перечисленное из пункта 2 - пройдут вскользь, а следовательно - будет плохая база, если ты соберешься делать что-то крутое и продвинутое. Тот же CPython будет уже так просто не заюзать. Но зато, на нем ты быстро можешь заценить результат твоих трудов, сможешь делать более крупные задачи раньше чем на C или C++. Начинать вкатываться в программирования с применением этого языка, это как - учиться вождению на Mercedes S Class, а потом придется вдруг пересесть на Subaru (у которой еще движок не собран), а потом вообще в копейке придеться копаться. К хорошему быстро привыкаешь. Не советую начинать вкатываться с этого языка.
_______________
Прямой ответ на твой вопрос:
C++ не бывает без C. Используя C++, ты так или иначе юзаешь C.
А юзая C ты всегда используешь часть C++.
С лишь подмножество C++.
Если ты новичок, то иди по пункту 2 (выше).
В противном случае бери любую Толстую книжку по C++ и прорешивай, осмысливай все что там написано. В таких книжках косвенно объясняется весь твой C. А затем начинается специфика самого C++. Параллельно можешь, смотреть канал - "TheCherno" на youtube. Как только наберешься умных слов и практики, начинай мутить сколько-нибудь сложные программы (десяток консольных программ и пару графических). Дальше ищи работу стажером.
Вообщем, действуй!! Карты еще могут сто раз переиграться.
Спасибо за такие полные развернутые ответы!
Вообще, я не особо нуб. Я два месяца до этого кодил на C#, но мне захотелось чего-то более низкоуровневого.
Меня больше всего интересует создание драйверов/программирование движков и т.п. Только не знаю, потянул ли, ибо с физикой проблемы.
Кстати, насколько сильно нужна физика программисту?
Я играл в kerbal space program. Я знаю ее.
А если серьезно, то вообще не нужна. Именно для программирования физика не нужна. Программисту нужно знать алгоритмы, а анализ этих самых алгоритмов происходит с помощью всеми любимой математики.
Если речь идёт о разработке движков, то, опять же, всё зависит от конкретной задачи, т.к. такие штуки обычно создаются командой, где есть четко распределенные роли.
Ну, изучать CS обычно начинают с самого "низа", т.е. с самого базового устройства ПК (устройство процессора, транзисторы, логические вентили, триггеры и т.д.). Может он умудрился связать с физикой работу транзистора, например?
Видимо да. Он еще с ламповыми компами работал...
>В C++ можно определить значение, которое будет принимать параметр, при вызове функции без аргумента, соответствующего этому параметру."
Это вроде как он на вариадики намекает? Или это про обычную перегрузку void foo(int p) <===> void foo()?
Я тебе отвечу конечно, но тебе лучше начать решать практические задачи (больше практики, меньше форумов на болтовню).
Физика тебе как-таковая ненужна, если ты будешь программировать Software. Но она дает, некоторые фичи для тебя, как для будущего инженера, а именно знание и понимание физических процессов (напр. процесс кипения, процесс перемещение объектов, процесс изменения состояний какого-либо вещества, процесс движения частиц (в зависимости от агрегатного состояния - газ, плазма, жидкость, тверд. тело), интерференция волн, и т.п.). Таких процессов просто овер 9999999999, поэтому нет смысл это все досконально изучать.
Посмотри основные темы - кинематика, электричество, термодинамика, магнитизм, волновая физика, оптика. Пожалуй основные, вот они помогут тебе в жизни. (Пусть знающие поправят, если что забыл). Короче физику нужно знать и понимать на уровне 7,8, 9 класса. По-крайней мере, мыслить ты будешь шире, чем человек без понимания физических процессов и законов.
Вся остальная физика только от задач с которыми, ты будешь сталкиваться. Просто так, не имеет смысла изучать, скажем Ядерную физику. Ну будешь, ты знать какие-то периоды полураспада хим. элементов, но практического толку будет - 0. Или там, скажем принцип суперпозиции, зачем оно тебе?
UPD:
Если че, я оффаюсь на пару недель. Много работы.
А тебе анончик здоровья и воли, не ленись и все будет оки-доки. =)
Серьёзно? Это же какое-то дануство, не? Не, конечно, можно как-то сделать это более интресно, но разве в этом есть что-то кроме модного слова?
Хм, я даже не думал, что это будет кому-нибудь интресно, а вот если взять идею говночата и на него накрутить ssl, всякий функционал в виде комнат, конф, может гуи, возможность передавать зашифрованные файлы и тп. Это нормальный проект для портфолио?
А что по распространению либ? Вот есть буст асио, а есть ливень, а есть вангл. На что из этого стоит посмотреть в первую очередь?
мимо тоже хочу написать хоть говночат
Ливень -> либивент
У нас с другом две теории, он считает что они пишут более производительные/оптимизированные варианты. Я считаю, что они скорее расширяют как-то функционал и серьезно оптимизировать стл не получиться.(Иначе почему это еще не в стл?). Есть еще варианты?
Видимо стл слишком тяжеловесен для их нужд?
Посмотри «Mastering Algorithms with C» (Kyle Loudon), там в картинках рассказано.
Стоит.
Работодатель посмотрит на то, какие используешь указатели, как оформлен код, нет ли диких констъюкций вроде оператора возврата из середины функции и т.д.
Текстовый режим или графика — менее важно. По крайней мере, насколько знаю лично я (лично).
>Работодатель посмотрит на то, какие используешь указатели, как оформлен код
То есть их не волнует просто наличие/не наличие.
не прилинковал библиотеку
>>40237
STL обязана соблюдать контракт, написанный в стандарте. Стандарт позиционируется как универсальная штука-дрюка. Свои велосипдеы, если будут писаны крутыми чуваками - конечно лучше. Можно в векторе сделать Small Vector Optimization, можно изменить паттер аллокации с x2 на что-то более сложное. Можно нахуй выкинуть все эксепшены еще. Вариантов так-то много очень. Та же хэш-таблица может быть реализована разными способами.
>>40263
Кидай конечно.
>>40266
В варианте листа ты просто соединяешь линками предыдущий и следующий элемент. А текущий нахуй удаляешь потом.
В этом то и прикол, что я написал крестики и нолики с ИИ...
_getch()
Лол. Я так и сделал, думал что говнокод сраный.
map[0xF4] = "asd";
map[0x09] = "ffgf";
map[0xAB13] = "eed";
map[0x00] = "cvcccc";
map[0x05]= "ddd";
А потом пройдусь по ней итератором от начала до конца, то значения будут отсортированы по ключу или нет?
Допустим, в данном примере std::map<int, std::string>
Сортировка по ключу идет, а не по значению
Др. аноны уже все расписали. Можешь глянуть EA STL, как раз писалась для перформанса и юзабилити.
Мне почему-то кажется, что они специально так сделаны, чтобы у тебя горело и ты разбирался.
дважды кидал книга на пол, когда читал обход бинарного дерева
Дойди до сортировок анон, дальше попроще
При завершении программы выдает ошибку. На сколько правильно я создал алгоритм увеличивающегося массива.
В прошлый раз я приходил сюда с этим же алгоритмом и мне сказали использовать vector. Не уже ли нельзя нормально реализовать программу с увеличивающимся массивом?Жду ваших советов.
1)Ты увеличил n и лезешь за границу первого массива в цикле на 24 строке.
2)Ты не удаляешь первыц массив после копирования во второй и переопределяешь в 28 строке
А да, ты еще и в 28 строке сокрытие имени делаешь, как правильно заметили. Короче смотри правило. Если ты переопределяешь переменную, инициализированную через new,то ее нужно скопировать, удалить, создать, скопировать.
Потому что алгоритмы нужно учить по Кормену (и Ко) или Кнуту.
Когда главы разбираешь, там есть текст описания алгоритма и есть текст в рамке с программой, читай сначала текст в рамке, сразу начнешь понимать текст в книге при описании алгоритма
>>40581
>>40583
Это другой код здесь я удаляю оба массива
https://ideone.com/fPExiY
Примерно месяц назад я приходил сюда с таким же кодом, мне сказали используй вектор, а затем спросили зачем ты создаешь и удаляешь массивы по два 2 раза, но на мой взгляд все логично. Вообще вся эта проблема пошла с лабораторной работы по программированию. Тогда мы долго с учителем сидели и думали что не так, ну затем он тоже сошелся на том что массив объявленный внутри цикла невидно в другой части программы. Вчера я написал программу где я не удаляю массив arr_one а просто присваиваю ему другой размер и у меня впервые результат был верный я ввел 1 2 3 и мне вывело 1 2 3. Но только выводило ошибку. До этого на лабораторной тоже все было нормально, но в конце мне выводило массив не с моими числами, а со случайными числами. Теперь у меня код примерно такой же как на лабораторной. Но теперь выдает вот эту ошибку.
Я тебе уже ответил. Ладно, я сегодня добрый, поэтому разжую тебе всё , но лабы всё равно идут нахуй.
Разберем твой говнокод по шагам
Ты инициализируешь n=1. Переменная k, которая на 1 всегда меньше n нахуй не нужна. Далее ты создаешь arr_one в куче размера n==1.
Далее ты заходишь в цикл, инициализируешь единственный элемент массива с клавиатуры. После этого спрашиваешь добавить или нет.
Если да, то ты инкреметируешь n. На первой итерации цикла оно становится n==2.
Далее ты создаешь arr_two размера n==2.
Заходишь в цикл с условием (i=0; i<2;i++)
При i==0 arr_two[0]= arr_one[0]
При i==1 arr_two[1]= arr_one[1]
Но arr_one у тебя размера 1, поэтому элемента arr_one[1] не существует и ты вылазишь за границу массива.
Исправь условие в цикле на i<n-1
И добавь в конце функции delete [] arr_one;
А вообще за ебучий месяц ты мог всю блядскую книжку зазубрить, но нет, пацаны помогите, я сам не хочу разбираться в том, что наваял. А теперь иди читать книжки и доебывать своего мудака препода
Сотри весь код и напиши заново, без всех этих new и delete, никто ими в современном мире уже не пользуется, всю необходимую информацию тебе уже дали. Если твоя цель - просто сдать лабу, пройди нахуй и не трать наше время на дваче, лол, время ну вы поняли
даже несмотря на то что программа выдавала, ошибку лабу мне зачли. Информацию необходимую мне не дали. Мне сказали что сделать я сделал, все равно не работает.
хах как смешно я запятую поставил
Почему выдает только 3 названия.
srand нужно вызвать один раз в самом начале.
Котаны, джаваблядок в треде: какие шансы у меня вкатиться в разработку на C++, если я уже привык к тому что меня неплохо кормят? В теорию программировани умею, инженерный бэкграунд и инглиш в наличии. Просто внезапно осознал, что занимаюсь какой-то хуйнёй.
Во-первых, ты пишешь на С, поэтому ты попутал тред. Во-вторых, если все же ты пишешь на С++, то используй iostream и потоки ввода-вывода. Во-вторых, conio.h НЕ является файлом стандартной библиотеки, вместо этого лучше используй getchar() из stdio.h (в С++: cstdio), или cin.get() из iostream.
С одной стороны мне нравится, что я на С++ пишу охуенно сложные вещи (сейчас на работе виртуализацией файловой системы занимаюсь, кернельный драйвер пишу) - с другой стороны, у меня иногда прям истерики, что кто-то шлепает формы копипастой на ангуляре, а я реально очень сильно напрягаю голову.
Ну и пусть, зато ты ГЕНИЙ, а они ПИДОРЫ.
Страуструп, плес.
int main()
{
int a[10], b[10];
a = b;
}
Но при этом в стандарте нельзя найти никаких правил, которые бы запрещали такой код.
>Но при этом в стандарте нельзя найти никаких правил, которые бы запрещали такой код.
Да неужели.
Objects of array type are not modifiable lvalues, and although their address may be taken, they cannot appear on the left hand side of an assignment operator.
>Objects of array type are not modifiable lvalues
Это с цепепереференс, верно? А я говорил что в стандарте нельзя найти.
Кстати,
http://eel.is/c++draft/basic.lval#10: "An lvalue is modifiable unless its type is const-qualified or is a function type."
Поэтому откуда взята информация на цепепереференс — непонятно.
>откуда взята информация на цепепереференс — непонятно
Точнее, понятно: откуда-то из прошлого. Из C стандарта или из старой версии C++-стандарта. C++ стандарт до сих пор ссылается на отсутствующее правило:
http://eel.is/c++draft/dcl.array#7 [ Note: Conversions affecting expressions of array type are described in [conv.array]. Objects of array types cannot be modified, see [basic.lval]. — end note ]
Только вот [basic.lval] говорит то, что я процитировал выше. Ни слова про массивы.
Так что вот так.
>Но ведь логично, что это нельзя сделать
Может быть.
Но внятно написанных формальных запретов это делать нет.
Это, конечно, не проблема. Просто такой маленький забавный факт. Возможно, этот дефект когда-нибудь пофиксят.
getpeername()
Кто?
пытаюсь делать так:
typedef int(__cdecl scanfPrototype) (const char format);
но потом обсираюсь в
scanfPrototype read = &scanf;
Типа сигнатуры не те. Действительно, у scanf там еще ",...". Так вот, как это указать в прототипе ИЛИ как еще можно кроме std::cin >> var и scanf("%d", &var) считать инт в переменную? Желательно без считывания строки с дальнейшей конвертацией в int. Или все эти scanf и cin изолированно от меня всё равно конвертят ввод пользователя из ascii в нужный тип?
Былять, разметка съела указатели. Ну ты понел
>Как объявить через typedef прототип для scanf()?
typedef decltype(scanf) scanfPrototype;
>Или все эти scanf и cin изолированно от меня всё равно конвертят ввод пользователя из ascii в нужный тип?
Ну не телепатически из его головы же читают.
От __cdecl не сломается?
// какой-то код, сующий в vec, допустим, 3 элемента
`&vec[0] + 2` и `&vec[2]` — не одно и то же, первое приводит к UB на любой реализации вектора, у которой push_back реализован по стандарту, т.е. работает за амортизационно константно евремя.
В поле тема я написал "Трудно поверить, но факт", но оно почему-то не отобразилось.
void SetKeyCallBack(KEY_CALLBACK callback);
typedef void (CALLBACK * KEY_CALLBACK)(int iRow, int iColumn, bool bPressed);
Как мне получить два инта и бул? Да, я умственно отсталый, пожалуйста помогите и объясните во всех деталях.
тебе их передадут прямо в твой коллбек который ты зарегестрируешь через SetCallback
мимотян, пруфов не будет
Нормально все. Ты при статической линковке весь рантайм собираешь и тянешь. А ликовка долгая, т.к. плюсы с шаблонами.
> With Visual C++ (and other Microsoft compilers) on Windows, symbols aren't part of the binaries. Instead, they are stored in separate files called "Program Database" files (.pdb files). Just don't provide the .pdb files.
Отладочной инфы там нет.
Так релизная оптимизированная версия весит 23.4Мб, а неоптимизированная 57.2Мб + 180Мб отладочной инфы в отдельном файле.
Может это из-за того, что я использую Intel C++ Compiler? Я его по большей части спиздил с рутрекера и поставил потому, что MSVC отображает ошибки конпеляции на русском языке и Qt Creator не в состоянии их отобразить. Подключить clang-cl к Qt Quick я не асилил, а icl полностью мимикрирует под MSVC и для его подключения достаточно заменить батник инициализации и mkspec.
Она мультиязычная изначально, лол. На SO есть старые способы удаления языковых пакетов, но с VS2017 они не работают.
Самый удобный инструмент разработки - это VS. В нем пишут вообще все, кроме поехавших вимоблядей, и всяких унылых дядь с эмбедом, где свои инструменты.
если ты хочешь делать упор на изучение qt, но знаний у тебя явно маловато, то наверное удобней будет поставить какой-нибудь user-friendly вариант линукса, кодить в qt creator и в качестве компилятора использовать gcc
но если говорить вообще - похоже, у тебя явно не хватает бэкграунда чтобы спокойно делать что-то рабочее на qt
да еще: линукс ты можешь поставить на виртуалку, в этом есть множество преимуществ
1. Что такое embedded?
2. Реально ли писать на Qt в VS?
> 2. Реально ли писать на Qt в VS?
Ну как бы да. Только вот официальный аддон так и не допилен. Какие-то подвижки есть, но например Qt Quick не поддерживается вообще и в ближайшее время не будет. Только если сам хочешь ебаться с cmake (который в последние VS, кстати, встроен).
1. Программы для всяких кастомных крошечных микросхемок. Обычно там свои IDE (не всегда) и тулчейны (всегда), и это не совсем типичный С++, скорее просто С с классами. У данных девайсов могут веселейшие ограничение типа 32кб оперативки, отсутствие Heap'a вообще, и прочее.
2. Да, писал с официальным аддоном, все норм. Причем цмейк тут у предыдущего оратора я не понял, но qtquick да, не поддерживался. Мое скромнейшее имхо в том, что удобство студии перевешивает убогость qt creator'a, даже если надо немного поебстись с аддоном.
Получается, Arduino - сорт оф эмбед?
В том то и дело, что на это у меня агрессия.
Бля, обосрался даже тут
Детектить кейпресы - ✔
Делать всякую хуйню - ✔
Иметь хоть какую-то логику - ❌
В общем че я сделал, завел вайл который просит Сдк клавы задектить мне кейпрес, если детектит то срет мне в другую функцию, а я в этой функции делаю что-то еще, теперь блять нужно как-то сделать так, чтобы если я нажал кнопку, эта кнопка подсветилась, попытался через треды и детач, но получилась хуйня, жму кнопку и жму её опять, два треда как альфачи дерутся за ебаную посдветку и кнопку хуярит то ярко, то тускло, пока не погаснет, как вообще логику сделать для этой хуеты?
что хочешь то и делай. тебя никто не заставляет использовать все фичи языка. если твои "си с классами" сообразны задаче, то пиши на них. как грится: "ты платишь лишь за то, что используешь".
Блять, опять обосрался, нужно сделать чтобы она не просто подсветилась, а ушла из полностью яркой в погашенную, 256 -> 0, такие дела, помогите или подкиньте идей каких-то
Ну учись бороться с race-condition, хули. Ебани там очередь какую-нибудь, блокировок понаставь.
Ну если под "пользователями" класса ты понимаешь себя любимого, то не похуй ли?
> В общем че я сделал, завел вайл который просит Сдк клавы задектить мне кейпрес,
Что-то я в их пдфе функция для получения клавиши не вижу: https://makerhub.coolermaster.com/custom-lighting/assets/sdk/sdk-document.pdf
Может просто сделаешь старый добрый глобальный хук в винде?
Да забей ты хуй на их SDK, я хук уже делал, да у них в SDK все есть(SetKeyCallBack()), там просто в самом SDK Тайваньские комментарии от 2008 года, а на сайте 3/4 SDK
Короче, почитал про эти рейс кондишон, пиздаааа, я ж головой ебанусь там, ну да ладно, пара вопросов:
Как можно избавиться от бесконечных циклов чтобы задектить кейпрес и можно ли вообще от них избавиться?
Как один тред бить по голове, если он лезет вперед другого и срет ему в руки?
Так в чём проблема? Ты хочешь убрать дребезг (debounce)? Ну, таймер тебе в руки. После прихода сообщения устанавливаешь таймер, по окончании которого он вызывает функцию установки цвета с последним сообщением. При каждом новом сообщении таймер сбрасывается, и пришедшее сообщение ставится последним пришедшим. И так для каждой клавиши.
Алсо, если есть такая логика: Нажатие -> Ярко -> Нажатие -> тускло, то чтобы не терять слишком быстрые нажатия клавиш, можно добавить Atomic-переменную, которая будет считать нажатия с момента последнего срабатывания таймера. Таким образом можно будет сохранить логику и при этом игнорировать слишком быстрые изменения.
> Atomic
Хотя её будет мало. Лучшеиспользуй полноценный мютекс. http://en.cppreference.com/w/cpp/thread/lock_guard
На счет атомиков гуглил, но чет хз, логика такая, нажатие->кнопка и 4 ближние к ней загораются ярко->изначальные 5 кнопок чуть тускнеют, загорается следующий слой кнопок(ряд/колонка + 1)->опять кнопки предыдущий стадии тускнеют(кнопки самой первой стадии уже почти погасли) загорается следующий слой и на этом следующие слои больше не загораются, все предыдущие уходят в фейд, вот на моменте фейда и нажатие кнопок которые задевают уже нажатые кнопки проблема
Бля, а мютекс может помочь, спасибо, попробую потестить потом
У тебя там лапша из ифов небось? Наворачивай MVC. Делаешь контроллер. Он подписывается и получает вызовы колбеки (тоесть метод контроллера передается как колбек в SDK). И связан с моделью. Модель (предположительно) сосоит из массива с яркостями кнопок. По вызову колбека контроллер передает модели инфу что нажата такая то кнопка (вызывает метод модели "кнопка нажата"). Модель обновляет свою инфу - пробегается по всем кнопкам и у всех кнопок где яркость больше нуля уменьшает яркость и добавляет в массив обновленных кнопок, после этого яркость нажатой кнопки и соседних повышается до максимума и их айдишки тоже добавляются в массив обновленных кнопок. После этого этот массив передается контроллеру. Контроллер разгребает массив обновленных кнопок и посылает в SDK команды с новыми яркостями. Все ждут нового колбека. Естественно, это как вариант. Может повляют какие именно возможности предоставляет SDK. Что-то подобное можно и на лапше ифов сварганить. Если совладаешь с таким то можешь дальше навернуть абстракций, например DI - всю логику по которой определяется яркость кнопок выделить в отделную стратегию. Модель будет заниматься только собственно хранением инфы, общением с контроллером и вызовами стратегии. Если тебе захочеться изменить правила по которымподствечиваются кнопки - тебе нужно будет только заменить стратегию.
> атомиик!
> мьютекс!
> запускай таймер!
> наворачивай MVC!
А могли просто взять FRP-фреймворк и сделать throttle.
Только не throttle, а debounce, как я и писал. Можно сделать на https://github.com/Reactive-Extensions/RxCpp если нужен именно С++. Только вот нужно хоть как-то понимать что такое реактивное программирование, а он даже про мютексы не в курсе.
>Только не throttle, а debounce
Да, debounce более правильное название. Я решил сохранить терминологию из кода на картинке.
Ох нахлебался я от парня, который темплейты как недо-миксины использовал. Просьба всему треду - используйте темплейты по назначению, а не как средство превратить код в кашу.
Геттеры/сеттеры вообще зло, особенно которые "лишь бы были". Могу пояснить поподробнее где-нибудь.
Ну вообще всё помещается в одну фразу:
Don't ask for the information you need to do the work; ask the object that has the information to do the work for you.
Если у тебя весь код в геттерах и сеттерах, то это может (но не обязательно) свидетельствовать о проблемах в архитектуре.
Это не всегда так (а в каком-нибудь шарпе или спринге геттеры и сеттеры вообще являются НЕЗЫБЛЕМЫМ ЦЕНТРОМ МИРОЗДАНИЯ, вокруг которого всё крутится), так как некоторые хитрые алгоритмы работы с объектами не могут без этого обойтись (либо требуют один рефакторинг за другим снова и снова), поэтому если ты видишь, например, в плюсах, что тебе оба класса надо значительно перекраивать, чтоб изменить логику их работы, то можно вместо этого дать геттер в одну сторону или сеттер с поинтером/референсом в другую (тут уже тоже надо смотреть по ситуации, чтоб выбрать из двух зол меньшее, иначе иногда получаются совсем дикие цепочки, где референс/поинтер передается на 3+ родителя вверх / ребёнка вниз, потому что там что-то с ним надо сделать).
А создание геттера и сеттера для каждого поля — вообще слабоумие (ну или необходимость, если этого требует какой-нибудь слабоумный фреймворк, который не может адекватно воспользоваться конструктором), потому что это равнозначно public type x, но лишь с другой формулировкой. Инкапсуляция, понятное дело, идёт по пизде.
А вообще вот статья:
http://www.yegor256.com/2014/09/16/getters-and-setters-are-evil.html
Ну так и переменные в интерфейсе можно определить только геттерами/сеттерами. Ты бы мой пост прочитал сначала.
Что-то я слепой пиздец.
Короче получилась хуета, которая послала мою многопоточность нахуй, шо делать не знаю...
> Мое скромнейшее имхо в том, что удобство студии перевешивает убогость qt creator'a, даже если надо немного поебстись с аддоном.
Кстати, для студии рекомендую использовать недавно релизнувшийся verdigris. Там всего два hpp-файла добавить в проект. Тогда вместо emit, slots и прочих непотребностей можно будет использовать старые добрые макросы и не смущать intellisense и всякие статические анализаторы. Т.е. в итоге получается чистейший C++ без каких либо дополнений. Алсо, qt quick писать вполне себе можно. Просто нужно при создании проекта подключить в аддоне нужную библиотеку, и в готовый *.qrc-файл добавлять qml-формы с гуем. Ну и заменить сгенерированный main.cpp файл на qt quick-ный.
https://github.com/woboq/verdigris
> рекомендую использовать недавно релизнувшийся verdigris
Только из недостатков: ему нужен C++14 конпелятор.
Хотел такой вопрос задать.
Начал учить плюсы (до этого был си диез) чисто для себя.
В последствии хочу вкатитца в ИИ/микроконтроллеры/реверс- инженегринг шото из этого (не хочу я ваш питон, нинужон он мне).
Взял книжку лафоре. Оч годная. Прохожу с примерами где-то 1 главу за 1-2 дня. День читаю главу\разбираю какую- никакую алгоритмитизацию примеров, другой день - решаю примеры с книжки и кодварса.
Вопрос. Сколько примерно времени пройдет, прежде, чем я начну понимать что к чему и куда мне двигаться ?
~полгода минимум, а то и год.
> чем я начну понимать что к чему и куда мне двигаться ?
Для программирования мк C++ нинужен. Достаточно Си с классами, а на изучение этой хуйни много времени не уйдёт. Ты же не собираешься постигать template-fu? Для мк более важно понимать как работают процессоры, про организацию памяти, про способы взаимодействия с периферией и прочее. Короче работа с железом. Для нейросетей нужно изучать алгоритмы, и опять таки ЯП тут не так важен.
Для MSVC требуется минимум версия 2017, поскольку он использует фичи C++17 для обхода багов компилятора. Там вообще хеадери пиздец какие сложные. Как такую хуйню вообще написать можно?
https://github.com/woboq/verdigris/blob/master/src/wobjectdefs.h
https://github.com/woboq/verdigris/blob/master/src/wobjectimpl.h
Это не так сложно, как кажется. Надо понимать, что вся эта компайл-тайм параша - фактически свой собственный язык
Там не просто теймлейты. Они ещё приправлены макросами и на всём это сделан синтаксический анализатор и транслятор.
gcc только на ремоутной линуксовой машине, или локально через WSL.
Для локальной шиндоразработки вроде как-то clang\LLVM можно прикрутить, но не пробовал.
В сишарпе я это опишу так:
public class azaza<T1, T2>
where T1: interface1, new()
where T2: interface2, new() {...}
В плюсах пишу так:
template <typename T1,
typename T2,
typename = std::enable_if_t<(std::is_base_of_v<interface1, T1> && std::is_constructible_v<T1>)>,
typename = std::enable_if_t<(std::is_base_of_v<interface2, T2> && std::is_constructible_v<T2>)>>
class azaza {...}
Это нормальный C++ код или надо делать как-то по-другому?
> typename = std::enable_if_t<(std::is_base_of_v<interface1, T1> && std::is_constructible_v<T1>)>,
> typename = std::enable_if_t<(std::is_base_of_v<interface2, T2> && std::is_constructible_v<T2>)>>
Хотя судя по тому какие непонятные ошибки компиляции выходят при несоответствии проверкам, наверное лучше добавлять в конструктор
static_assert(std::is_base_of_v<interface1, T1> && std::is_constructible_v<T1>);
static_assert(std::is_base_of_v<interface2, T2> && std::is_constructible_v<T2>);
вместо аргументов шаблона?
И ещё один вопрос. Если я захочу использовать статический полиморфизм вместо динамического, то единственный нормальный способ проверить соответствие "интерфейсу" аргументов шаблона (пока не сделали концепты), это создать такие структуры:
template<typename T>
struct interface1_check
{
static_assert(std::is_class_v<T> && std::is_default_constructible_v<T>);
static_assert(std::is_same_v<decltype(std::declval<T>().method()), void>);
};
(в данном случае тип должен быть классом, иметь конструктор по-умолчанию и метод `method` который без аргументов возвращает `void`)
а затем наследовать эту структуру вот так:
template <typename T1>
class azaza: interface1_check<T1> {...}
?
Просто я не хочу, чтобы ошибки вылезали только когда полиморфный объект будет непосредственно использоваться. Хочу, чтобы всё вылезало ещё при создании класса azaza.
Хотя, ещё можно сделать так:
template<typename T>
struct interface1_check_t
{
static constexpr bool value = std::is_class_v<T> && std::is_default_constructible_v<T> &&
std::is_same_v<decltype(std::declval<T>().method()), void>;
};
template<typename T>
constexpr bool interface1_check = interface1_check_t<T>::value;
template <typename T1>
class azaza {
static_assert(interface1_check<T1>);
...
}
Код выглядит красивее, правда сообщение об ошибке стало похуже.
Наверное гибрид будет самым лучшим решением. Как-то так:
template<typename T>
struct interface1_check_t: std::true_type
{
static_assert(std::is_class_v<T> && std::is_default_constructible_v<T>);
static_assert(std::is_same_v<decltype(std::declval<T>().method()), void>);
//static_assert(std::is_same_v<decltype(std::declval<T>().method1()), bool>);
};
Тогда если будет много методов, можно будет сразу увидеть какой не совпадает.
Нет, я просто изучаю C++ и спрашиваю, правильно я делаю или нет. Вот придумал макрос для определения наличия метода в типе
#define PP_CAT(a, b) PP_CAT_I(a, b)
#define PP_CAT_I(a, b) PP_CAT_II(~, a ## b)
#define PP_CAT_II(p, res) res
#define LINE_NAME(base) PP_CAT(base, __LINE__)
#define HAS_METHOD(type, method, result) \
template<typename, typename = std::void_t<>> \
struct LINE_NAME(m) : std::false_type {}; \
template<typename U> \
struct LINE_NAME(m)<U, decltype(std::declval<U>().##method())> {\
static constexpr bool value = std::is_same_v<decltype(std::declval<U>().##method()), ##result>;\
}; \
static_assert(LINE_NAME(m)<##type>::value);
Теперь можно просто написать:
template<typename T>
struct interface1_check_t
{
static_assert(std::is_class_v<T> && std::is_default_constructible_v<T>);
HAS_METHOD(T, method, void)
HAS_METHOD(T, getBool, bool)
};
и выдаются очень красивые ошибки при несовпадении сигнатуры.
Нет, я просто изучаю C++ и спрашиваю, правильно я делаю или нет. Вот придумал макрос для определения наличия метода в типе
#define PP_CAT(a, b) PP_CAT_I(a, b)
#define PP_CAT_I(a, b) PP_CAT_II(~, a ## b)
#define PP_CAT_II(p, res) res
#define LINE_NAME(base) PP_CAT(base, __LINE__)
#define HAS_METHOD(type, method, result) \
template<typename, typename = std::void_t<>> \
struct LINE_NAME(m) : std::false_type {}; \
template<typename U> \
struct LINE_NAME(m)<U, decltype(std::declval<U>().##method())> {\
static constexpr bool value = std::is_same_v<decltype(std::declval<U>().##method()), ##result>;\
}; \
static_assert(LINE_NAME(m)<##type>::value);
Теперь можно просто написать:
template<typename T>
struct interface1_check_t
{
static_assert(std::is_class_v<T> && std::is_default_constructible_v<T>);
HAS_METHOD(T, method, void)
HAS_METHOD(T, getBool, bool)
};
и выдаются очень красивые ошибки при несовпадении сигнатуры.
Чому? Я "переизобретаю" концепты (которые обещают к C++20), чтобы компилятор не выводил кучу непонятных ошибок при работе с типами из шаблонов.
Пиздец, хотел научиться программировать на C++, а тут такие страшные сообщения.
Это вы так реально программируете?
Нет, это он балуется.
> а тут такие страшные сообщения.
А что там страшного? Алсо, удалось упростить проверку. Теперь она выполняется один раз, а не два как в предыдущем варианте.
#define HAS_METHOD(type, method, result) \
struct LINE_NAME(struct) { \
template<typename U, typename = std::enable_if_t<std::is_same_v<decltype(std::declval<U>().##method()), ##result>>> \
static std::true_type test(void*); \
template<typename> static std::false_type test(...); \
}; \
static_assert(std::is_same_v<decltype(LINE_NAME(struct)::test<##type>(nullptr)), std::true_type>);
я подобную хуету на работе пишу фо фан. Проект маленький, всем похуй, что там я и как хуярю. У меня там модерн С++ курильщика во всей красе, рофл
#define HAS_METHOD(type, method, result, ...) \
template<typename... Args> \
struct LINE_NAME(struct) { \
template<typename U, typename = std::enable_if_t<std::is_same_v<decltype(std::declval<U>().##method(std::declval<Args>()...)), ##result>>> \
static std::true_type test(void*); \
template<typename> static std::false_type test(...); \
}; \
static_assert(std::is_same_v<decltype(LINE_NAME(struct)<__VA_ARGS__>::test<##type>(nullptr)), std::true_type>);
Теперь можно проверять как возвращаемый тип, так и типы аргументов.
HAS_METHOD(T, method, void) // возвращает void, аргументов нет
HAS_METHOD(T, method1, const bool&, int, bool, float) // возвращает const bool&, аргументы int, bool, float
> так и типы аргументов.
Только вот он их почему-то не проверяет, только количество. При этом никак заставить его сделать это невозможно. Видимо какая-то "фича" `declval` либо я криворук.
В реальном коде я и близко к самописным темплейтам не подхожу и считаю их в почти любом проявлении вредными, что они должны быть только в библиотеках общего пользования и самим писать - только схватишь потом, поэтому настоятельно не рекомендую.
Но вот ради прикола и самообразования конечно можно. Например, я реализовал монады на концептах, которые "подключаются" к стандартным вещам вроде std::vector и std::optional. И можно делать вещи вроде
std::vector<int> x {1, 10};
auto y = x >>= [](int x) { return std::vector<int>{x, x*2}; };
Там примерно похожий уровень магии темплейтов, хотя концепты и позволили повысить читаемость.
>Только вот он их почему-то не проверяет, только количество
Посмотри в сторону is_invocable. Если нужны точные параметры, то придётся какой-нибудь трейт писать (или использовать бустовский). Смотри:
https://stackoverflow.com/questions/9065081/how-do-i-get-the-argument-types-of-a-function-pointer-in-a-variadic-template-cla
http://www.boost.org/doc/libs/1_41_0/libs/type_traits/doc/html/boost_typetraits/reference/function_traits.html
Регулярные выражения, совершенно внезапно, могут матчить только регулярные языки. Это ограничение _частично_ обходится разными реализациями, но только частично. Погугли что такое регулярные языки и why you shouldn't parse html with regex.
> The template argument F is a function type, note that this is not the same thing as a pointer to a function.
Видимо проблема в этом. У меня именно ссылка на функцию. А так я делаю так же как и стандартный std::invoke_result из C++17, (только вместо std::declval<Args>()... надо написать std::forward<Args>(std::declval<Args>)... чтобы он prvalue-ссылки не убирал). И даже если заменить мою самописную проверку на `invoke_result`, он тоже работает точно так же неправильно. А именно: все примитивные типы неявно приводятся друг в дружку, а вот типы классов он определяет нормально.
Таки сделал эту хуйню. Кто сделает мне code review? https://pastebin.com/sGCwjXcU
Прикольно писать функции времени компилирования на чистом Си, поскольку фичи С++ не поддерживаются.
TODO: портировать на GCC и CLANG. Сейчас работает только с MSVC.
Добавил поддержку проверки указателей на функции в агрументах: https://pastebin.com/VuaqADVs
А вот с возвращением указателей на функции бида-бида. Если с простыми функциями ещё можно замутить простую предварительную проверку на SFINAE, то вот при возврате указателя на метод класса только вручную писать проверку. Слишком сложно. И так сойдёт.
Что гитхаб? Выложить туда мою библиотеку рефлексии для бедных? Тогда надо ещё поддержку GCC/CLANG добавить (там нужен макрос __PRETTY_FUNCTION__ вместо __FUNCSIG__ и формат функций/шаблонов чуть другой). Ну и тесты + CI. Я вообще гитхабовские библиотеки не скачиваю, если там нет CI.
Конечно нет.
#include <iostream>
class A
{
public:
int foo(double x) {return 0;}
};
class B: public A
{
public:
int foo(short x) {return 777;}
};
int main()
{
B b;
std::cout << b.foo(1.1) << std::endl;
return 0;
}
//8===================================3
Чому этот код у меня выдаёт 777 ? По идее ведь 1.1 - это double, и потому должен вызваться метод класса А. Или если метод с именем foo() найден внизу иерархии наследования, то под него уже подгонится полученный параметр (ну тип 1.1 урежется до 1)? В джаве не так, там аналогичный код вызвал метод суперкласса.
Есть ли специальное выражение, по которому можно это загуглить подробнее?
Вообще http://en.cppreference.com/w/cpp/language/overload_resolution плюс http://en.cppreference.com/w/cpp/language/adl
Конкретно в твоем случае проблема в том что поиск (вообще) происходит по имени, начиная с самого узкого скоупа постепенно его расширяя пока не будет найдено имя. Когда найдено имя, только тогда в текущем скоупе ищется подходящий вариант. Если его нет то поиск прекращается. Тебе нужно или напрямую указывать в каком скоупе искать имя b.A::foo(1.1), или включить функцию суперкласса в скоуп наследуемый класс, добавив using A::foo; где-то среди деклараций методов. Какого хуя так сделано не знаю, может хотели максимально ограничить видимость "по умолчанию" методов классов чтобы не происходило непонятной хуйни с вызовом каких-то странных методов.
кстати, твой алгоритм копирования настолько неэффективен, насколько это вообще возможно.
Да это для лабораторной, там обязательное условие - использование буферной переменной. Хотя я и в полевых условиях делал бы что то такое же, либо memcpy
Не не, 5% выполнения за это задание. Суть всей лабораторной - подготовка различных задач под распараллеливание под openMP
Раз уж занимаешься байтоёбством, то используй c_str и memcpy.
http://ru.cppreference.com/w/cpp/string/basic_string/c_str
strncpy
Windows - Visual Studio
Linux - Qt
Mac - Xcode / Qt
___
Еще можно глянуть CLion, но мне лень и она на java.
Любая, поддерживающая cmake-проекты.
Место для четырех символов.
buffer.reserve(4);
в конструкторе задай
программист без знания английского должен писать только на 1С
Ну тогда к вам, нет! к нам! гвахаха
в JS-петухам
Это копия, сохраненная 31 марта 2018 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.