Это копия, сохраненная 23 мая 2023 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
⚹ https://github.com/sosachbot/cppthreadhat
⚹ Для кусков кода: https://0bin.net/
Ответы на вопросы:
⚹ https://en.cppreference.com/w/
⚹ https://www.cplusplus.com/reference/
Для указателей: ⚹
Прошлый тред: >>2574543 (OP)
Идея вроде правильная и в духе asio, но я что-то туплю и не понимаю как корректно общаться между internsl_thread и внешним пользовательским io_context.
inb4 использовать один из сервисов asio, он не работает нихуя с моим кастомным chardev
я бы поспорил
Спору нет, только работы на плюсах нихуя нет.
Что это вообще под собой понимается?
Алсо какие требы для мидла? Стек допустим Qt.
>Что это вообще под собой понимается?
std::algorithm, unordered_map, stack и какой-нибудь make_heap
> Уверенное
Можешь объяснить исходники STL. Легко читаешь многомегабайтные высеры компилятора при передаче в темплейт неправильного типа.
Если я изучу книгу Майерса по STL будет достаточно?
Я ща живу внутри Qt, потому с STL опыт крайне опосредованный. Стек понимаю что такое, пользовался в литкоде, хеш-мап тоже. Из алгоритмов не помню, пользовался всякими найти первый и тд.
>Если я изучу книгу Майерса по STL будет достаточно?
Если дополнишь парой вечеров дроча cppreference - да.
>Я ща живу внутри Qt
Не пробовал в доме жить? Всяко комфортнее.
>пользовался в литкоде
Вот набей 50-100 мидл задач решённых и будешь вообще молодцом.
Понял, спасибо, пойду конспектить...
На личном опыте я тебе могу сказать, что такое не уверенное знание STL.
Я с уверенностью могу сказать, что в принципе в самой по себе STL для меня нет ничего незнакомого.
Тем не менее, при чтении кода мне частенько приходится обращаться к справочнику.
Но самый прикол, когда я пишу что-то сам. Вот я уверенно знаю, даже помню, что на STL оно в пару-тройку строчек пишется. Сажусь писать и понимаю, что в деталях-то оно работает не совсем так, как я полагал. И опять-таки приходится зарываться в cppreference, подымать свои архивы и книжки, которые когда-то читал, или вообще шурудить по стаковерлоу.
Уверенным знанием я бы назвал такое знание, когда ты способен в голове конпелировать оценить и сопоставить варианты решения задач, а не знание, что на стаковерфлоу есть все ответы.
>>27974
>Если я изучу книгу Майерса по STL будет достаточно?
Нет.
Во-первых, она 2001 года издания.
Во-вторых, она крайне мала по объему.
В-третьих, уверенное знание одним только чтением книжек не приобретается.
Я про С++17 STL книгу его.
В целом обычно я сначала за ответами лезу на сппреф в доку класса, уж только потом на СО.
Сложно реализовать, а инфы мало. Надо разобраться с NAT, да и не сработает, если в сети слишком мало узлов с белым IP.
Можно считать, что у каждого узла есть белый ip. Задача такая. Это мне yggdrasil обеспечит
Сейчас набегут ненавистники пакта.
Компилируют несколько раз, пока бинарники не перестанут различаться.
Если не вышло, откатываются.
>Почему разработчики компиляторов не боятся
Потому что они не макаки, а программисты, код у них под контролем. Если нашли баг, значит исправляют его или обходят. Это работа, страху тут взяться не откуда. Страх, он от неизвестности, когда ты - макака, делаешь сам не зная что, вот и боишься.
Бутстрапинг гугли, ёпта, и вникай как чё делать
>>28347
Этот шарит.
>>28539
А этот - нихуя, у него самомнение ебенистическое, а в реальности пук среньк "как же это я не заметил". Все ошибаются. Различие умного и тупого - умный знает где он может ошибиться и придумывает хитрости, чтобы снизить шанс или рано отлавливать ошибку, а тупая скотина будет стрелять себе в ногу каждый день и "whoops" свой ебучий говорить каждый раз и нихуя не делать для того чтобы вупса этого галимого обоссанного в следующий раз не было или он был бы хотя бы не такой болезненный.
>умный знает где он может ошибиться
Заявление уровня тупой скотины, воображающей себе умных, но конечно неправильно.
>нихуя не делать для того чтобы вупса этого галимого обоссанного в следующий раз не было
Например что? Переписать всё с нуля? Заявление уровня тупой скотины.
Есть такое понятие как целесообразность. Только тупая скотина которая ничего не делает, думает что человек всесилен и может творить что захочет, когда в реальности наоборот, надо делать полезную вещь думать о результате, при ограниченных возможностях, а не фантазировать воздушные замки идеала как это любят делать тупые скоты.
> высокомерие, снобизм, презрение к другим
У плюсовиков это норма?
Или в СНГ только такое
Туземцы практически все такие.
> гордыня, жадность, гнев, зависть, прелюбодеяние, чревоугодие и уныние
У плюсовиков это норма?
Или в СНГ только такое
У меня презрение только к тем, кто сам высокомерен и т. д. по списку.
Но я и не плюсовик, может в этом дело.
Но я не разработчик компилятора.
Так что привыкай, чем быстрее признаешь, что ты макака, которая вместо программирования БОИТСЯ, и вдобавок тупая скотина которая ничего никогда не делала, но любит рассуждать об уме и работе, тем быстрее появится шанс на исправление. Ведь исправление всегда начинается с признания наличия проблем.
>Компилятор плюсов пишут на плюсах.
это не так
пожалуй, все компиляторы с++ единственные из мейнстрим-языков, не написанные методом бутстрапинга, даже экспериментальные, лол
все компиляторы с++ написаны на приплюснутой сишке
что конечно же доказывает убожество этого недоязыка
как так неправда?
подход с++ предполагает что мы используем кодогенерацию в компайл-тайме, используя метапрограммирование на шаблонах, в том числе и при написании разнообразных парсеров
а, открывая код любого компилятора с++ мы видим вручную захардкоженные таблицы по сути своей привет из 60х великий и ужасный компилятор алгола, код тупо приплюснутая сишка
или типа с++ это ведь ооп язык, да?, ну и в принципе архитектура любого хотя бы современного компилятора должна быть тоже ооп - ну там иерархии классов все дела, а видим мы тупо голенькие классики и кучу свободных функций, хе хе
Ты открывал clang?
#define ID1 1
#define ID2 4
#define ID3 6
#define ID4 7
...
#define ID1000 1452
Как с ними работать? Допустим, хочу пройтись циклом:
for (int i = 1; i <= 1000; ++i)
{
foo(ID?i); //<-- как их склеить блять
}
Иначе говоря, мне нужно сгенерировать имя макроса, такое вообще возможно?
Не получится. Всё, что ты можешь сделать - сгенерировать как-нибудь код, заполняющий значениями макросов некоторую коллекцию, и дальше уже работать с ней.
>как их склеить
Склеивает макрооператор ##.
НО! Цикл работает во время выполнения программы, а макросы раскрываются еще даже до компиляции.
В итоге ты можешь склеить буквы ID и букву i, но не значение i.
Чтобы получить то, чево хочешь ты, нужно запилить цикл прямо на препроцессоре.
Что-то подобное есть в boost/preprocessor
https://www.boost.org/doc/libs/1_81_0/libs/preprocessor/doc/
Насколько оно там костыльно сделано и какие есть ограничения я не знаю, читай документацию.
Очередная скриптосвинья не понимает что такое компилируемый язык программирования.
Dlang же
При отсутствии некоторых важных вещей и сердитой дешевизне других, в стандартной библиотеке с самого первого стандарта реализована такая монструозная хрень, как localization library.
Страустпуп более, чем толерантный человек и был таковым , когда это еще не было мейнстримом.
Как дефайны, только в параметры передаются не просто строки, а символы из АСТ
Во-первых, нет, а во-вторых, почему бы и нет, если интересно?
Я люблю запереться в подвальчике,
Почитать кой-какие журнальчики,
Как брунетки ебутся с блондинками,
Обязательно чтобы с картинками,
И надо ли требовать, чтобы все было собрано одним компилятором?
Что-то типа такого?
struct Piss
{
int shit;
bool operator<(Piss* other) {return this->shit < other->shit;}
...
>сортированные контейнеры стл
Например?
>для сортировки объектов
Зачем сортированному контейнеру еще раз сортироваться. Ты не находишь, что это звучит как хуита?
>Какой метод вызывают
Самый пиздатый - вот какой. По умолчанию Quck Sort, по факту как получится, по стандарту - гугли справочник какое O(n) гарантируется, в народе - колхозник, в магазине - продавец.
Зачем (почему) тут делается int queen[9]; и memset(queen,-1,sizeof(queen)); ?
Потому что в C++ массивы не инициализируются
Не сдавайся. В программировании успех определяется усидчивостью, а не использованием примитивных инструментов для гуманитариев вроде петухона.
>Например?
std::set
>Зачем сортированному контейнеру еще раз сортироваться.
А каким образом он сортируется? При добавлении он какое-то сравнение производит. Для встроенных типов его объявлять не надо. Но вот у меня свой всратый класс Моча, как его контейнер будет сортировать? По содержимому байтов? Мне надо чтобы он по одному конкретному параметру сортировал, я для этого могу объявить метод для сортировки и оно так и поступит, а вопрос - как сделать чтобы метод не надо было объявлять?
>Самый пиздатый - вот какой. По умолчанию Quck Sort, по факту как получится, по стандарту - гугли справочник какое O(n) гарантируется, в народе - колхозник, в магазине - продавец.
А квиксорт этот каким образом знает какой объект больше а какой меньше?
Вот в инструкции сказано как с помощью make и cmake собирать, а как блядь указывать компиляторы и все вот это я не ебу
Да это дрочиво согласен. Переходи лучше на питон или js, у нас такой хуйни нет.
Правда там по пути вылезли ошибки вида "ignoring unknown option '-O3'"
Никак, все каждый раз с этим ебутся, открывают документацию к компиляторам и сборщикам, 10 страниц stackoverflow, блоги и форумы 2005 года.
Потому что в плюсах зоопарк компиляторов и сборщиков для разных платформ, нет единой реализации от создателей языка, как в других языках, есть только стандарт.
Я понимаю. Но это же пиздец. Хоть вообще либы не используй. Кому хуже станет, если либа будет подтягиваться почти сама?
>А каким образом он сортируется?
Он не сортируется. При вставке элемент добавляется сразу в нужное место. Это не сортировка, это другое семейство алгоритмов.
>А квиксорт этот
А квиксорт - это просто алгоритм сортировки по умолчанию, еще со времен сей.
>каким образом знает какой объект больше а какой меньше?
Да ебана, че ты хочешь-то, ты можешь внятно сказать?
Хочешь - можешь подменить функцию сравнения на свою.
>std::set
У стд::set например она задается параметром шаблона при объявлении экземпляра.
Сам алгоритм упорядочения (в случае с сетом - вставки нужное место) остается на усмотрение разработчика компилятора. Стандарт требует только заданного O(n).
> Кому хуже станет, если либа будет подтягиваться почти сама?
Либы в плюсах тоже разные. Они могут линковаться динамически и статически, могут быть header-only. Либа, собранная одним компилятором, может не поддерживаться другим. Может быть нарушено ABI. Могут быть разные соглашения о вызовах. На разных платформах либа может требовать разные зависимости, причём набор зависимостей может отличаться от того, как собирали либу. Нет в плюсах такого, чтобы скачал либу, и она бы собиралась и работала везде при любых условиях.
Или может подскажете, он по умолчанию выбрал x64. Так же дает на выбор ARM, ARM64, Win32. А мне надо на линух собрать
Не получится, не хватает универсального синтаксиса со скобочками.
Ну я же выше уже приводил пример. Класс "Моча" с хуйнёй внутри. Хочу чтобы сортировалось по мемберу "говно", но не прописывать Compare для каждого контейнера в который моя двачерская душонка соизволит запихнуть эту мочу.
То что ты пишешь я все и так знаю, ты никак почему-то не адресуешь ответ на конкретный вопрос.
То есть либа кроссплатформенная, получается? Мне казалось, что так не бывает... Ладно, сейчас попробую на линуксе с ней собрать
> ты никак почему-то не адресуешь ответ на конкретный вопрос.
>конкретный вопрос.
>ортировалось по мемберу "говно"
>запихнуть эту мочу
Конкретно говну конкретно моче нет более подходящего места, чем отхожее место. Причем у кого-то там конкретного отхожее место вполне может совпадать с конкретным обеденным столом, дамским туалетным столиком, двачом, землей небой, Аллахой и тп..
>зачем попусту воду гонять.
Зажмотил постов на дваче? Ониж бесплатные, четы жопишься )
>Не знаешь
Еслиб я все знал, я б сидел не тут.
>не прописывать Compare для каждого контейнера в который моя двачерская душонка соизволит запихнуть эту мочу
В моче определи оператор сравнения. Контейнер его сам разыщет.
как я понимаю, дело не в том, что нет сравнивалки для "мочи", а в том что сет будет вызывать дефолтную сравнивалку для T содержащего мочу.
А Анон не хочет всюду писать свой compare.
А теперь представь, что лично ты разгребаешь наследие после этого Онона.
Что там получится, если он вообще не в состоянии внятно задачу поставить, даже если тянут и подводят к ответу?
Чел, ты просто ебаный эгоцентрист.
Нет, непризнанные геннии случаются время от времени, этого тоже нельзя исключать.
Но дело в том, что все простые и гениальные простые вещи, которые доступны одиночкам, все такие вещи уже давным давно написаны. Нынче программирование - это коллективное занятие со всеми вытикающими.
Думал, в сказку попал? Студия кое-как стала 64-битной и теперь может жрать ещё больше оперативки, куда там до полноценной кросскомпиляции для линукса.
Это же студия 10 лет не могла парсить >> в шаблонах?
да
Да, так и надо было, как оказалось.
struct Piss
{
int shit;
bool operator<(const Piss& other) const {return shit < other.shit;}
…
и можно пихать в контейнер и сортируется как надо.
Никто, блядь, не ответил, "олдфаги" хуевы.
Пример: собрана cpr из исходников. Произошла автоматическая установка в /usr/lib или аналогичному пути, который прописан в makefile.
Если выполняю ПО на своём компьютере, то проблем нет. На чужом они есть, т.к. библиотеки нет.
Как принято поступать в данных ситуациях?
Если windows, то как происходит сборка?
ну либо ложишь длл рядом и отправляешь вместе с исходником потребителю
либо статически линкуешься
#include <ctype.h>
#include <cstddef>
int main(int argc, char *argv[]) {
std::byte bt;
return 0;
}
версия плюсов 17, msvc. ЧЯДНТ?
Я же говорю, выставил в проекте 17 плюсы
У меня есть тупое предположение, но вдруг сработает. Попробуй заменить <ctype.h> на >cctype>
У меня работает.
>версия плюсов 17, msvc. ЧЯДНТ?
Проверь, что версия 17 выбрана для всех платформ и для всех конфигураций.
В порядке телепатии - может быть у тебя .c, а не .cpp файл? Хотя, на std:: должно было бы ругаться.
1. Настоятельно рекомендуется объективно оценивать уровень знаний при ответе. Если нет четкого понимания, то лучше воздержаться от публикации поста. 2. "Хотя, на std:: должно было бы ругаться". std - это пространство имён из стандартной библиотеки. В заголовочном файле cstddef определенние типов размещены в пространстве std. Если ты экивоком пытался ему сказать, что лучше использовать using namespace std; - лучше не надо. В крупных проектах стараются избежать неоднозначности и не засоряют пространство имён. 3. Его код нормально компилируется, если использовать флаг -std=c++17. Так и должно быть, т.к. "std::byte is an enum class that was first introduced in C++17". Если флага нет, то компилятор у меня выдаёт ошибку, что std::byte нет в std. И правильно делает.
> Если нет четкого понимания, то лучше воздержаться от публикации поста.
Почему ты не воспользовался своим советом?
>std - это пространство имён из стандартной библиотеки. В заголовочном файле cstddef определенние типов размещены в пространстве std. Если ты экивоком пытался ему сказать, что лучше
Нет, речь шла о том, что компилятор может вести себя по разному, переключаясь между режимами С++ и С
>Его код нормально компилируется, если использовать флаг -std=c++17
Автор вопроса прямым текстом сказал, что он выставил флаг и не компилируется, если бы было как ты говоришь, то вопрос бы не появился изначально за ненадобностью.
Есть определенное количество причин, почему произошла такая ошибка. Например, возможна ошибка пользователя, только думающего, что он установил флаг, но на нее уже указали. Поэтому я привел еще одно возможное решение, потому что он проверяется за секунду переименованием файла. Хотя сразу указал, что оно маловероятно (поскольку в Си не должно быть таких заголовочных файлов - но мало ли, какие баги в компиляторе Майкрософт)
Другие гипотезы проверяются уже не так быстро, потому что скорее всего требуют переустановки компилятора, что может занять полчаса. Майкрософт (по крайней мере, на тот год) известна тем, что опаздывает с добавлением фич из новых стандартов. У анона могла быть установлена версия, где флаг уже есть, а каких-то фич еще нет. Также может быть проблема с неполной установкой, если какие-то заголовочные файлы не видны по ожидаемым путям.
Да, спасибо. Не везде выставил, как оказалось
>Майкрософт (по крайней мере, на тот год) известна тем, что опаздывает с добавлением фич из новых стандартов.
уже не актуально
мимо
Для этого и было написано - на тот год.
Ждут когда снега растают, ЕВПОЧЯ.
Конечно можно, куча header-only либ так делает, ты ее подключаешь типа
#define lib_impl
#include "lib.h"
#undef lib_impl
охуенно придумали. у нас либа конечно хедер онли) заинклюдил и работает))
только если не скопипастил в маин.цпп эти три строчки то иди нахуй - ошибка линковки в хедер онли либе лол
ну хоть с модулями наконец избавимся от этого рака
А когда модули то. Я уже года три про них слышу.
Нужно что-то легкое и нативное - кроссплатформенность идет нахуй - чтобы не отваливалась жепа от списков на 10к элементов, чтобы потом не было ебки с обработкой событий типа днд и буфера обмена. Ну и возможность рисования в области, типа предпросмотр файла сделать или еще че.
Пока думаю по-старинке - инклюд шиндовс и погнали. Какие еще варианты? кто скажет qt у того мать сдохнет
GTK
>Настоятельно рекомендуется объективно оценивать уровень знаний при ответе.
Решительно не согласен.
Моя мотивация писать тут ответы:
1) Систематизировать собственные знания. Записать в явном виде то, что есть в голове.
2) Выявить возможные ошибки и неполноту в своих знаниях. Ответы пишу в расчете на то, что знающие люди поправят, если что не так.
мимо
Ты гений. Надо тоже законом Каннингема пользоваться, а то как дебил пишу вопрос и жду ответа, а надо сразу неправильный ответ давать себе, анонимная борда же.
Да.
Нет, хочу C++ Builder.
Кто-то же должен тут иметь с ним опыт. Уже заебался ждать. Если его никто не поставит, я сам себе поставлю. Я не шучу.
Нихуя ж себе, оно еще живое?
У меня есть опыт. На C++ Builder 6. Мжвячно так-то, но это кастрат и тормоз и я быстро на студию перескочил тогда и больше не возвращался. Кроме годика работы на легаси проекте с кодом на билдере
У меня опыт написания на нём ровно одной лабы на первом курсе. Я ещё охуевал, что там в таблицах перепутаны индексы строк и столбцов, сначала к столбцу обращаешься, а потом к строке.
Живее всех живых. Есть коммьюнити версия и совместимость с Эпплом.
>Я ещё охуевал, что там в таблицах перепутаны индексы строк и столбцов, сначала к столбцу обращаешься, а потом к строке.
>>32048
>C++ Builder
Да, это единственный вариант, был есть и будет. VCL - нативный, быстрый, легкий в разработке. Дальше только MFC, кривожопое говно, от него можно добиться, но нужно много ебаться, не стоит того. MFC годится только для примитивных диалоговых окошек где всё гвоздями прибито, а дальше начинается боль.
Если нужны списки на тысячи, в VCL есть датагрид, я делал еще под ХР искалку файлов на дисках, спокойно показывала все файлы, хоть миллион.
Угу, его возьму. Тем более буст в проекте используется.
Че делат?
Ага. Понял ошибку. Спасибо
>object specified more than once; extras ignored
Такое еще может быть если смешивать release и debug
Или static и DLL
Visual Component Library.
Дефайн/экстерн/статик,твариантов куча.
static constexpr позволяет наебать odr, но работает очевидно только для констант
в остальных случаях поступаешь как с функциями. объявление в .h определение в .cpp я надеюсь ты знаешь как это делается. хотя в этом треде можно ожидать чего угодно..
Понял принял.
В работе нигде, а так баловался при изучении шаблонов. Вроде бы но это не точно используют в качестве замены pimpl.
Я когда-то использовал его, чтобы определять классы с общими операторами и методами, но потом отказался от этих костылей.
И так решаю по одной+ задаче на протяжении месяца, хотелось бы что то чтоб над архитектурой подумать.
Глянь какой-нибудь FOSS проект поменьше.
>Как вы видете прерспективы языка карбон как замены си++?
Ну наверное новый код будет легче писать, но понятное дело никто ничего переписывать не будет, а из беты он выйдет дай бог через лет 5
> если в этом старом крестовом коде текла память, так и в крестово-карбоновом проекте она будет течь
А у него задачах мемори сейф стоит?
> И смысл тогда?
У тебя кроме памяти проблем в мире нету?
> И не будет ли из за этого груза совместимости с крестами этот карбон каким-то ущербным языком
Зависит от разрабов
> ущербным языком, ну типа как тайпскрипт
хуй знает чем он тебе ущербным показался, когда мне приходилось трогать жс, я сразу на тс пересел и чувствовал себя более чем отлично
или у него конкретные траблы есть?
>хуй знает чем он тебе ущербным показался
Мне тоже нравится больше чем жс. Но там некоторые решения продиктованы требованием совместимости с говножсом. Например ввели юнион тайпс, но проверка на конкретный тип вышла какой-то неуклюжей. В языке, спроектированном без оглядки на жс, это выглядело бы не так.
Жс без оглядки на жс тоже был бы охуенным.
Смысл в том, чтобы сделать мемори сейф, не скатывая его до уровня шарпа или жабы по прожорливости и тормознутости.
Очень жаль это слушать, ты главное не унывай
std::string NullString{ "" };
std::string DecryptPassword(std::string& aPassword = NullString);
На stackowerflow пишут, что можно приравнять к std::string()
https://stackoverflow.com/questions/2749471/default-string-arguments
Это выдает такую же ошибку.
По итогу решил это, сделав NullString статической, не понял, как дошел до этого, и не до конца понял, почему у других выходило это делать проще.
Почитал этот тред
https://stackoverflow.com/questions/1059630/default-value-to-a-parameter-while-passing-by-reference-in-c
понятней не особо стало, ну нельзя привязать временное значение к не-константной ссылке, а почему? Просто так решил Страуструп? Окей, ладно. А почему если, если сделать переменную для параметра по умолчанию статической - то все ок ? Поясните, если сможете, или скажите, че читать.
Чего ты хочешь добиться своей конструкцией? почему нельзя так сделать?
Хочу добиться вызова функции с параметром по умолчанию, у тебя просто инициализация одной переменной с помощью другой
скинь сигнатуру функции
все, я догнал что это
Л я чего то не понимаю или хз, у меня таки конструкции с дефолтным параметром строки, да и вообще чего угодно работают
Вижу как очередное надгробие на кладбище продуктов гугла.
Уже 10 лет как советуют передавать по значению, а не по ссылке.
https://stackoverflow.com/questions/10789740/passing-stdstring-by-value-or-reference/10789868
> карбон
Слышал о нём ровно один раз сразу после анонса, когда кто-то прибежал сюда о нём рассказывать.
>не получается вывести русский текст в консоль через setlocale(LC_ALL, "Rus");
Конечно не получается, такой локали/кода нет в NLS API.
https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-lcid/a9eac961-e77d-41a6-90a5-ce1a8b0cdb9c
Я не понимаю, почему он должен быть всратый как раст, почему нельзя оставить нормальный синтаксис? Никакая мемори сейфити не добавится, если писать fn, var и : тип после двоеточия.
Двачую. Если это замена плюсов, то зачем менять еще и синтаксис плюсов?
> всратый как раст,
Выглядит как будто больше го вдохновлялись
а зачем так делать? Потому что вроде читать такое удобнее, а то что тебе придётся на два символа больше писать, думаю не большая проблема
Лучший тред для самого интересного, многофункционального и вечно живого языка в обоих вселенных.
База.
Си можно рассматривать как частично подмножество плюсов. Но си лучше, потому что можно перегружать функции и использовать классы из коробки.
В чем то да, но не абсолютно. Например, никто не напишет в одиночку компилятор Си++, а Си написан и неоднократно. Си проще портануть на новую платформу. Си более простой язык, его быстрее изучить. В нем меньше неявных вызовов, не будет такого, что оператор сложения переопределен и лезет в интернет, меньше порятнок из шаблонов.
Ничем. Си это огрызок от плюсов. Не плюсы хороши, сишка - убога. Плюсы сонечно сами по себе величайший язык, но это не означает что они сравнимы с сишкой как два равноценных языка. Сишка имеет свои узкие применения как кокой-нибудь PowerBASIC, да, для некоторых задач годный инструмант, но не более, до плюсов как до луны раком. Плюсы это универсальный величайший язык покрывающий любые современные задачи, вообще другая вселенная, сравнивают с сишкой только дебилы.
База.
Булькнул крестовик с задворков галактики, но его вспук никто не услышал.
Ебануться, до чего шиза дошла.
Пиши на сях с покерфейсом будто так и надо. Компиляется же, чё.
Ну а какой сейчас рынок для плюсеров, есть ли понимание?
Бустовые сигналы похожи на кутяшные?
Маловато будет. Жабаскриптные макаки нихуя не умеющие больше зашибают.
Для мидла вполне.
Если брать рынок РФ и обычного работягу разраба, то примерно такие расценки я замечал:
До 160 джун/джун+ 160-180 начинающий мидл. 180-210 мидл. 210-250 мидл + 250+ начинающий сеньор. 300+ сеньор.
Если говорим про щабугор, то начинающий сеньор где-то от 400к деревянных. Про мидлов, Где-то от 300.
Но ты ещё должен учитывать, чему ты научишься на текущем месте и сколько это позволит заработать потом.
Тебе уже на отвечали развной хуеты про ЖС и живу, ну как бы всегда( почти) найти ЖС и жаве за выше чем в какой-то вакансии.
Попробуй прососбеситмя и если всё ок будет, может ещё бабок накинут.
И ещё, ты написал, что 5 лет не следил, типа у тебя 5+ лет опыта?
Скрипт с языком программирования несравним. Это еще тупее, чем сравнивать кресты с сишкой. Другой подход к написанию кода, другой менталитет, другая экосистема.
Если сравнение с сишкой может быть по наивности и недостатку знаний, то тащить на сравнение шарпоскрипт это тупосерь чистой воды. Ты же залетный даун, не больше, просто быдло в интернете считающее своим долгом везде залезть куда не просят и насрать потому что безнаказанно.
Скриптомакака не знает и не может знать отличия скрипта от языка программирования, потому что знает только первое. В итоге получается подобное тупое блеяние. Просто съеби на свою скриптопарашу, тут тред крестов, не для тебя сделан. Сказал же - тупая срущая залетуха, нахуй пошел, что еще не ясно-то?
А, понял, ты AngelScript кодерок, случайно зашедший в тред к настоящим программистам. Ну ничего, вот и просветишься.
Вот и пиши на функциональных языках, а не на плюсах.
У меня работает.
А мне надо несколько гб считать
Чтобы выполнить байт-код, его нужно интерпретировать, условно по такой схеме:
> if (x == 0x69) { ... } else if (x == 0x42) ...
Принципиальное отличие от интерпретируемых языков только в том, что не приходится парсить код каждый раз и искать ошибки. Но если JIT не равно скрипт, тогда получается, что и питон вовсе не интерпретируемый язык.
Ты ничего не понимаешь дело совсем не в этом. Тупо одноклеточно в смысле того, что программирование это написание управляющих команд для некоей машины, и скрипт и язык программирования одно и то же. Но такая характеристика бесполезная хуета, толку от неё нет.
Проблема кроется скорее в человеческом факторе, который в свою очередь коренным образом влияет на технические факторы.
Программирование это программирование компьютера, железа. Свойство компьютера в том, что он документирован, фиксирован, открыт, так что программист им управляет посредством программы. А скрипт это виртуальная машина, закрытый черный ящик, про который писатель скриптов ничего не знает, и пишет скрипты наугад, потому что производитель скрипта так сказал, вслепую верит на слово и пишет методом тыка - от обратного чем программы.
Программа пишется когда ты знаешь как работает компьютер и пишешь чтобы он выполнят свои функции таким образом чтобы добиться результата. А скрипт пишется наоборот, имеется способ получить результат документированный производителем скрипта - "заклинание", и скриптовая макака просто пишет это заклинание на веру в надежде получить нужный результат, запускает написанное и проверяет что получилось, если "не сработало", пробует другое заклинание. А программист наоборот, пишет программу заранее зная что она делает, гадать на кофейной гуще нет смысла, само понятие "сработало ли" фундаментально отсутствует в голове программиста, он всё знает что программа делает, и только комбинирует это для получения результата.
Из за этого и выходит например, что макаки всегда плюют на такие вещи как производительность, потребление ресурсов, не потому что они тупые или ленивые, нет, а потому что это скрипт, они сами не знают что пишут, не имеют контроля над тем что сами пишут, поэтому ни о какой оптимизации и речи быть не может. Попытки оптимизации скриптов это то же самое гадание на кофейной гуще получается - просто от балды выдвигается теория от чего проблемы, и соответственно делаются изменения, а потом запускается и смотрится "сработало или нет", на удачу. Это тупой мартышкин труд, никаких гарантий нет что он сработает, и люди ведь не настолько идиоты, они это подсознательно чувствуют, соответственно и отношение наплевательское, никто не хочет работать впустую, делать бесполезное дело в темноте с завязанными глазами.
И это только один пример, вершина айсберга проблем скриптов. В целом. из за непонятности что это за машина под которую пишешь, любой код получается равнозначным. Например, взять объект создать, а потом для скорости передавать его по ссылке, или по значению где он по десять раз будет пересоздаваться каждый раз, скриптовая макака не видит разницы, так скрипт воспитывает, это следствие написание кода вслепую. Вон, в каком-то расте были примеры элементарных функций, но которые можно написать по-разному, и получается одно и то же действие, но генерируемый реальный код различается в тысячи раз по объему. И это еще спасибо что эта хуйня вообще генерирует код, который можно посмотреть потом. А такая хуйня как шарп например, там и кода-то нет, тупо виртуалка работает в риалтайме, в которую не заглянешь.
И вот взять простого человека, с детства натасканного на джаваскрипт, питон и тому подобные скрипты. Этот скриптовый менталитет въедается в мозги, и всё, получается урод, который даже не поймет что такое писать на си например, а будет так же говношлепить скрипты наугад и на си как всегда привык.
Ты ничего не понимаешь дело совсем не в этом. Тупо одноклеточно в смысле того, что программирование это написание управляющих команд для некоей машины, и скрипт и язык программирования одно и то же. Но такая характеристика бесполезная хуета, толку от неё нет.
Проблема кроется скорее в человеческом факторе, который в свою очередь коренным образом влияет на технические факторы.
Программирование это программирование компьютера, железа. Свойство компьютера в том, что он документирован, фиксирован, открыт, так что программист им управляет посредством программы. А скрипт это виртуальная машина, закрытый черный ящик, про который писатель скриптов ничего не знает, и пишет скрипты наугад, потому что производитель скрипта так сказал, вслепую верит на слово и пишет методом тыка - от обратного чем программы.
Программа пишется когда ты знаешь как работает компьютер и пишешь чтобы он выполнят свои функции таким образом чтобы добиться результата. А скрипт пишется наоборот, имеется способ получить результат документированный производителем скрипта - "заклинание", и скриптовая макака просто пишет это заклинание на веру в надежде получить нужный результат, запускает написанное и проверяет что получилось, если "не сработало", пробует другое заклинание. А программист наоборот, пишет программу заранее зная что она делает, гадать на кофейной гуще нет смысла, само понятие "сработало ли" фундаментально отсутствует в голове программиста, он всё знает что программа делает, и только комбинирует это для получения результата.
Из за этого и выходит например, что макаки всегда плюют на такие вещи как производительность, потребление ресурсов, не потому что они тупые или ленивые, нет, а потому что это скрипт, они сами не знают что пишут, не имеют контроля над тем что сами пишут, поэтому ни о какой оптимизации и речи быть не может. Попытки оптимизации скриптов это то же самое гадание на кофейной гуще получается - просто от балды выдвигается теория от чего проблемы, и соответственно делаются изменения, а потом запускается и смотрится "сработало или нет", на удачу. Это тупой мартышкин труд, никаких гарантий нет что он сработает, и люди ведь не настолько идиоты, они это подсознательно чувствуют, соответственно и отношение наплевательское, никто не хочет работать впустую, делать бесполезное дело в темноте с завязанными глазами.
И это только один пример, вершина айсберга проблем скриптов. В целом. из за непонятности что это за машина под которую пишешь, любой код получается равнозначным. Например, взять объект создать, а потом для скорости передавать его по ссылке, или по значению где он по десять раз будет пересоздаваться каждый раз, скриптовая макака не видит разницы, так скрипт воспитывает, это следствие написание кода вслепую. Вон, в каком-то расте были примеры элементарных функций, но которые можно написать по-разному, и получается одно и то же действие, но генерируемый реальный код различается в тысячи раз по объему. И это еще спасибо что эта хуйня вообще генерирует код, который можно посмотреть потом. А такая хуйня как шарп например, там и кода-то нет, тупо виртуалка работает в риалтайме, в которую не заглянешь.
И вот взять простого человека, с детства натасканного на джаваскрипт, питон и тому подобные скрипты. Этот скриптовый менталитет въедается в мозги, и всё, получается урод, который даже не поймет что такое писать на си например, а будет так же говношлепить скрипты наугад и на си как всегда привык.
Что с тобой будет, когда ты узнаешь, что LLVM компилирует C++ в IR байткод...
Если бы он был компилируемым, виртуалка дотнета была бы не нужна. Компиляция для виртуалки это интерпретация.
>Например, взять объект создать, а потом для скорости передавать его по ссылке, или по значению где он по десять раз будет пересоздаваться каждый раз
Скриптомакака (плюсовик) даже не знает, что уже 10 лет как в C++ надо передавать по значению, потому что это лучше оптимизируется компилятором: >>34363
Не удивительно, ведь скриптомакака (плюсовик) застрял в 90-х, не развивается, и магическим мышлением повторяет заклинания, прочитанные им в дидовских книжках, не понимая как работает компьютер.
>Программирование это программирование компьютера, железа. Свойство компьютера в том, что он документирован, фиксирован, открыт, так что программист им управляет посредством программы. А скрипт это виртуальная машина, закрытый черный ящик, про который писатель скриптов ничего не знает, и пишет скрипты наугад, потому что производитель скрипта так сказал, вслепую верит на слово и пишет методом тыка - от обратного чем программы.
[Смеётся по undefined behavior-ски]
Это лишь оптимизация виртуалки. Скорость виртуалки не отменяет что это виртуалка, все проблемы скриптоговна >>35354 остаются, потому что скрипт это скрипт, хоть с медленной скоростью, хоть с более быстрой скоростью, это ничего не меняети к делу не относится. Потому что , как я уже написал >>35354 проблемы скриптов в их фундаментальной природе обратной программам, из за чего отношение писателя скрипта к тому что он пишет диаметрально противоположно отношению программиста к нормальному программированиею.
Смешная С++ макака думает, что понимает, как работает компьютер и что его код выполняется ровно так, как он написал. Типичный плюсовик с повреждением мозга - потом такие начинают писать многопоточный код с этой парадигмой и закономерно обсираются.
Очнись, маня, современные компиляторы, процессоры и системы памяти настолько сложны и настолько преобразуют твой исходный код, что заявлять о "понимании того, как работает компьютер патаму чта я пишу на С++" может лишь полный некомпетентный идиот, коим ты и являешься.
Это было бы отчасти справедливо, если бы мы сидели в Си треде. Но крестомакаки в этом плане ничем не отличаются, они точно так же трясут ящик, переставляют параметры в шаблонах в надежде что ассемблерный выхлоп как-то поменяется. Это если он вообще хотя бы смотрит, что у него выходит.
Он вообще не об этом писал, а о концептуальном отличии подходов труъ-программистов и скриптомакак, но ты, как полагается поверхностой скриптомакаке, даже такую простую мысль уловить не смог.
Да, в этом есть рациональное зерно. Современные кресты больше похожи на жабаскрипт с этими шаблонами и функциональными портянками. Кто такое лепит действительно макаки, ибо это и есть скриптопомои добавленные в угоду современной моде на скрипты. Кресты же не монолит, они так или иначе развиваются и попадают под влияние вебпараши, их превращают потихоньку в подобное. Но это неизбежно ни для кого, и не отменяет всего предыдущего, что скриптами не является. Тут уже просто показатель мультипарадигменности крестов, позволяющих писать и так и так по желанию.
Ну они самые трушные труъ-программисты, трушнее никак.
Понимаю, писал такое. Но такое сгодиться для чего-то простенького, сложнее утилитки или шмапа делать без ООП это изврат.
Так а хули ему на пятилетнем языке писать было, он же не хипстор как современные растоёбы и карбонодебилы, выбрал почти 20-летний проверенный временем язык как полагается и придерживается его.
А лучшая ОС для ПК, самая надежная и распространенная и работающая без пердолинга написана на крестах, потому что может себе позволить.
лучшая система написана на си и это линукс , и в чем проблема сейчас упдейтить код на ++ для линукса?
проблема в том что кресты это перегруженный язык , где так много ненужного кала что майкрософт обратила на него внимания и выкатила дерьмище под названием "КАЛdows" где даже по умолчанию калькулятор за который ты должен платить деньги (потому что виндовс платный, а ты хуй который спиратил) работает так убого что роняется от отрисовки школьного графики "tan(x) * 10"
просто порвало с того что чел написал что ++ лучше чем си xD
> хипстор
> тру программисты
> смузихлебы
> скриптомакаки
Когда этот программист ЧПУ уже успокоится
Начать что-ли по словам посты скрывать
Это буквально ни о чем не говорит. C++ это стандарт, заточенный под абстрактную машину. Естественно его можно компилировать хоть в байт-код JVM, хоть в байт-код питона, во что угодно. Нормальные компиляторы компилируют код на плюсах в исполняемый файл, который можно запустить на реальном железе. C#, Java и прочие JIT-компилируемые языки этого не могут в принципе.
>>35328
Процесс компиляции предполагает интерпретацию входного файла. Будь это исходный код или байт-код для виртуальной машины. JIT-компиляция она на то и Just In Time, что ее приходится производить каждый раз, когда ты запускаешь программу. Да, есть кэширование, но сути это не меняет. Более того, как-то так вышло, что никакая виртуальная машина не обходится одной лишь JIT-компиляцией. Часть байт-кода всё равно будет исполнять интерпретатор. Хз, может ты знаешь почему так. Машинный код, с другой стороны, можно передать процессору без лишних заморочек - и никакой интерпретатор или JIT-компилятор не нужен - он уже готов работать.
>C#, Java и прочие JIT-компилируемые языки этого не могут в принципе.
Что с тобой будет, когда ты узнаешь про AOT-компиляцию...
AOT-компиляция это обычная компиляция. За этим добро пожаловать в C/C++, AOT-компиляция сразу в машинный код, без промежуточных этапов. Поясню на схеме:
Исходный код Java --(AOT)--> байт-код JVM --(JIT)--> машинный код
Исходный код C --(AOT)--> машинный код
> C#, Java и прочие JIT-компилируемые языки этого не могут в принципе.
Ммм, типичный плюсовик-придурок, нихуя не знает и рассуждает с ебалом знатока. Ебальники людей, лет 5 использующих AOT в проде представили?
>Исходный код Java --(AOT)--> байт-код JVM
Придурок, ты хоть доки GraalVM почитай. Компиляция идёт сразу в натив.
Это замечательно, я рад что зумеры догадались, что виртуальная машина - хуета, и изобрели предаварительную компиляцию в машинный код (через костыли, как и всегда). Спрашивается, нахуй тогда нужны ваши джавы, сисярпы и прочий кал, когда есть нормальные человеческие языки, которые умеют в нативную компиляцию с рождения?
Я только что продемонстрировал, что Java, в её исходном виде, и есть "скрипт", в связи с чем и пришлось допиливать костыль в виде AOT-компилятора для Java. Повторюсь, зумеры изобрели нативную компиляцию. Так зачем нужен ваш JIT, напомни?
К сожалению, никому не упал компилятор C++ для JVM. Зато ты можешь скопилировать плюсы под CLR, майкрософт об этом позаботились. Но не растраивайся, ты можешь написать свой компилятор C++ для JVM. Кстати, как думаешь, на каком языке его следует писать?
На расте? На питоне?
>лучшая система написана на си и это линукс
Неверно. Дальше не читал, ты дебил и будешь писать хуйню.
>нормальные человеческие языки
>C++ c рандомными UB из-за нарушения правила 7.6.3.7.2.14.88 швятого штандарта языка (и очередных багов в GCC/шланге)
Ну, тащемта, теперь у тебя есть опция писать на нормальных языках с гарантиями безопасности (и з.п. в 2-3 раза выше), при необходимости перейдя в нативную компиляцию. Так что, ты лучше сам себе задай вопрос, много ли смысла в том, чем ты занимаешься...
...но С++-макакен не ищет легких путей, ему надо тащить свой крест до конца.
Так JIT лучше для серверов и вообще программ, которые запускаются несколько раз. VM собирает статистику использования и оптимизирует неиспользуемые части. Тогда как в C++ у тебя что скомпилировано, то всегда выполняется даже если часто не нужно, и шатает кэш проца.
> Тогда как в C++ у тебя что скомпилировано, то всегда выполняется даже если часто не нужно, и шатает кэш проца.
Што
А массивы для векторизации он тоже в памяти передвигает?
>в C++ у тебя что скомпилировано, то всегда выполняется даже если часто не нужно, и шатает кэш проца.
Что с тобой будет, когда ты узнаешь про PGO-компиляцию...
А то. Например, выкинуть какую-нибудь проверку на NPE, которая никогда не случается (с возможностью восстановления, если она все же случится) и прочие трюки.
JIT вполне может оказаться быстрее AOT компилияции. В мире hft C++ люди глазами смотрят на получающийся листинг, профилируют код и расставляют хинты для компилятора вручную (т.е. такой ручной JIT)
Бинарный код занимает место. Представь себе, что у тебя три функции вызывается. В случае, если ты оптимизированно скомпилируешь только их, они допустим будут всегда в одной странице памяти. Если же ты запускаешь обычный экзешник, они могут быть на большом расстоянии друг от друга, и у тебя будет при каждом вызове выбивать страницу памяти и грузить другую.
Справедливо, я про нее и не знал и никогда не видел такого флага на практике, а за прошлый год собрал не меньше полсотни проектов включая всякие тяжелые от гугла. Так что, верю что где-то в стране радужных коней кто-то секретно ее использует.
ну типа все принялись хуярить метапрограммы на шаблонах. а в компайл тайме это по сути интерпретация кода на псевдофункциональном псевдоязыке. для ее ускорения и собирались прикручивать жит. но хз может их попустило уже
Не похую ли? Разворачивание шаблонов это просто время конпеляции, на конечный продукт не влияет, то о чем ты пишешь якобы должно его уменьшать или что?
Так это не JIT, оно не должно компилироваться во время работы программы. Это просто прекомпиляция шаблонов, по сути дополнительный этап сборки между препроцессором и компилятором.
Да даже архитектура проца. У тебя или собрано под древний проц чтобы везде работало, но медленнее, либо под новейший и на старом не запустится. Не помню чтобы в с++ либах была часто распространенв практика загружать нужную дллку/so с реализацией под твою.
В таких случаях разбивка на подпроекты идет и не надо перекомпилировать вообще все подряд каждый раз. Хуй знает, может актуально для каких-нибудь мастодонтных энтерпрайзов где коду 30 лет и даже с реорганизацией и разбивкой конпеляция конское время занимает, но на крупных проектах где я бывал компилировался только тот проект в пределах которого ты фаршмачишь (и те которые обновились после обновления с репы) и это было быстро на обывчном компе без прибегания к распределению.
Кароч по-моему это не-проблема для большинства кодеров.
Может ли быть такое, что компилятор не может определить, какие именно комбинации шаблонов используются, это выяснится только в рантайме, и вынужден сгенерить все? Пример не смогу показать, слишком сложна.
Не может. И что значит все, перебрать все типы в программе начиная от char? Тогда от void zalupa(auto, auto, auto) уже все обмякнет.
> Тогда от void zalupa(auto, auto, auto) уже все обмякнет.
Еще в 93 году sml не обмякал. Там аннотации типов были исключением, а не правилом.
Ну допустим есть классы для
Base<int, int>
Base<int, float>
Base<float, float>
Base<float, int>
В проге используется только один <int, float>, но прога может быть достаточно сложна, чтобы компилятор это соптимизировал. Ну и комбинаций и параметров может быть больше, что приводит к экспоненциальному росту вроде.
Если используется только Base<int, float>, то будет скомпилирован только Base<int, float>.
> Ну допустим есть классы для
> Base<int, int>
> Base<int, float>
> Base<float, float>
> Base<float, int>
В каком смысле они "есть"? Если они есть в коде, все четыре будут скомпилированы.
Ну допустим написана реализация для всех этих комбинаций, но реально используется только одна.
Если ты имеешь ввиду что-то типа
> void f<class T>() {...}
> int n;
> std::cin >> n;
> if(n) f<int>(); else f<float>();
То скомпилированы будут оба экземпляра. Но ты написал
>>36570
> В проге используется только один <int, float>, но прога может быть достаточно сложна, чтобы компилятор это соптимизировал
Это невозможно. Компилятор должен чётко знать, какие параметры ты подставил. Это нельзя перенести в рантайм. Примеры с auto тоже мимо. Тип переменной объявленной через auto тоже определяется при компиляции.
Нет, скорее я имею в виду такое:
f<int>() {...}
f<float>() {...}
#ifdef I
f<int>();
#elifdef F
f<float>();
#endif
Можно и не на уровне макросов, а чего-то с наследованием.
Тут бы явно JIT помог, т.е. не надо компилировать f<int> если она не используется.
> Нет, скорее я имею в виду такое:
> f<int>() {...}
> f<float>() {...}
> #ifdef I
> f<int>();
> #elifdef F
> f<float>();
> #endif
> Можно и не на уровне макросов, а чего-то с наследованием.
> Тут бы явно JIT помог, т.е. не надо компилировать f<int> если она не используется.
Конкретно в твоем примере с макросами - да, оба не скомпилируются, максимум один из них.
Я хреново объясняю и мне трудно придумать наглядный пример.
Допустим так
funcA() { f<int>(); }
funcB() { f<float>(); }
int main() { funcA(); }
Разве компилятор может скипнуть компиляцию funcB() и f<float>?
А причем тут он? Я про стандарт или что-то такое. К тому же это упрощенный пример, речь о программах в 100 раз сложнее и перепутаннее, когда оптимизатор крякает и машет рукой.
Может, но не факт, что станет. А может и факт, надо курить стандарт.
Во всяком случае, JIT здесь ни к селу, ни к городу.
Можно выбрать только одно? Компиляторы соблюдающие стандарт не?
Я не очень знаю шаблоны.
Я знаю что компилятор не скомпилирует
void foo1() { куегкт; }
void foo2() { return; }
int main() { foo2(); }
Но вроде бы в случае шаблонов это не всегда так и он не обязан убедиться что весь код компилируется?
SFINAE всякие
Компилятор соберёт все, а потом линкер, исходя из опций, может дропнуть ненужное.
Не думаю что стандарт вообще что то гарантирует в этом направлении.
Сфинае просто не дропнет компиляцию на этом типе и начнет подставлять другие, насколько я ее понимаю.
Компилятор может выкинуть твою функцию, а может и не выкинуть. Но если функция некорректна с точки зрения языка, компилятор все равно ругнется. Даже если она нахер не нужна.
qt-быдлокодер
Кратким гайдом ты не отделаешься.
> Традиции
this
>>37534
К сожалению только через кровь и пот, мне вот это выступление оч помогло понять как писать MORE MODERN CMAKE
https://www.youtube.com/watch?v=y7ndUhdQuU8&ab_channel=MeetingCpp
Функция сама по себе разве не указатель?
Указатель это отдельная переменная. Имя функции это не переменная. Ты путаешь указатель с адресом, это разные вещи. Вызов функции это переход по адресу. Вызов через указатель, это переход по адресу находящемуся в переменной указателя, тут добавляется извлечение адреса из переменной перед тем как переходить.
>Вызов через указатель, это переход по адресу находящемуся в переменной указателя
Ну так указатель не обязательно должен содержать адрес имени функции. Что ему мешает содержать точно тот же адрес перехода, что и само имя функции?
Аналогия. Можно объявить указатель на указатель, это добавит уровень косвенности. Но можно сделать копию указателя и уровней косвенности не прибавится.
На примере условного ассемблера.
В процессоре есть регистр IP, указывающий на адрес выполняемой инструкции.
При вызове функции, в IP загружается адрес, на который прыгнуть (а в стек сохраняется адрес текущей инструкции) точнее, следующей за ней
IP = 0xE301
При вызове по указателю, мы прыгаем не на адрес переменной, а на адрес, хранящийся в переменной.
То есть сначала надо прочитать память по адресу переменной, а потом прыгнуть на адрес, хранящийся в ней.
Это и есть 1 уровень косвенности.
TMP = 0xD020
IP = [TMP] //напр., 0xE47F
Алсо, описание inline в старых книжках устарело.
Краткая история Inline примерно такая:
Разрабы компилятора: добавляем inline, чтобы тело функции включалось в место использования, наподобие макроса.
Разрабы программ: о, хренак, добавим везде inline, быстрее будет же еба
Реальность: теперь везде стало медленнее, потому что компилятору ничего не получается оптимизировать
Разрабы компилятора: отключим инлайн, теперь он необязательный, но добавим флаг force inline
Разрабы программ: о, хренак, включим везде этот флаг, быстрее будет же еба
Реальность: стало еще хуже.
Разрабы компилятора: ... отключаем inline нафиг.
В современном С++ inline не означает подстановку функции. Компилятор может сам оптимизировать подставив функцию, даже не inline, а может не подставлять inline функцию, а вызывать ее обычно.
В первую очередь inline теперь означает, что у функции может быть несколько определений в нескольких файлах, а не только одно, как обычно. Впрочем, они обязаны быть идентичными, иначе это Undefined Behavior.
https://en.cppreference.com/w/cpp/language/inline
>адрес имени функции
Бессмыслица. Имя функции не существует, поэтому адреса имени быть не может. Имя это и есть сам адрес - число. Имя словом нужно только в исходном коде, потому что слова проще воспринимать, чем числа, но в реальности это число, адрес.
Таким образом, указатель (переменная) и так содержит адрес функции, больше в указателе и нет никакого смысла. Можно конечно туда заносить другие числа и переход случится уже не туда, но это не важно. Важно, что без указателя нет переменной, есть только адрес - число. Везде где в исходнике написано имя функции, в коде получаются числа, один и тот же адрес натыкан везде:
>код 123 код код 123 код 123 код 123
А переменная это переменная, ячейка памяти со своим содержимым, для использования которого нужно выделить память и иметь код который к ней обращается и извлекает сожержимое. Без переменной (указателя) нет никакой ячейки памяти и нет кода обращения к переменной, происхотят прямое обращение, а с переменной непрямое, а только через переменную-посредника.
>Но можно сделать копию указателя и уровней косвенности не прибавится.
Дело в том, что у тебя уже есть указатель и 1 уровень косвенности.
В случае вызова функции, у тебя нет косвенности, уровень 0-й.
>Функция сама по себе разве не указатель?
нет. Так как тут речь о инлайне - то функция - это кусок памяти где-то в пердях бинарника, у этого куска памяти есть адрес. Прямое Обращение по адресу (то есть вызов функции) - это просто джамп в те перди. При этом все джампы компилятор раставит, процессор уже знает куда прыгать. У него просто такая инструкция - перескочить вон туда.
А вот указатель на функцию - это вообще отдельная переменная выделенная в оперативной памяти. Вот она тоже хранит адрес. НО - когда ты вызываешь по ней то сначала так:
- сначала ищется этот указатель в оперативке
- читается адрес
- компилятор прыгает по адресу
То есть два дополнительных действия.
Кстати именно поэтому полиморфизм влияет на производительность - так как это тоже указатели на функции.
Да не забивай себе голову... в с++ дохулион всяких нюансов. не просто так же говорят что его можно изучать 20 лет и нифига не узнать. А самый прикол что многие нюансы еще и успевают потерять актуальность, или обрастают новыми костылями
Просто держи в памяти что указатель на функцию чуть медленее вызова. Но это мизер на который должно быть пофиг в 99% задачах.
>в с++ дохулион всяких нюансов
Это база которую обязан знать, а вовсе не какой-то левый нюанс. И 20 лет ни при чём, ты это должен знать в самом начале, иначе ты сам не понимаешь что пишешь, на этом весь язык основан.
если в методе с ним кинуть ексепшен дебаг абрт ловлю, даже не смотря на трай.
это значит что пока ты в этой функции ты не имеешь право кидать эксепшен
если же ты решил его кинуть, моментальный аборт
поэтому ты даже попытаться внутри неё что то словить не имеешь права
На самое главное то не ответил
>нахуя он нужен
Потому что так быстрее, компилятор может более круче за оптимизировать твой код
Плюс облегчает некоторое написание кода, когда ты например точно знаешь что мув конструктор никогда не кинет эксепшен
иди изучать
Потому что эксепшены НЕ НУ Ж НЫ, но гомогеи их пропихнули, но олды оставили флаг что б собирать без ентого говна.
Семантика.
Посмотрел бы я на тебя, когда тебе надо с файлами работать и кучу операций делать. Использовать исключения - хуйня. Оборачивать каждую строчку в иф и раздувать код в 2 раза - отличная идея
Эх, вот бы можно было написать zero-cost объект-обертку с optional<result, error>...
Нет.
Язык такой, чтобы он мог одинаково работать на любой платформе. За это приходится платить пресловутыми уб. Замени все уб в стандарте на что-то конкретное, и потеряешь в эффективности, так как отдельные реализации языка будут вынуждены соответствовать этим дополнительным требованиям, даже если это особо никому не нужно, и у компилятора будет меньше возможностей оптимизировать код.
Справедливо.
>Так как тут речь о инлайне
С инлайном понятно.
У него (у Мейерса) сравнивается передача в алгоритм указателя на функцию VS функциональный объект. Кроме трабблов с инлайном, я цветом выделил еще один тейк, что якобы указатель на функцию дает больше уровней косвенности, чем функциональный объект.
Я себе это представляю как ленту, поток инструкций.
>- сначала ищется этот указатель в оперативке
Ничего специально не ищется. Поток выполнения доходит до указателя. Указатель - это адрес, по этому адресу совершается переход. В точности та же картина, что и
>функция - это кусок памяти где-то в пердях бинарника, у этого куска памяти есть адрес. Прямое Обращение по адресу (то есть вызов функции) - это просто джамп в те перди
И там и сям один джамп, если указатель указывает на адрес тела функции, а не на адрес, содержащий вызов функции. В общем случае и не обязательно такое место даже есть в программе. Вот допустим функция foo() вызывается только по указателю, но нигде не вызывается "прямо". Куда в таком случае указывает указатель? Только сразу на тело функции он и может указывать. Или что, компилятор отдельно где-то в коде генерит операцию тру-вызова функции и указатель направляет на операцию вызова, но не сразу на тело.
Что мне не понятно.
Зачем делать через жопу, как все тут настаивают, когда есть очевидный способ сделать не через жопу?
>В С++ структуры и классы эквивалентны, кроме доступа по умолчанию.
А в чем тогда смысл? Если по чистому коду модификатор доступа все равно надо прописывать?
А нет его, смысла.
Просто делай как все и используй стракты для чего попроще и классы для чего посложнее.
Смысл в совместимости с сишкой.
>по чистому коду модификатор доступа все равно надо прописывать?
В Комитете засела нечистая сила, вот и лоббирует всякое.
В каком-то подвале собрались. Не могли нормальное помещение арендовать?
Бичёвский комитет для бичёвского языка.
>Язык такой, чтобы он мог одинаково работать на любой платформе.
Только тут адово противоречие, из-за уб он никогда не будет работать одинаково на любой платформе.
Походу хуелевое возвращает. Возвращает просто размер найденного по ключу объекта деленный на размер объекта? Чи да?
Вернёт количество объектов по ключу.
>А есть компиляторы, в которых на нормальном языке объяснят, что делает метод?
Тебе чтоб шаблончики разворачивало и разжевывало?
ИДЕшки вроде даже бесшаблонные функции только по самому минимуму показывают, тут от аффтаров зависит если каменты завезли, тогда видно и понятно что к чему.
К СДЛ каментоф нет, четай РТФМ (вроде cppreference.com)
Ясно, спасибо. Здесь вам не тут конечно.
Если не допускать уб в коде, он гарантированно будет работать на любой платформе. С поправкой на средства, которые заявлены в стандарте как implementation defined. Например, платформа не обязана поддерживать intX_t типы.
Я вообще не понимаю, почему все форсят, что уб это "рандом". Конечно можно говорить, что сложно не допустить ошибку в коде из-за человеческого фактора, но это никакой не рандом. Если понимать, что ты делаешь, и читать документацию, то всё будет работать как надо.
Алсо реквестирую самый ебанутый и неочевидный по вашему мнению пример уб.
>самый ебанутый и неочевидный по вашему мнению пример уб.
Добавляешь такой без задней мысли конструктор из std::initializer_list и {}-инициализация в казалось бы хорошо протестированном коде начинает играть новыми красками, которых никто не предвидел.
Формально не ub, но хрен редьки не слаще.
Ну, честно говоря, это как написать
2 + 2 × 2
и удивляться, почему получилось 6, а не 8. Не в том смысле, что это глупая ошибка, а в смысле что претензия необоснованная.
> не ub
Вот именно.
Чёт не понял, в чем проблема?
В том что {} интерпретируется как лист инициализации, а не вызов конструктора?
В том, что такой конструктор на хую вертел правила разрешения перегрузки.
Когда он есть - это одно, когда его нет - другое. Но в обоих случаях компилятор молча компилировает.
Это все можно отладить, когда он изначально предусмотрен. А если добавлять в существующую кодовую базу - пойди перелопать весь код, где твой класс использовался.
>>39823
Мое почтение, если для тебя это как 2 + 2.
Если тебе он нужен, но переписывать всю кодовую базу не хочешь, почему не сделать так:
T::from_init_list()?
> Мое почтение, если для тебя это как 2 + 2.
Я и говорю, что дело не в сложности, а в том, что принцип тот же. Язык сложный, кто ж спорит.
> В том, что такой конструктор на хую вертел правила разрешения перегрузки.
На самом деле там просто у initializer_list приоритет выше.
> А если добавлять в существующую кодовую базу - пойди перелопать весь код, где твой класс использовался.
Вот это, кстати, по делу, универсальная инициализация это такое себе решение.
720x720, 0:09
> CONAN 2.0
Они на фулл ебале все рецепты просто поломали?
Find{PackageName}.cmake просто нигде не работает
Ни бусты, ни фмт, ни гтест
И что, пару лет ждать пока дяди захотят в своих проектах сборку переписать?
Vcpkg
С некоторых пор инициализацию можно производить с помощью {}. Например вот так:
int x{666};
Для чего это нужно? Компилятор путал T x() с объявлением функции в .h, насколько я понимаю.
Вроде все хорошо. Но теперь рассмотрим вектор:
vector<int> x(10,2);
vector<int> x{10,2};
Что мы хотим? Вызвать конструктор, который создаст 10 элементов и заполнит их значением 2.
В первом варианте так и будет.
Но во втором конструктор списка инициализации возьмёт верх и создастся вектор[ 10,2].
Вот и вся проблема. Про это нужно просто знать.
Поправьте если не прав.
Ох, лол, даже не подумал бы. Спасибо за объяснение, мне просто в голову бы не пришло второй вариант с такой мыслью использовать.
>Вызвать конструктор, который создаст 10 элементов и заполнит их значением 2.
Нет, не хотим. Это API одно из самых больших ошибок в истории с++.
>Алсо реквестирую самый ебанутый и неочевидный по вашему мнению пример уб.
a + b
Как все уже поняли, недостаточно просто написать
sum = a + b;
Ведь при переполнении это UB.
Понятно, но наверное можно же проверить?
sum = a + b;
if(a + b > INT_MAX) error();
Стоп. Так условие же никогда не выполнится из-за переполнения.
Да и это уже целых 2 UB
sum = a + b;
if(sum < a) error();
Ну не, так не выйдет, ведь UB уже произошло, компилятор имеет право выкинуть всю проверку.
Ладно, шутки в сторону, давайте проверим заранее. Так, а что писать?
(a + b < INT_MAX) мы уже пробовали. (Ахаха, подловил. Надо писать не меньше, а меньше или равно) А, точно.
if(a <= INT_MAX - b)
sum = a + b;
else error();
Так, пагадите!
Что-то тут не так.
Допустим у нас a < 0 и b = 0
И мы только что (наберите воздуха в грудь), во время сравнения
Вычли с underflow.
Минус сколько-то минус макс_инт меньше чем влезает в инт.
Переполнение в другую сторону, тоже UB
Переписываем нахуй
if((b > 0 && a <= INT_MAX - b) ||
(b < 0 && a >= INT_MAX - b))
sum = a + b;
else error();
Скобочки посчитали? && и || не перепутали?
Вот теперь заебись!
И это крестобоги должны писать вместо каждого сложения в программе.
Ассемблерный выхлоп показывать не буду. Чтобы ночных кошмаров не было.
P.S. Бонусный трек
#include <climits>
#include <iostream>
int main() {
std::cout << INT_MIN << '\n';
std::cout << INT_MIN / -1;
}
Что там за знак должен быть у второго числа, ну ка?
>Алсо реквестирую самый ебанутый и неочевидный по вашему мнению пример уб.
a + b
Как все уже поняли, недостаточно просто написать
sum = a + b;
Ведь при переполнении это UB.
Понятно, но наверное можно же проверить?
sum = a + b;
if(a + b > INT_MAX) error();
Стоп. Так условие же никогда не выполнится из-за переполнения.
Да и это уже целых 2 UB
sum = a + b;
if(sum < a) error();
Ну не, так не выйдет, ведь UB уже произошло, компилятор имеет право выкинуть всю проверку.
Ладно, шутки в сторону, давайте проверим заранее. Так, а что писать?
(a + b < INT_MAX) мы уже пробовали. (Ахаха, подловил. Надо писать не меньше, а меньше или равно) А, точно.
if(a <= INT_MAX - b)
sum = a + b;
else error();
Так, пагадите!
Что-то тут не так.
Допустим у нас a < 0 и b = 0
И мы только что (наберите воздуха в грудь), во время сравнения
Вычли с underflow.
Минус сколько-то минус макс_инт меньше чем влезает в инт.
Переполнение в другую сторону, тоже UB
Переписываем нахуй
if((b > 0 && a <= INT_MAX - b) ||
(b < 0 && a >= INT_MAX - b))
sum = a + b;
else error();
Скобочки посчитали? && и || не перепутали?
Вот теперь заебись!
И это крестобоги должны писать вместо каждого сложения в программе.
Ассемблерный выхлоп показывать не буду. Чтобы ночных кошмаров не было.
P.S. Бонусный трек
#include <climits>
#include <iostream>
int main() {
std::cout << INT_MIN << '\n';
std::cout << INT_MIN / -1;
}
Что там за знак должен быть у второго числа, ну ка?
В какой раз здесь это постят? Раза три точно было.
Идея в использовании некоторого конструктора, принимающего n T, который можно "спутать" со списком n[ ].
А крестовики-то оказывается складывать не умеют!
Наверное есть еще более питоническое выражение. Я когда пытался скриптовать мелочи по работе, чтоб плюсы не елозить каждый раз, быстренько питонить начал, так я и охуел от того сколько там "питонических путей", не сочетающихся с плюсовым прямым текстом.
Плохо себе представляю, зачем это может понадобиться. Со своими типами - просто делаешь дефолтный конструктор.
Ок, справедливо. Но даже если бы переполнение гарантированно работало по принципу кольца, всё равно проверка на переполнение будет неудобной и неочевидной, по аналогичным причинам.
Выглядеть будет примерно так (поправьте меня, если я ошибаюсь):
int c = a + b;
if (a < 0 && b < 0 && a + b >= 0 || a > 0 && b > 0 && a + b < 0) ...
Спасает от этого, если уж нам так нужна проверка на переполнение знакового целого, только флаг переполнения, который есть в x86 архитектуре, например. Но я как-то не слышал, чтобы такого рода проверки были доступны хоть в каком-то высокоуровневом языке программирования. Вроде бы в некоторых языках при переполнении выбрасываются исключения. Но это уже минус эффективность, и в большинстве случаев не нужно, потому что зачастую можно изначально предусмотреть ограничения для входных значений, в зависимости от задачи. Конечно, это ответ в духе НИНУЖНА, но всё-таки.
З.ы.: переполнение беззнаковых целых это well-defined behavior, кстати.
Мне кажется переполнение не должно работать по кольцу. Должно устанавливаться максимальное/минимальное значение.
Или вообще вводить для int подобие nan.
Но это усложнение ради усложнения. Хз где это реально нужно.
Я больше скажу, с типом сложнее char не сработает. С интом - если только нулями заполнить, потому что memset побайтовый. То есть тебе нужно, условно, это:
02 00 00 00 02 00 00 00 02 00 00 00 ...
А с мемсет ты получишь это:
02 02 02 02 02 02 02 02 02 02 02 02 ...
Извращенец...
>a > 0 && b > 0 && a + b < 0)
По моему, UB позволяет выкинуть компилятору эту проверку, потому что "так не бывает и не может быть никогда".
Это называется saturation и вполне много где используется, например в шейдерах, в GPU, и даже в FPU.
Например, если ты складываешь два цвета, у тебя компоненты RGB не должны быть больше 255 и т.д.
Это я к тому, как пришлось бы писать проверку, если бы переполнение не было УБ. А конкретно, если бы была гарантия, аналогично той, которая есть для беззнаковых:
INT_MAX + 1 == INT_MIN
INT_MIN - 1 == INT_MAX
std::check_integer<int> a = INT_MAX;
try {
a += 10;
} catch (const std::check_integer<int>::overflow_exception &e) {
std::cout << "std is simple :)" << std::endl;
}
Не добавят, ведь на какой-нибудь никому не всравшейся архитектуре с шестиразрядным байтом это будет сложно запилить.
Но к сожалению он окажется несовместимым с unordered_map и rangev5b1, так что придется писать свои контейнеры.
В плюсы уже как-то добавляли фичи из boost, так что не проблема
>В новом стандарте c++34 добавят
В C++37 добавят
std::is_overflow_flag_set_besplatno<T>
А в C++40 переделают на
std::some_fucking_template<std::bez_sms>(std::is_overflow_flag_set_besplatno<T>)
Я про этот доклад, но не знаю какой прогресс с того времени
https://www.youtube.com/watch?v=ARYP83yNAWk
Еще есть такой прошлогодний, но я его не смотрел еще
https://www.youtube.com/watch?v=ELeZAKCN4tY
Для олдфагов похую, т.к. легася дальше одиннадцатых плюсов выкатится к концу века, для ньюфагов заебись, т.к. они и так этот юзинг всегда писали.
Ну а че, стандартная библиотека, давно пора было уже, в чем проблема?
Ну так, надо чтобы у крестовиков всегда работка была.
Никогда такого не было и вот опять.
>зато, кажется, вижу garbage collector?
В C++11 появились какие-то там средства для поддержки самостоятельной реализации сборщиков мусора. Но позже, толи в 17, толи в 20 их выпилили, т. к. никто ими не пользовался.
Ну вот пока ты думал что это мем, Херб Саттер просто разъебал всех своим Cpp2
Справедливо
Вопрос: что если я добавлю новые элементы - как сделать чтобы компилятор сразу завизжал что срочно надо вносить изменения?
А то бывает так - добавлю float f3.. А где-нибудь в ебенях кода забуду его использовать, и получится херня как на второй пикче
должен же быть какой-то механизм? А то это же буквально выстрел в колено уровня голых указателей.
Пока что делаю так static_assert(sizeof(Foo) == 8, "Foo changed!!!");
Но это говно (особенно из-за размера указателей, лонгов и т.д.), так как оно мне говорит что я изменил класс Foo, но оно мне не говорит - куда я теперь должен бежать в коде чтобы внести правки. И я-то вспомню что я должен тут сделать. А джун Вася просто напишет 12.
В чем проблема написать это static_assert(sizeof(Foo) == 8, "Foo changed!!!"); внутри operator==?
И почему не говорит куда? Есть же какой-то макрос писать текущую строку.
А комментарий писать пробовал? Что при измененнии надо не забыть исправить то и то.
Но вообще ты хочешь что-то вроде рефлексии в компайл тайме и посчитать поля, Да еще и посчитать чтобы каждое из них было сравнено.
Даже не представляю как это может выглядеть на плюсах
https://stackoverflow.com/questions/45820379/get-the-number-of-fields-in-a-class
Может быть кто-то может написать такую многостраничную конструкцию, возможно с использованием буста и рефлексии, чтобы получить все поля как tuple и обращаться к ним по порядку... Кажется в расте есть макросы для чего то подобного...
Я бы наверное сдался и может быть максимум сделал кодогенерацию, чтобы operator== генерился по описанию структуры.
У тебя только тривиальные типы? Вот еще нагуглил что-то про c++20 дефолтные операторы сравнения, может можно просто написать что то вроде
bool operator<=>(const Foo& left, const Foo& right) = default;
https://en.cppreference.com/w/cpp/language/default_comparisons
>>40613
Вот интересная простыня про рефлексию:
https://stackoverflow.com/questions/38217459/accessing-list-of-fields-and-types-in-a-class-in-c
Disregard that I suck cocks, это вообще не то что он хотел.
- работать с docx файлами(Microsoft Word). DuckX не подходит - проект заброшен и редактировать текст очень сложно
-склонять слова по падежам(Морфер платный)
Тут какой-то сакральный смысл который я не выкупаю?
Тут вроде норм расписано. Если делать pop возвращающий ссылку, то она будет вести вникуда, объект то выкинули, плюс может быть исключение.
https://stackoverflow.com/questions/25035691/why-doesnt-stdqueuepop-return-value
Девиз Страуструпа - "сделай сам!".
Минимальный интерфейс для воплощения твоей фантазии есть.
>взять и убрать в одно движение помимо упомянутого способа
Такой поп требует копирования, не всем оно надо.
>>40683
Кажется я пони. Но почему бы не заиметь метод popCopy() который будет сразу возвращать копию? Кому надо - тому одна строчка
>auto c = q.popCopy();
вместо
>auto c = q.front();
>q.pop()
У меня сильно чаще бывает что я использую то что попнул. А если не надо то те могут использовать старый добрый поп.
инб4 зделой сам
а фронт+поп типа не требует лол
выше правильно пояснили что основная причина - безопасность исклбчений. теоретически для типов с ноексепт мув конструкткором можно было специализироваьт. хотя это кринж хуже вектора булов когда у очередей для разных типов разные наборы методрв
>а фронт+поп типа не требует лол
Фронт + поп - это две разных операции.
Если не оставить "чистый" поп, то появятся вопросы "где чистый поп, нахой?!".
Если фронтПоп сделать рядом с имеющимися фронтом и попом, то получается дублирование функционала, что тоже не очень.
>Если не оставить "чистый" поп, то появятся вопросы "где чистый поп, нахой?!".
Оставить. Никто не предлагал его удалять.
>Если фронтПоп сделать рядом с имеющимися фронтом и попом, то получается дублирование функционала, что тоже не очень.
Когда это кого-то останавливало?
>push_back
>emplace_back
>основная причина - безопасность исклбчений
STL проектировали когда еще исключений-то толком не было.
Это побочный эффект, а не причина.
>для типов с ноексепт мув конструкткором можно было специализироваьт
Перемещение не со всякой реализацией очереди совместимо. Бывают очереди, которые одну и ту же память гоняют по кругу пока ее хватает, т. е. даже после попа эта память все еще лежит на совести очереди.
>STL проектировали когда еще исключений-то толком не было
а не пиздишь ли ты мне?
какая нах разница че на чьей совести лежит. во время попа так и так вызывается деструктор. и для мувед-фром объекта это тоже валидная операция
А нахуя гарбаж коллекторы то нужны? Смарт птр не доставляют?
Ой бля, копал в ту степь, имхо проще скрипты на питоне написать и биндинг сделать.
пчел только не говори что не понимаешь разницы между вызовом деструктора и освобождением памяти..
очереди абсолютно похую лежат в ней указатели или инт64, она не владеет ресурсом по указателю. или хз может ты имел в виду умные указатели. хотя тогда все равно неебу в чем ты тут видишь проблему
Ни в чем, я спросонья не разобрался и реально задал вопрос о том, что будет.
В случае если Т, то д-тор будет вызван. Если Т*, то не будет.
Немного по-разному, как я понимаю.
> Если Т*, то не будет
будет но деструктор не Т а Т⚹
только он ничего не делает с объектом на который указывает
> а фронт+поп типа не требует [копирования] лол
Нет, фронт возвращает ссылку, поп ссылку возвращать не может.
По-моему оно даже не скомпилируется. Как оно будет сравнивать меньше-больше? Вот дефолтный operator==, даже без явного default, в этом случае будет работать.
Так компилится и работает.
Но офк лучше самому прописывать. Это чудо будет ВСЕ подобъекты сравнивать.
> Как оно будет сравнивать меньше-больше?
Трёхстороннее сравнение, из него любой оператор выводится.
Ты не понял, по какому принципу оно будет возвращать "меньше" и "больше", если там два инта? У тебя в коде operator<=> не используется, кстати.
>У тебя в коде operator<=> не используется, кстати.
Грубо говоря, <=> преобразуется в любую операцию сравнения.
Опять не понял. Что вернёт это?
K{1, 2} <=> K{2, 1}
"Меньше" или "больше"? Сам бы проверил, но пока нет возможности)
А, я не заметил там <, сорян. Всё еще не понимаю, как оно по дефолту работает.
Вопрос был не об этом. Как оно сравнивает? Сначала первый инт, потом второй, или как?
Обращайся ещё.
Я пока пример писал сам запутался и сидел тестил.
Спасибо.
Умел через костыльное дополнение.
Сейчас поднимаешь подсистему луникса на локалхосте и конпеляешь "удаленно" через свою же студию.
Анончик, миленький, помоги, пожалуйста.
Как вытащить стринг из lParam в сообщении WM_SETTEXT?
У меня вытаскиваются вопросы только, видимо что-то с кодировкой или хз.
Хэлп, плиз, с меня тонны нефти.
>У меня вытаскиваются вопросы только
Кодировка, очевидно.
Кури маны по касту из чарпойнтера в вайд стринги (скорее всего оно) либо анси.
Там вряд ли вопросы. Посмотри в отладчике или напечатай конкретные байты. А вопросики у тебя появляются когда ты уже пытаешься выводить где-то , например в консоли.
>Кури маны по касту из чарпойнтера в вайд стринги
Винда уже 20 лет как юникодная (вайд стринг), так что кастить в вайд не надо, там и так всё в нём. Кастить надо как раз наоборот в анси чар, только вопрос - нахуя?
>Винда уже 20 лет как юникодная (вайд стринг), так что кастить в вайд не надо, там и так всё в нём.
Это если тот кто месседж шлет его в вайде присылает. Никто не мешает и в анси заслать, да хоть в кои-7р. Неясно же что там задававший вопрос дебажит.
У меня просто профдеформация с легасями, потому о такой хуйне думаю, скорее всего ты прав.
>Это если тот кто месседж шлет его в вайде присылает. Никто не мешает и в анси заслать, да хоть в кои-7р
Еще раз, WM_SETTEXT это сообщение winapi, там уже 20 лет всё нативно юникодное, иначе не бывает, винда так написана.
>легасями
Какая разница легаси-хуегаси. Программа может быть говнокодом c char, но винапи всё равно юникодное, char вызовы конвертируются в юникод под капотом, потому что винда работает только с юникодом. Я хуею, 20 лет юникод, а до сих пор не знают, это какой то сюр.
>Еще раз, WM_SETTEXT это сообщение winapi, там уже 20 лет всё нативно юникодное, иначе не бывает, винда так написана.
Лел. Я сам могу этот WM_SETTEXT послать и заполнить его кракозябрами с бнопнёй. Я не спорю что если у него что-то современное и нормально написанное, то там юникод.
>Программа может быть говнокодом c char, но винапи всё равно юникодное, char вызовы конвертируются в юникод под капотом, потому что винда работает только с юникодом
Ничего она не конвертирует, что послал, то и получил. Я буквально сейчас это для лулзов проверил, в сендмесседже в лПарам скармливаешь чарпоинтер с чем хочешь и имеешь результат, оно ничего с ним не сделает. Все зависит исключительно от того что за код.
Да, винда работает с юникодом, а вот говнокод легасёвый с чем угодно.
Давай прекращать этот бессмысленный срач, ты не неправ и я согласен с тем что ты говоришь потому что в основном оно как ты говоришь и работает.
да я сделал уже на питоне склонение по падежам, только не нравится, что нужно питон ставить на ПК конечному юзеру
Ну и, кстати, для оптимизации тоже, даже если меньше/больше не нужны. Например, если в структуре два поля, одно из которых примитивное, а у другого операция сравнения затратная, то имеет смысл сравнивать их начиная с первого, потому что тогда второе придется сравнивать только если первое прошло проверку.
Ладно, наверное я про какие то сложные случаи не подумал, типа сравнение месяца раньше чем сравнение дня.
Два указателя.
Ни к чему.
Просто буду держать в голове, используя этот оператор, что с указателями могут случиться приколы.
Нет никаких приколов, указатель это переменная с адресом ячейки в памяти. Операторы сравнения сравнивают адреса. Сам объект нужно доставать явно через * или ->
Наверное у меня из за магнитных бурь сегодня голова плохо варит. Ты в обоих случаях сравниваешь указатели по <, просто в одном случае определил сам оператор <, а во втором <=> который сам определил <
Да, но обычно хочется сравнить то что находится по указателю.
Я почему-то сначала подумал, что раз это всё такое умное, куча кода генерируется, может оно и с указателями что то придумает, но нет. Это противоречило бы философии языка.
А, ну раз ожидаешь, то ты дальновидный здравомыслящий человек, желаю чтобы говно пореже встречалось и пусть тебе улыбается этот колобок, понял?
> Почему в классе GameBoard работает cout?
Потому что ты вызываешь функцию дебаг что то там
> Типо заголовки действуют на весь проект чтоли?
Нет, только там где заинклудил их
> А если есть прагма уанс, то будет работать только один заголовок, если указаны одинаковые в разных файлах, чи да?
Не уверен что правильно понял вопрос, но да
>Нет, только там где заинклудил их
у меня нет iostream в gameboard, почему там тогда работает cout?
Потому что ты заинклудил его в хэдер
Ты знаешь как инклуды работает? Он тупо берет контент ил хедера и вставляет полностью в cpp файл
Скорее всего потому что у тебя нет разделения объявление - определение, и когда ты инклюдишь gameboard.h в main все нормально, ведь iostream уже подключен.
Абсолютно бесплатно, не надо открывать исходники, можно продавать, лишь бы линковался динамически.
Пидора ответ.
Я, например, нетолько под винду прогаю. Что теперь? Нет, хуета ваш Qt, потому что не опенсорс и лицензия хуеввая.
Как уже выше писал, лучше SDL нет ничего. Но надо ручками поработать и самому написать для интересующей платформы
Есть же фри форк кути.
Зачем SDL? Есть же именно гуй-либы в таком случае.
Nuklear, ImGui, RmlUI (реинкарнация libRocket)
Можешь еще тут покопаться, может что то подберешь
Конечно под твои требования они может и не попадают, в смысле там предпросмотр придется самому прикручивать, как и просмотр 100к записей.
https://philippegroarke.com/posts/2018/c++_ui_solutions/
Ты то? Возможно.
Штука которая тебе позволяет намного легче гарантировать эксепшен сейфти в тех же контейнерах
скуычик, рвэлью семантика уже с 11 года в плюсах, просыпаемся
суть в том, что потом этот метод будет в наследниках переопределяться, для получения нужного размера массива, выделяемого на стеке, соответственно всё должно быть вычислено на этапе компиляции
Звучит как говнокод.
Так это вроде аналог virtual только компайл-тайм.
Чёт я не догоняю, как это должно работать. Он же не может в компайл-тайме знать, какую функцию надо вызвать, а значит и длину массива он может узнать только в рантайме. Как это должно работать?
схуяли не может, он во время компиляции не знает что компилирует? после составлении таблиц виртуальных методов, он не может обратиться к ней и разрешить свои вопросы? то что функция виртуальная не означает того, что компилятор не знает её определение, это значит только то, что он не знает её определения до определённого этапа сборки
Ты создаешь массив векторов? Ты точно понимаешь, что ты пишешь? Возможно, вы имели в виду vector.push_back()?
>char вызовы конвертируются в юникод под капотом, потому что винда работает только с юникодом.
Как оказалось, не только. Можно создать окно, которое поддерживает юникод. И которое не поддерживает. Признак поддержки можно проверить с помощью IsWindowUnicode. Мое окно не поддерживало, а строка шла в юникоде в сообщении. И винда сама подставлял вопросы. От такая хуйня.
Можно, но это не натив. Неюникодные приблуды это костыли поверх юникода винды, легаси-совсместимость с Win9x, 20+ летней давности.
>И винда сама подставлял вопросы.
Если юникодные символы не соответвуют кодировке локали установленной в винде, естественно будут вопросы, ибо это невалидные символы в анси.
да, понимаю, нет, не имел
чтобы не делать вектор векторов, когда количество векторов известно заранее - это количество элементов в перечислении конкретного наследника
new, delete, куда уж проще. Сложности только отследить когда ты уже удалил, а когда еще нет, но это уже не проблемы шерифа.
>Сложности только отследить когда ты уже удалил, а когда еще нет, но это уже не проблемы шерифа.
Чел… Именно для этого и сделаны смартпойнтеры.
Поясняю. Вот есть плашка памяти на 4гб. Ядром она мэпится в 64разрядное виртуальное адресное пространства. Вот и получаем 64битные адреса. Так как значение любого конкретного типа на стеке занимает sizeof(T), void * вообще нельзя сложить с инетом, а указатель на defined тип при инкремента (на 1) увеличивает адрес на тот же sizeof (T)
Я обнаружил, что дашчан у меня не забанен, а даже когда клаудфлёр меня пропускает, капчи тупо нет, и пасскод видимо заблокирован, в шизотреде поорал немного, и короче я может прошлый тред смотрел, но у меня сложилось впечатление, что в крестотреде любят Винду и указатели обсуждать, так что решил разогнать несанкционированный митинг
Оборудование Пермского Государственного университета
Он не знает динамический тип объекта в компайл-тайме. Допустим у тебя в Base виртуальный constexpr метод GetParametersCount, в Derived он переопределён. Функция виртуальная, поэтому то, какая из функций вызывается, будет известно только в рантайме. Как компилятор вычислит длину массива во время компиляции? Я так понял, код по типу:
struct X {
virtual constexpr int foo() const {
return 5;
}};
constexpr X x;
static_assert(x.foo() > 3);
будет работать. Но схуяли это (по твоему примеру):
struct X {
virtual constexpr int foo() const {
return 5;
void bar() {
static_assert(foo() > 3);
}
}};
должно работать?
А нахуя нужны НЕ опенсорс либы, ебло? Их нельзя портировать куда хочешь и модифицировать как хочешь. Хуйня без задач вообщем.
Конечно не нужны, ебло. Поэтому нужен Qt.
Смысл выебать твою мамашу.
ныа
https: //www.qt.io/offline-installers
https: //github.com/qt/qtbase
он опенсурс
если ищешь что то кросплатформенное то можешь чекнуть lazarus это паскаль / делфи , его изи компилить с СИ/++ кодом , а если прям так важно СИ/++ то glfw / sdl2 + какойто api для создания гуи , ну или можешь сам на байтоебтить гуи , но я сомневаюсь что он будет не всратый
Нах ему отвечать, он же троллит тупостью.
Если обсуждать нестандартные варианты, то можно взять Годот 3. Он кроссплатформенный, на опенжл, не очень тяжеловесный, ~40 Мб (можно ужать если скомпилировать без 3д - некоторые используют для утилит, например визуализации деталей на станке), но в нем можно собрать неплохой гуй, есть свой скриптовый язык в духе питона, а поскольку сам движок написан на с++, то интеграция с с/с++ нормальная. Можно дергать с++ либы, дллки и так далее, а можно наоборот, из с++ кода вызывать API движка.
(4 версию брать не надо, она сырая и на вулкане, не везде работает)
Спасибо. Уже сделал. Можешь возращаться под шконарь соевик.
так компилятор для каждого конкретного наследника может вычислить virtual constexpr функции в компайл-тайме, затем для базового класса в его базовые функции подставлять вычисленные ранее виртуальные константные, и сделать несколько дубликатов базовых функций под все варианты вычисленных, а при вызове в рантайме смотреть на реальный тип объекта, и вызывать соответствующую ему базовую функцию. Для этого понадобиться, чтобы базовые функции, использующие внутри себя virtual constexpr функции также были virtual, но впринципе это возможно.
надо дождаться с++23 чтоб полирнуть сверху еще deducing this и вообще охуеть заживо
Сделай доброе дело, дай спокойно котику отъехать в кошачий рай и возьми из кошачного приюта беспризорного котенка.
На корм хватает - хватит и на палиативные уколы.
Только сегодня читал.
Жесть какая-то. Причем как оно работает так и не понял. Типо можно сгенерировать автоматически для всех cv-ref функции?
Я так понял, можно те же cv-ref квалификаторы указать явно в параметре с this, либо написать шаблон функции, который сам будет определять cv-ref объекта:
template <typename T> void f(this T &&self)
Окей, я понял, как это работает, но теперь я не понимаю, почему
> Для этого понадобиться, чтобы базовые функции, использующие внутри себя virtual constexpr функции также были virtual
Что мешает аналогично сделать дубликаты невиртуального метода?
ну вроде как если метод невиртуальный, то у него однозначно задан указатель, однозначный указатель не вяжется с неявными дубликатами, которые сгенерит компилятор
А, понятно. Видимо эффект от этого ровно такой же, как если бы я вручную перегрузил эту виртуальную функцию в каждом наследнике с нужными поправками. Да, всё логично.
: Base(std::move(rhs)) // good, calls Base(Base&& rhs)
{
// Derived-specific stuff
}
А что, так можно чтоли?
rhs ведь в первую очередь перемещается, как тогда инициализировать Derived-часть, если rhs уже в измененном состоянии?
Мне кажется, Base(Base &&rhs) затронет только ту часть rhs, которая относится к Base. Если только ты сам не выстрелишь себе в ногу. Так или иначе, то, как изменяется состояние перемещаемого объекта зависит от твоей реализации. В принципе, может и не поменяться. А если нужно обратиться к данным, которые ты уже переместил, то можно через this.
Сложно сказать. Какой распиарят. Cpp2 напрямую конвертится в с++, мне это по нраву, значит можно работать с кодом дальше, что там в карбоне не знаю.
В человеческих языках подразумевается другой гейт. Когда нужно логическое "или", пишут "и/или".
мимо душнила
Не знаю, мне такая путаница с кодом не нравится. Я предпочитаю считать с нуля, использовать "или" как дизъюнкцию и быть буквальным.
Предлагаю не менять "или" и оставить его дизъюнкцией, а для "исключающего или" использовать "либо".
Кодь на стеке.
Pragma once не стандарт. И хотя она работает, наверное, уже везде, это все же не абсолютно портируемый код, хотя и тривиально заменяемый.
Я бы, наверное, писал так:
#pragma once
#ifndef HEADER_GUARD...
#endif
Тогда те компиляторы, в которых реализована #pragma once, оптимизируют сборку и не будут подгружать файл лишний раз, но и любой кастомный компилятор, который точно соблюдает стандарт, сработает правильно, проигнорировав незнакомую прагму, но исполнив указание препроцессора. Конечно, он скорее всего будет работать чуть медленнее, по честному подключая и анализируя файл.
Спасибо.
Что не так с вашим языком? Внимание на 18 строчку. Если вместо (tmp.size() - k <= 0) написать (tmp.size() <= k), то будут просто разные, сука, ответы. Оба неправильные, кстати, очевидно из-за этой же проблемы, потому что C++ считает, что 5 (длина "three") меньше либо равно чем -1 . Менял на length - без разницы. Чего это говно от меня хочет-то?
И я там сознательно сначала строчку считываю, а потом M. Потому что там ещё одну свинью подложил мне этот язык замечательный, с которой мне лень разбираться на этапе самостоятельного тестирования программы.
size() беззнакового типа, поэтому нельзя его сравнивать с отрицательным. Кастуй в знаковое целое.
че за упражнения такие?
Долбоебы
Кто рекомендует? Может имеют в виду что при вкатывании в плюсы ты узнаешь и си на энтри левеле? Тогда правильно. Иначе хуета какая-то получается. Знание Си тебе может дурную службу сослужить, особенно сейчас если вкатываться в кресты.
Во-первых, ты ошибся тредом, на С++ не пишут как в Си.
Во-вторых, пользуйся инструментами, которые покажут тебе ошибки.
Потому что в плюсах используется тоже что и в си
Желательно и ассемблер знать на базовом уровне
Наоборот, Страуструп НЕ рекомендует. Потому что ты потом так и будешь строки по байтам перебирать кривыми циклами.
>на С++ не пишут как в Си
На С++ пишут как позволяет С++, это мультипарадигменный язык, позволяет писать по разному, и естественно сишная парадигма имеется.
А можно встать на стол и насрать на него, но в приличных местах так не принято, хотя возможность имеется.
Ты же программист, думай! Ты можешь сначала перевернуть стол вверх ножками.
Потому что иначе потом будешь жаловаться, что не понимаешь указатели. Как минимум, чтобы понять, чем ссылки отличаются от указателей, нужно понимать, что такое указатель. А чтобы их понять, фактически придётся писать на Си.
Типо знать, что это объект, который содержит адрес в памяти другого объекта - недостаточно?
Ну по факту люди очень часто пишут, что не понимают указатели, это уже мем. Если начинать изучение плюсов с самих плюсов, очень легко запутаться. Потому что параллельно с указателями ты будешь учить ссылки, причём любые курсы по плюсам затрагивают эту тебе поверхностно, потому что это легаси и нинужна.
двачую
еще формальную логику в общих чертах, и электронику немного, ну и квантмех хотя бы раздел про полупроводники и металлы
В учебнике плюсов от Стивена Праты вполне подробно разжевываются указатели и ссылки, кроме него я учебников не читал, да и не нужно, т.к. есть cppreference, стековерфлоу и двач, инфы навалом чтобы узнать как положено.
Защитил докторские по квантмеху и математике, можно приступать к плюсам, или рано еще?
Только если это твои прикладные области
блять неужели в 2023 базовые знания ассемблера это что то удивительно
У него C++11 рассматривается отдельным небольшим приложением в самом конце книжки. Та же фигня и со стандартной библиотекой.
Всю книгу он по сути рассказывает про си с классами.
Ну сейчас уже книга не актуальна наверное, я читал когда еще С++03 был.
Она как бы намекает тебе, не пользуйся этим дырявым апи...
Пользуйтесь простыми советскими текстовыми редакторами с подсветкой синтаксиса.
И cppreference.com
ты долбоеб? IDE подсказывает ровно то, что в коде написано.
Не кочайте посоны у меня брат запустил эту дрянья и до сих пор выйтить не может.
она и не такое умеет
В студии не работал, но в QtCreator стрелочками можно все определения конструкторов/функций посмотреть, мне кажется анон сам не то выбрал.
В студии тоже, но нихуя, это именно студия мне открыла на варианте номер 5. Причем в шарпе я такой хуйни не встречал.
А зачем
@
ПЕРЕВОРАЧИВАЕШЬ
@
САДИШЬСЯ
@
БОЛЬНО
@
> После сидения на полу конечно в шокиславе от подобного.
Нунинада нунитраль
assert(2["pizda"] == 'z')
>Ну это уже джаваскрипт какой-то пошел.
Ну, глядя на этот код, я бы все же ожидал 1,2->2,1.
Но я уверен, что есть ботан, который сможет пояснить, что tie сработал правильно, и по стандарту и должно быть 2,2.
lsp тормозное говно. Переходи на eglot.
Не знаю. Как проверить?
В самих tie и tuple, вроде бы, не написано ничего про undef/unspec. Что еще может быть? Точка следования? Вроде не.
Какой тип у {b,a} я не могу понять. Это вроде не initializer list.
Если переписать через std::tuple то пишет нормально 2,1
Вот интересно я сейчас смотрю в годболт, он пишет что если через std::tie(a, b) = std::tuple{b, a};
std::tuple<int, int>::tuple<int&, int&, true>(int&, int&)
std::tuple<int&, int&> std::tie<int, int>(int&, int&)
std::enable_if<(__assignable<int, int>)(), std::tuple<int&, int&>&>::type std::tuple<int&, int&>::operator=<int, int>(std::tuple<int, int>&&)
А если в первом случае через std::tie(a, b) = {b, a}; то
std::tuple<int&, int&>::tuple<true, true>(int&, int&)
std::tuple<int&, int&> std::tie<int, int>(int&, int&)
std::tuple<int&, int&>::operator=(std::tuple<int&, int&>&&)
Что это значит tuple<true,true> чет не вкуриваю.
> Не знаю. Как проверить?
Только курить документацию на миллион страниц(
> В самих tie и tuple, вроде бы, не написано ничего про undef/unspec.
Это не обязательно должно быть указано явно. Насколько я понимаю, порядок присваивания не уточняется, поэтому с тем же успехом могло получиться "1, 1".
> Какой тип у {b,a} я не могу понять. Это вроде не initializer list.
Скорее всего, того же типа, что и левый операнд, то есть std::tuple<int&, int&>
> Если переписать через std::tuple то пишет нормально 2,1
С неявными параметрами получится std::tuple<int, int>, это не то же самое.
Я пробовал и std::tuple<int,int>, и std::tuple<int&, int&>, оба выводят нормально 1,2
> порядок присваивания не уточняется
ты имеешь в виду, что получается что-то вроде
⚹a = b
⚹b = a //но мы уже проебали значение, поэтому у нас тут уже a == b
Я еще попробовал с несколькими, но понятнее не стало.
При этом в case 2 ты спокойно попадешь, if(0) тут не повлияет.
Ну выход из скоупа будет, но это ни на что не виляет. Ну типа ты не можешь обратиться к переменной, если бы ты объявил ее внутри скоупа.
Также нельзя обрщаться в необъявленной переменной. Но если state объявлена вне свитча, то все ок.
По сути это такой goto на метку.
> Я пробовал и std::tuple<int,int>, и std::tuple<int&, int&>, оба выводят нормально 1,2
В смысле 2,1? То есть местами меняют? Лично у меня пикрил. Если у тебя не так же, то получается, что это как минимум implementation-defined.
> > порядок присваивания не уточняется
> ты имеешь в виду, что получается что-то вроде
> ⚹a = b
> ⚹b = a //но мы уже проебали значение, поэтому у нас тут уже a == b
Да, а если точнее:
⚹(&a) = ⚹(&b); ⚹(&b) = ⚹(&a);
либо
⚹(&b) = ⚹(&a); ⚹(&a) = ⚹(&b);
> Нах так делать, в чем сакральный смысл? Я не понел.
Как зачем? Узнать, насколько глубока кроличья нора :)
Вот что я нарыл
template< class... UTypes >
tuple& operator=( const tuple<UTypes...>& other );
(3) For all i, assigns std::get<i>(other) to std::get<i>(*this).
Ну т.е. я так понимаю что с точки зрения стандарта поведение полностью defined, просто ты как бы написал цикл где перезаписал значение предыдущим.
Да, охуенно. И в каком порядке оно assigns? От порядка и зависит, будет "1, 1" или "2, 2" в пресловутом примере.
Чёт с if-ами только хуже стало, по-моему, уж лучше бы дублировал. Хотя, с большим объёмом кода может быть и по-другому. А так-то оба варианта говно, есть способы написать то же самое получше.
Согласен, но другого ответа я все равно не нашел.
Почему 2 пикча не работает а 3 работает? Я в глаза ебусь, видимо, но разницы не вижу.
Может быть есть какое-то правило, которое говорит, что если речь идет об "for all i", то это перебор от 0 до max.
Внатуре, тоже чуть мозг себе не сломал
Чел, ты понимаешь что такое упрощенный пример? Например, там будет 'a', 'b', d', и 1, 13, 17.
Не говоря о том, что там в реальности будут какие нибудь TCPPacket, UDPPacket, и т.д.
На С++ пишут как позволяет С++, это мультипарадигменный язык, позволяет писать по разному, и естественно сишная парадигма имеется.
2. Можно ли вкатиться джуном на удалёнку?
3. На какую ЗП можно рассчитывать? А если искать работу на запад?
4. Имею 3+ года опыта работы на жс и почти 400 решённых задачек на литкоде (все на плюсах). Это же хоть немного баллов мне добавляет?
ты лучше 90% червей в этом треде, успокойся, зарабатывай свои 3к$ на чиле правя скриптики js
Да не, плюсы я ещё с универа полюбил, а до этого ещё в школе сишку трогал. Так сложилось просто, что в веб проще вкатиться было. Но на плюсы никогда не забивал особо, то Мейерса почитал, то про многопоток, то про шаблоны, то Qt c пингвином трогал. И сейчас как раз с проекта попёрли и кажется что пришло время что-то менять.
Надоели уже эти жсоны. Хочется чем-то более серьёзным и надеюсь что интересным заниматься.
Не стоит, JS будет прибыльнее и работы больше. На крестах удаленки впринципе практически нет.
>Что нужно знать/уметь чтобы вкатиться на джуна
Пройди пару собесов и охуеешь с того насколько мало нужно знать
>На какую ЗП можно рассчитывать? А если искать работу на запад
Сильно зависит от фирмы. В дс думаю 70-150к
>Имею 3+ года опыта работы на жс и почти 400 решённых задачек на литкоде (все на плюсах). Это же хоть немного баллов мне добавляет?
Бля как можно в 3 годами идти на джуна. У меня всего 2 года опыта, я себе еще 2 в резюме накинул и пошел отсобесился на сеньора. До сеньора не дотянул но выбил что-то среднее между мидлом и сеньором, при том что сам я тупень пиздец. Сейчас зп ~280к
>Бля как можно в 3 годами идти на джуна. У меня всего 2 года опыта, я себе еще 2 в резюме накинул и пошел отсобесился на сеньора. До сеньора не дотянул но выбил что-то среднее между мидлом и сеньором, при том что сам я тупень пиздец. Сейчас зп ~280к
А потом удивляемся говнокоду и спагетти, когда такие сеньорят.
>посложнее
Ладно, попробуй отсобеситься. В РФ вакансий на плюсы достаточно, можешь просто парочку самых неинтересных отобрать и сходить туда. Я тут репортил свои приключения с собеседований, вопросы на джуна, мидла и сеньора отличаются слишком незначительно. Честно у меня скорее складывается ощущение что по этой специализации есть недостаток кадров, поэтому требования снизились
>>46998
Бля да кому не похуй, я через год пойду еще пособеседуюсь. Главное что продукт я делаю, доставляю в сроки, и с командой общаюсь хорошо, а на всякие там метрики кода мне похуй по большей части, за это не платят
да хотя бы потому что в коммерческой разработке с++ не используется, все пишут на приплюснутой сишке, то есть делают вид что у них типа с++, особо наглые заявляют шо у них 14 17 20 стандарт (подставь нужное), а на самом деле в кишках все таже дрисня из циклов и ифов прямиком из 60х в стиле алгола (не алгола 68, а первой версии)
открой исходный код любого компилятора с++ и убедись что никаким с++ там и не пахнет
Зачем заглядывать в код компилятора, который начат писаться давно, когда можно заглянуть в любую современную либу которая на 14/17/20? Естественно никто не бросатся сразу переписывать вообще все.
ПИШЕШЬ КОМПИЛЯТОР С++
@
НА САМЫХ КАНОНИЧНЫХ С++
@
ВСЕ ЧЕРЕЗ ШАБЛОНЫ, МЕТАПРОГРАММИРОВАНИЕ И КОНСТЭКСПР
@
ВО ВРЕМЯ КОМПИЛЯЦИИ ИНСТАНЦИРУЕТСЯ ДАЖЕ НЕБО, ДАЖЕ АЛЛАХ
@
В ИСХОДНИКАХ ЗАРОДИЛСЯ СИЛЬНЫЙ ИИ
Чё то будто на сениора, или это я свабый?
>Зп да, у меня уже 3года джуновская
И щас окажется что "джуновская зарплата" это 250 тысяч, а я как лошара мидлом с десятилетним стажем зарабатываю втрое меньше почему-то.
я не верю, что человек с 10летним стажем в ОЙТИ может зарабатывать 83к рублей.
Когда у меня было 10 лет (2 года назад) - я под 700-800к в месяц на руки получал.
Откуда? Как? Я таких зарплат даже близко в вакансиях не видел, ты я не верю твоим словам.
Мне больше не предлагают, вот за такое и работаю. Есть кодеры получше, получают побольше. Знакомый йоба-кодер сеньор получает 250, в это я верю, но и то это звучит как уже с напрягом.
Почти миллион ничья работа не может стоит, это звучит как пиздёж.
Ну это реально. Да, ты можешь на побольше претендовать.
>когда можно заглянуть в любую современную либу которая на 14/17/20
Так там то же самое. В лучше случае, одна фича уровна auto. Про шаблоны вообще молчу.
template<size_t _N>
class ZalupaBase
{
public:
using int_type = uint32_t;
private:
int_type _array[_N];
};
И я хочу, не меняя ZalupaBase, сделать так, чтобы в child-классе(ZalupaFinal) можно было изменить int_type, который используется в ZalupaBase...
template<size_t _N>
class ZalupaFinal : ZalupaBase<_N>
{
public:
using ZalupaBase<_N> = uint64_t;
};
И это не работает
>using ZalupaBase<_N> = uint64_t;
using ZalupaBase<_N>::int_type = uint64_t;
я имел ввиду это. Т.е. поменять int_type base class-a
Как ты его хочешь менять, если он у тебя в шаблоне гвоздями прибит? мимо шарпист, который не ебет в шаблоны.
Блять, да причем тут шаблоны?
Если убрать шаблон ничего не поменяется, я все еще не могу поменять вот этот int_type для baseclass-a.
>как изменить тип не меняя тип
ну ты уже определись
если я правильно понял че ты делаешь то int_type надо занести в шаблон
То есть ты говоришь то, что в статически типизируемом языке нельзя поменять тип переменной после её определения это пиздос?
Ну пиздос.
Сам кресты знаю на уровне недотрейни, т.к. в универе что-то было, но офк есть понимание программирования в принципе и смежных технологий.
Как-то советовали начать сразу с Майерса и Саттера и шлифануть имплементацией супермарио, но звучит как рофл.
Хочу как минимум освоить для себя, в идеале - сменить стек и компанию и делать чот на плюсах. Подводные?
>Подводные?
Отсутствуют. Сам перекатился из макакинга в CV-шника в обсерваторию в Гейропку. 0 сожалений.
Или чат гпт стал рынок так шатать
>тяжело ли
Если для себя, то уровень тяжести ты сам себе подбираешь.
>сразу с Майерса
Не, никак. Это не учебники по языку, это советы для практикующих и хохмы для теоретизирующих. Толк от Майерса будет, если у тебя под рукой есть свой проект, где ты мог бы его советы сразу применять на натуре. А просто так Майерса читать - это..., ну это типа за все хорошее и против всего плохого.
Но можешь сам попробовать, благо книжки у него небольшие по объему.
>Подводные
Работа у тебя программирование и хобби тоже программирование будет.
>Это какой то троллинг
Тех писак, которые спустя n лет сформировались как полноценные программисты, а не как вротендеры-самозванцы тянет к истокам. Не вижу ничего плохого.
Как смотрят на то, что на крестах нет коммерческого опыта, когда стек меняешь, какие есть пути? Вроде писали, что условный ЯНДЕХ берет условных джавистов/etc, лишь бы шарил в алгосах и компутер сайенс, а с плюсами на месте разбираешься.
Вижу такое:
1) Устроиться в парашу ради коммерческого попыта крестов, чтоб потом съебать в топы.
2) Устроиться в топ на свой стек и внутри мувнуться на кресты
3) Устроиться в топ на кресты с понижением(на джуна, лал)
4) Без задней мысли найти компанию которая готова взять на сеньора с учетом что ты готов запотеть и быстро вкатиться в нью стек.
>>47763
То есть без анального Шилдта/Праты никак.. пойду штаны подтягивать и доставать с полки, хуле.
5) Освоить базовые и менйстримные вещи, написать 0-2 пета, вылизать их, нарисовать 1.5 года опыта и вкатываться на мидла.
>Пройди пару собесов и охуеешь с того насколько мало нужно знать
Ну напиши список того, насколько мало нужно знать. Чтоб перед собесом хоть немного морально готовым быть.
Мне на мидла пет(
чел, у тебя интересный, относительно востребованный стек, не стоит его менять на подыхающие кресты, не губи себе карьеру и жизнь
ну знаешь как в джунглях есть цветок который воняет гнилым мясом и батиными носками, но для мух это самый сладкий аромат на свете, они летят туда, прилипают к цветку, а потом он их сжирает
так и с++ (в виде последних стандартов) сегодня стал такой привлекательной эзотерической альтернативой хаскелю и служит для сжигания мозгов слишком любопытных программистишков
с++ - не более чем средство уничтожения, прореживаня слишком умненьких в популяции
яндекс вообще никого со стороны не берет, нахуй это ему не надо, у него несколько прикормленных кафедр в москве и одна в сибири, там блядь выбирают из специально выращенных зомбей, которых натаскивают щас чуть ли не с начальной школы, лол
Прохладно.
Стандартная библиотека модулями в С++23 вроде должна быть принята, в студии какая-то тестовая имплементация была еще год назад, но тогда модули вообще не работали
>>47242
Да не только. У меня кореш в озоне был с 500-600 (в зависимости от бонуса). в Яндексе был чувак 500-550 (с бонусом так же), в Хуавей хайрили знакомого на 600 гросс + 2 зп в год бонусом (а то и 4, если заебись работаешь)
Я эти маняцифры только на дваче видел, ИРЛ никто о таких зарплатах не говорил.
>Бля чел, если ты этого не видел - это не значит, что этого нет.
Значит. У меня хороший круг знакомых в отрасли и я ему доверяю больше чем словам двачеров.
Точно нет, шансы крайне малы что с таким разбросом и опытом они все умудрились оказаться на днище. А вот шансы того что на дваче пиздоболы пиздят - крайне велик.
Ну днище - это сколько? если это ты тот чел, который писал про "втрое меньше 250к" - то нет, ты не просто на днище, ты на днище ебаном, как и весь твой круг вообще.
>есть наблюдаемая объективная реальность где толковые люди получают нормальные деньги, цифры совпадают с тем что предлагают в вакансиях
вс.
>двощер заливает про баснословные деньги которые они никак не могли бы приносить и ни одна компания не стала бы разбазаривать; с целью потроллить окружающих невероятными "успехами"
Гм, действительно, кому бы поверить. Да, пожалуй поверю тебе, Аноним, ведь зачем тебе врать, верно? А мои наблюдения и опыт это хуйня, я просто дебил как и вообще все с кем я общался, вот так мне лично повезло.
Может у них в обязанностях был массаж гендиру.
>А мои наблюдения и опыт это хуйня, я просто дебил как и вообще все с кем я общался, вот так мне лично повезло.
Пчел, если ты и твои кореша работают в каком-нибудь ООО ГОВНОСОФТ в Ростове-на-Дону - то да, там 120к у всех твоих друзей, и даже 200к кажется чем-то недосягаемым.
Из моего круга общения - минимум который я знаю, это у друга 160к в питере, который выпустился пару лет назад из вузика, и 2 раза сменил работу. Следующее снизу - это 5500 баксов на удаленке.
Переедь в ДС, попробуй устроиться в сбербанк\прости-господи-яндекс (который вместо акций теперь кэшем платит) - посмотришь на ЗП
Интересно, чего ты своей пиздоболией пытаешься добиться? Чтобы я имел завышенные требования и не находил работу или что? Я знаю сколько платят на самом деле и оцениваю все адекватно, ты мне не создашь манямирок чтобы я попал впросак. Ты так ньюфагов отсеиваешь что ли?
Вот серьезно, забей на минутку на свой троллинг и поясни мотивацию этого пиздежа, искренне любопытно.
Могу. Вероятность этого настолько мала, что я не вижу смысла развлекать эту идею.
То есть ты так и будешь продолжать свою шараду? Ладно, может кто-то другой ответит.
Скажи для интереса, какой бы пруф ты принял?
Так, чтобы не было воплей про фотошоп, афтереффекс, давинчи резолв и прочее.
Пруф чего? Что какой-то кум кабанчика умудряется квадриллион в наносек за нихуя получать? Я знаю что такое бывает.
Пруфануть что в индустрии такие зарплаты норма ты не сможешь, потому что это объективно не так, так что прекращай танцевать вокруг да около и скажи какой смысл тебе пытаться продолжать мне вешать лапшу на уши?
>Пруф чего?
Что доход в 500к+ в месяц в Москве хорошим программистом - реален. А 200+ - это впринципе уже давно мидловская зарплата.
> Пруфануть что в индустрии такие зарплаты норма ты не сможешь, потому что это объективно не так, так что прекращай танцевать вокруг да около и скажи какой смысл тебе пытаться продолжать мне вешать лапшу на уши?
В моих словах нет ни слова лжи.
Меня во всей этой истории занимает только один вопрос. Какой может быть причина того, что, со своих слов, 100000к наносек, тратит свое время, чтобы доказать долбичу с двача, что бывают какие-то зарплаты.
причем дебич с двача, очевидно, никогда не признает свое поражение.
Мимо другой анон.
Как скажешь.
Не я тут дебич, а тот который нереальные зарплаты выдает как что-то реальное. Потом вон ворота сдвинул, теперь 200к это норма стала, а не 800к.
Пиздит зачем-то, а потом юлит когда на лжи поймали. Я не дебич, я как раз умный потому что раскусил лжеца.
>. Потом вон ворота сдвинул, теперь 200к это норма стала, а не 800к.
Вот это внимательно прочитай. Я нигде ничего не сдвигал, просто еще один референс поинт привел.
> Что доход в 500к+ в месяц в Москве хорошим программистом - реален. А 200+ - это впринципе уже давно мидловская зарплата.
Справедливо.
Во всем крупняке - зарплата зависит от бизнес юнита (не всегда), от грейда (всегда), от jobtitle (всегда) и от локации (всегда).
От языка она не зависит. Если ты L5 программист в гугл калифорния - то твоя зарплата будет +- такая же как у остальных L5 программист ов в гугл калифорния, будь ты крестовиком, жаваскриптером, питонистом или хаскеллистом.
Теперь замени L5 гугл калифорния на G17 Яндекс Москва - получишь тоже самое. Юнит\проект тоже иногда решает, но не везде далеко.
Про мелочевку смысла нет говорить, не думаю, что тут кто-то мечтает всю жизнь работать на заводе пилить SCADA на MFC.
>работать на заводе пилить SCADA на MFC
Что-то на самом деле полезное в отличие от смузихлебского аппа на гейфон.
А то сейчас это тупо копипаст, когда приходится писать одно и тоже для двух классов. То есть мне надо писать один и тот же код два раза - для float и для double. Но ведь логика там идентична
Хочется сделать шаблон так чтобы для вещественных была своя спецификация, для целых своя (для произвольных своя).
То есть хочу написать как-то так:
template<> class Foo<2, float or double>{};
И чтобы этот шаблон использовался для обоиъх
Без макросов. С++20
точнее require is_floating_point_v<T>
На хх видел вакансию на кресто-архитектора от 2гиса. То ли 600 то ли 800 было.
Как стать архитектором?
Я тоже что-то не представляю. Купил бы йоба-пеку чтобы не играть на ней, а остальное хз куда. Портфель акций, наверное, золота, налички, и капчевать двачи спустя лет пять на пенсии без всяких нужд.
Я хз... это полтора-два года поработаешь, и потом можно 30 лет нихуя не делать, при этом имея 40к расходов в месяц (большинству рагсиян такое или не светит, или надо въебывать на трех работах).
Какие-то нереал цифры. Я поверил бы - если бы это были дети чинуш - им еще в оксфордах учиться и унитазы золотом обшивать.
А обычный кодо-работяга...
Даже в 500к не верю....
У меня начальник отвечающий за электроэнергию города получает в среднем 150к. Плюс у него премия один раз в год в один лям - это по сумме в три раза меньше этого архитектора
Как это делается? Заебали нормисы со своими "заведи девушку", я что, блядь, не завел бы если бы знал как это делается?
С хуя ли я шизоид? Писать научись, быдло.
>Семью заведите и узнаете
Ну как-то вся страна живет за 40к на семью...
Тем более у архитектора за 800к явно не тот склад ума чтобы бегать по клубам за современными пездами.
В моем понимании профи программирования в принципе не может владеть социальными навыками быдла - просто потому что либо шляешься по клубам и ебешь тянок, либо сутками дрочишь математику и паттерны. В сутках всего 24 часа
тут один только стандарт 20 лет учить чтобы не ловить все UB
>В моем понимании профи программирования в принципе не может владеть социальными навыками быдла
Еще один шизойд
Архитектору и не надо за пиздами бегать, все в округе с помощью слухов и так знают, что он заряжен, и всячески пытаются на него вешаться.
>В моем понимании профи программирования в принципе не может владеть социальными навыками быдла
Не факт, у меня знакомый такой, голова на плечах толковая, быстро соображает, но еще и не обременен аутизмом и способен в общение, потому как-то тянок цепляет регулярно. В общем, полная моя противоположность.
>>48456
Писать научись, быдло.
с++ - это не тот язык в который можно вкатится за десять минут в день
Если глянуть вон фотку коммитета стандартизации - то там дофига челов в грязных свитерах (ну да, там и кабанчики мелькают - но так в коммитет и менеджеры ходят)
>>48466
> все в округе с помощью слухов и так знают
Да все это фигня и миф. Современные пезды немножко тупы и скорее повешаются на очередного самса-безработника (зато с ним весело)
>>48466
>Не факт, у меня знакомый такой, голова на плечах толковая, быстро соображает
дело не в том - быстро или не быстро
Ты аллокатор свой писал? Свои строки? Это все не пять минут вникания.
Вот архитектор должен это все знать, потому что с++ такой язык, в котором стандартная либа не покрывает все задачи. Погугли видео по проблемам строк - вроде бы что там - тсроки и строки, во всяких питонах и джавах даже не заморачиваются.. А в С++ только о проблемах могут часы выступлений проводить..
Плюс если нужен архитектор С++ - то там скорее всего идет дрочь на оптимизации (а значит стандарт либы под запретом)
> ноулайфаер + инцел
> студент
> чсв
> считает программирование на с++ чем то сакральным
бинго?
>Да все это фигня и миф. Современные пезды немножко тупы и скорее повешаются на очередного самса-безработника (зато с ним весело)
Ну тебе виднее, я в пиздах не разбираюсь совершенно.
>>Не факт, у меня знакомый такой, голова на плечах толковая, быстро соображает
>дело не в том - быстро или не быстро
Не то слово выбрал.
>Ты аллокатор свой писал? Свои строки? Это все не пять минут вникания.
Я нет. Он - да. Парсер хмля для каштомного гуя заебенил там где я потом работал.
>Вот архитектор должен это все знать, потому что с++ такой язык, в котором стандартная либа не покрывает все задачи. Погугли видео по проблемам строк - вроде бы что там - тсроки и строки, во всяких питонах и джавах даже не заморачиваются.. А в С++ только о проблемах могут часы выступлений проводить..
Я обычно базовый string для задачек использую, wstring для обычных виндовых прожектов и какой там стринг на текущем проекте принято использую на текущем проекте. Только один раз на проекте с нуля был, там обжективный стринг был уже, т.к. не мультиплатформа.
>Плюс если нужен архитектор С++ - то там скорее всего идет дрочь на оптимизации (а значит стандарт либы под запретом)
Дроч без мягкого знака.
Да, в таких местах своя "стандартная" либа без исключений.
Есть функция
BOOL SetWindowText(
HWND hWnd, // дескриптор окна или элемента управления
LPCTSTR lpString // адрес строчки
);
Я не понимаю, откуда отосрать 2-й аргумент? Да, я пытался гуглить LPCTSTR и всякие всратные LPWSTR и тд. Нихуя непонятно, а главное что с этим делать и как мне блять передать какую-нибудь строчку в функцию? Что бы я не передавал, выдает ошибку cannot convert ... Памагите.
>LPCTSTR
LP - long pointer
C - const
T - for a wide character or char
STR - string
https://stackoverflow.com/questions/321413/lpcstr-lpctstr-and-lptstr
Указатель на строку вобщем
А вобще просто посмотри на что этот тип затайп дефайнен и что реально под ним лежит
>Я не понимаю, откуда отосрать 2-й аргумент?
Type: LPCTSTR
The new title or control text.
https://learn.microsoft.com/ru-ru/windows/win32/api/winuser/nf-winuser-setwindowtexta
>как мне блять передать какую-нибудь строчку в функцию
https://stackoverflow.com/questions/6541068/need-help-passing-some-lpctstrs-to-a-function-in-c
ну вобщем учись гуглить, или chatGPT пользоваться
Ну ты реально че то не то делаешь. Даже ебучий яндекс, куда проще всего попасть очень быстро при хорошей работе дает 200к. Мрему другу 200 дали сразу после стажки, хотя до этого он не работал нигде
>В моем понимании профи программирования в принципе не может владеть социальными навыками быдла
Всё так. В 2023 нужны только навыки общения с чатгпт + доставщиками еды и мастерами, блять, чистоты. Одна проблема - из-за константной депрессухи тяжко работу искать.
Бля, дегенераты. Помню в прошлом году решал с аноном по приколу контест в яндекс. Решали мы отдельно, но потом обсуждали. Не помню сколько он решил, но он спросил со мной и говорил, что я не мог решить 4 задачи за 3 часа. Прям доказывал мне, что я не мог
Если ты про тот простенький контест где три изичные и две медиум задачки (по уровням литкода), то твой анон ОСНЕ СЛАБЫЙ.
Но если яндексу нужны такие кодомакаки на плюсах которые тупо медиум алгоритмические задачки решают, то с хуя ли им платить 200 кусков? Деньги девать некуда? Такие и за сотку удавятся. Головой-то подумай.
Ты где работаешь? Если для тебя 200 невообразимая цифра, то попробуй в яндекс попасть, сам все увидишь
Не говорю, что тебе сразу будут платить. Может тебя попрут через месяц, но с людьми зато пообщаешься
На такие деньги даже квартиру в центре не купишь.
Поймал анальника!
Сортировки нет, порядок захардкоден, разраб ошибся при добавлении.
Толстовато.
Сначала подумал, что время жизни анонимного Х продлилось - нихера. До вывода. Или продлилось время жизни ТОЛЬКО ff?
Пробовал их Фаст трек, решил одну полностью, в другой обосрался. Две даже не трогал, какой то тихий ужас.
Никакие там не мид литкода.
Разобрался. Висит она. Но почему такая конструкция(получение & от &&) вообще возможна?
Префикс для строки. Означает что это строка не из обычных чаров на 8 бит, а из wchar_t, и запихивается в широкую строку.
Показать не могу, не сохранил.
Решил я самую простую: стек с запоминанием максимального числа в стеке.
Вторая: есть две компании с радиовышками. Радиовышка имеет параметры [x,y] и радиус R общий для всех вышек. Есть город Q с центром [0,0].
Надо определить победителя по критериям близости к центру и допом вывести сколько вышек ближе чем у противника.
Чтоб идти в зачет, вышка должна покрывать хотя бы одну целочисленную координату города.
Я очень обосрался с алгоритмом нахождения этих координат.
Но это ладно. Я думал что будет как на литкоде:
Есть класс, внутри него описываешь решение. Ни Ху я. Твоя прога будет вызываться и в stdin кидаться аргументы. Я 1/2 времени потратил тупо на парсинг этих ебучих аргументов, потому что cin трогал последний раз на первом курсе вуза.
Но возможно это просто я тупой и Яндекс мне не светит.
>самую простую
Ну это ладно.
>Вторая: есть две компании с радиовышками. Радиовышка имеет параметры [x,y] и радиус R общий для всех вышек. Есть город Q с центром [0,0].
Чем-то напомнило https://leetcode.com/problems/detonate-the-maximum-bombs/ - оно? Я тут жиденько обосрался когда решал, надо перерешать.
>Но это ладно. Я думал что будет как на литкоде:
>Есть класс, внутри него описываешь решение. Ни Ху я. Твоя прога будет вызываться и в stdin кидаться аргументы. Я 1/2 времени потратил тупо на парсинг этих ебучих аргументов, потому что cin трогал последний раз на первом курсе вуза.
Ну это какбе ничего не говорит ни о тебе, ни о задачах.
Правда, стдин это очень просто, этот фастрек это что вообще, раз ты загуглить цин не мог?
Да, задача явно похожа, пойду прорешаю.
Я просто на этот парсинг убил много времени. Разобраться то с ним смог, никаких запретов на юз Гугла не было.
в КФЦ и макдаке в мухосрани столько платят. И бесплатные обеды, и карьерный рост до тренера.
Так это потеть на кухне надо.
Эта вроде сильно легче, здесь же просто чек на пересечение окружностей.
Может какую то из уже разрабатываемых очень ждете?
какие нах еще новые фичи
Сокеты в стандартной либе.
Рефлексию, единый формат описания 3рдпати пакетов, Смерть CMAKE, Вижуал студию полностью кроссплатформенную, хотя-бы компилятор
>Вижуал студию полностью кроссплатформенную, хотя-бы компилятор
А почему бы студию не приручить к другим конпеляторам? Хочешь - гцц компиляешь, хочешь - кланг.
кланг вроде так и делает
>Вижуал студию полностью кроссплатформенную, хотя-бы компилятор
Зачем и кому это может понадобиться?
Это сейчас именно так и работает с прослойкой в виде CMAKE и WSL (мы проект так кросскомпилируем под линукс).
Но, это во-первых - сблев сифилисной обезьяны, под названием CMAKE. Во-вторых - это всякие разные вещи, которые есть только в одном компиляторе (расширения например), всякие компайлер свитчи и прочее прочее прочее.
Хочется именно нативный экспириенс студийный, поставил - и все работает без хуйни и говна.
>>49180
Любому разработчику с кроссплатформенным проектом, который не любит жрать говно
То, что ты хочешь, скорее всего не рефлексия, а компайл тайм определение типов, но с этим вроде и так сейчас уже хорошо.
А рефлексия это большое зло, я тебе как поработавший с джавой говорю.
То проблемы с безопасностью, когда тебе прислали объект по сети и ты обращаешься к нему так как будто бы в нем что-то есть. То не получается собрать под какую то платформу, потому что на ней нет рефлексии (ну скажем код должен весь в ROM лежать) и весь проект зависит от этой либы.
> Хочется именно нативный экспириенс студийный, поставил - и все работает без хуйни и говна.
С такими запросами тебе только язык менять
Я не он, но думаю когда говорят про рефлексию в плюсах имеют ввиду компайл тайм рефлексию
Рефлексия бывает статическая и динамическая.
Сейчас плюсы идут по пути статической.
Есть подобие динамической в Qt.
> Сравнивает IDE и компилятор
Сорян про лабу2.срр, вы походу только начали курс ПРОГРАММИРОВАНИЯ НА ЯЗЫКАХ ВЫСОКОГО УРОВНЯ.
Ты так и не назвал ни одной причины, почему майкракософтовским компилятором кто-то вообще захочет собирать хоть под одну платформу.
Ну хуй знает. Может спросим пацанов из Unreal, почему они UE компиляют студией под винду? Может спросим у Гугла, почему они собирают хромиум вижуал студией? Может ты еще в штаны перестанешь срать. Я понимаю, ты КРУТОЙ ПРОГРАММИСТ, АЖ НА ВТОРОМ КУРСЕ ВУЗИКА, ВСЕ ЗНАЕШЬ И УМЕЕШЬ, НЕ ТО ЧТО ДИДЫ.
Но пока ты только срать в штаны умеешь.
>Хочется именно нативный экспириенс студийный, поставил - и все работает без хуйни и говна.
Двачую.
>поставил - и все работает без хуйни и говна
Эх, анончик, если бы только можно было совместить это с кроссплатформенностью
Потому что под проблемную прошивку сложно собрать чем-то кроме как проблемными же костылями. Вендорлок называется.
аноны, как вкатиться в цпп на вакансию джуна?
Решаю неплохо задачки на алгоритмы, знаю ответы на базовые вопросы про ООП. Плюсы знаю средне, но думаю с практикой всё придёт. Проблема в том что этой практики у меня нет, т.к нет работы
На собесы меня вообще не зовут, только один раз хрюшка перезвонила, но как я понял это для галочки и она всем кандидатам перезванивала.
Понимаю что я многое не знаю и при желании можно легко найти к чему приебаться, но всё же я хочу вкатиться на вакансию джуна, а не тимлида
Раскидывать свое хуевое резюме на все возможные вакансии, попутно ежевечерне читая умные книги и хуяря код (опционально на гитхаб).
Других вариантов особо нет.
> называет кого-то наркоманом
> несет мало того, что бред шизофреника, так еще и откровенно лживый
Почему С++ притягивает именно вот эту категорию людей? В тредах по другим языкам тож самое?
>на все возможные вакансии
Да и так раскидываю, но вакансий джуна не так много, а часто вообще в требованиях 3-4 года опыта.
Попытай удачи в москву\питер еще, если не в них.
Вообще, есть конечно ебланский путь, типа устроиться в контору кем-нибудь принеси-подай типа, куа\админа\техпода, а потом внутри перейти в разработку через годик. Но я не уверен, что тебе это надо делать.
Спасибо, анон
> > называет кого-то наркоманом
> > несет мало того, что бред шизофреника, так еще и откровенно лживый
> Почему ДВАЧ притягивает именно вот эту категорию людей?
То есть, бред, но ты его решил анализировать и даже нашел там истину. Вот это откровения.
Да почему губить-то. Я же дропать основной стек не собираюсь, и увольняться тоже.
В идеале да, хочу полноценно вкатиться в кресты, потом походить по собесам и понять, получится ли вообще переквалифицироваться не падая до уровня джуниора за еду.
Может идея ебнутая, но я помню как еще в 15 лет я только вкатывался в программирование, и первый язык был как раз плюсы. Хватило меня на месяца 2, и в итоге я съебал сначала в питон, от туда в ноду, а сейчас еще и го добавился.
А щас хочется будто и гештальт закрыть, и возможно стать тем самым крутым инженером который работает над интересной и сложной залупой, работая в условных фаангах или чём-то похожем. Джейсоны заебало перекладывать, короче.
для дескопного приложения стоит ли заморачиваться с qt? или взять любую другую библиотеку?
просто слышал что в случае qt придётся устанавливать их редактор, регистрироваться на их сайте...
>Джейсоны заебало перекладывать, короче
Будешь перекладывать жеэсоны на плюсах. Если ты думаешь что С++ = интересные и сложные задачи то ничего подобного. Безусловно такие вакансии есть, есть перфтимы в гуглах, есть хуавей, есть некоторые команды в Яндексе, но средняя вакансия на крестовика это что-то из этого:
1) Перекладывание всратых жсонов на железках с 1кб памяти. Нобрейн работа где единственная сложность это впихнуть код в уебищную железку, потому что на железку подороже у заказчика нет денег
2) Перекладывание всратых скриптов для игр в роли геймплей программера
3) Создание эндпоинтов в бэкэнде
При этом сразу готовься что кодобаза будет как минимум совершеннолетняя, а скорее всего примерно твоего возраста. Лучше жизнью займись а не этой дрочью
А как можно рыспрыгаться с плюсов на другие стеки, не снижая грейд?
> для дескопного приложения стоит ли заморачиваться с qt? или взять любую другую библиотеку?
> просто слышал что в случае qt придётся устанавливать их редактор, регистрироваться на их сайте...
Не обязательно. Офлайн инсталлер качай, регаться там вроде не надо. А их редактор удобен для создания гуя.
Вроде есть способы натянуть кутю на студию, но зачем?
Я трогал только супер древний wxWidgets и Qt, вторая нравится больше, меньше пердолинга. Алсо все твое "заморачиваться" - это два часа времени максимум.
Даже если взять пункт 1) и пункт 3) как релевантные для меня на моем текущем стеке задачи - я бы сказал, что делать это на ноде/гохе вот именно что нобрейн.
В плюсах ты хотя бы на пару минут подумаешь про память, про структуры данных и алгоритмы.
В ноде ты напишешь в контроллере return {pizda: "jopa"} и в сервисе await kafkaInstance.produce(req.body) и хуй забьешь на остальное. А если начнутся проблемы с производительностью то добавишь еще пару подов. И так почти везде.
>Безусловно такие вакансии есть, есть перфтимы в гуглах, есть хуавей, есть некоторые команды в Яндексе
Я бы сказал, что таких вакух больше все равно, потому что смысл перекладывать жсон на плюсах когда это быстрее и дешевле на любой скрипт-хуете, поэтому на плюсах в ТЕОРИИ должно быть больше пространства для чего-то посерьезнее перетасовывания полей.
Понемногу начинаю с openGL на vulkan переходить, увидел что у вулкана есть биндинги к плюсам vulkan-hpp
Стоит в них лезть вообще, или лучше с си интерфейсом работать?
как то попытался прочитать отзывы на это всё, многие бухтят на vulkan-hpp, но не очень понятно почему, да и как вижу все опенсорсные приколы на гитхабе не пользуются этой плюсовой оберткой
Ты игры хочешь делать? Если да - то нахуй тебе вообще вулкан\опенгл? Берешь юнити и делаешь игру.
Ты хочешь быть рендеринг инженером? Тогда лучше вообще DX12 с рейтрейсингом, вулкан актуален в 2.5 конторах.
Игра - это не про код и не про язык программирования, и не про графон. А про идею и геймдизайн.
Собственно - одно из самых больших заблуждений в кодинге как раз о том, что С++ и геймдев связаны. Под геймдевом все всегда имеют ввиду написание сюжетов\персонажей\механик, а не дрочку на физику шин или задрачивание коллизий в опенворлде (вот тут как раз С++ и нужен только)
>тред пильщиков
>хочу запилить дверь, как это лучше сделать?
>закажи готовую с алика
Узнаю родимый двач.
Анрыл или флакс посоветовал бы хотя бы.
>>50483
>Игра - это не про код и не про язык программирования, и не про графон. А про идею и геймдизайн.
Игра это про что угодно. Если хочет графон ебать - пусть ебёт, зачем ты его учишь своему мировоззрению?
Анрыл тоже норм, только сложнее юнити сильно.
> Игра это про что угодно. Если хочет графон ебать - пусть ебёт, зачем ты его учишь своему мировоззрению?
Игра - это про игру. Я к тому, что если чел хочет делать игры - то опенгл это трата времени на хуйню, когда надо читать учебники по геймдизайну и\или ваще по КАК СТАТЬ ПЕЙСАТЕЛЕМ.
> Ты хочешь быть рендеринг инженером?
this, по крайней мере мне это пока что больше интересно
>Тогда лучше вообще DX12 с рейтрейсингом
И его есть в планах глянуть, но потом
я же студент еще, я не собираюсь за вулкан на года 3 садиться и всю жизнь тратить, а так пока что банальный рендерер запилить, с какими нибудь приколами на пару месяцев
так что сначала хочу вулкан потыкать
Если ты студент и тебе по фану - я бы не советовал трогать вообще Вулкан, наверное. Опенгл пайплайн сильно проще, а результаты будут одинаковые для твоих студентопроектов. в Вулкане\ДХ12 есть смысл тогда, когда ты реально дрочишь на то, чтобы попасть там в id Software или в ту же нвидию прости господи. Но ни туда ни туда не возьмут, пока у тебя не будет опыта в этом всем промышленного несколько лет.
Нет, ты прав про то что если хочет именно делать игры, то не надо сосредотачиваться на пикселях вулкана. Но он не говорил что именно хочет делать игру, может из спортивного интереса графическое апи ковыряет.
Неспособен осмыслить три слова в контексте. Выкакаю совет на целый абзац. Классика.
почему? ты сторонник Столярова?
> Это не заблуждение и не ошибка - геймдев действительно плотно и тесно связан с с++. Это и вскякие игровые движки, как годот и анрил, и всякие либы на нем.
Блять, чел. Прочитай что я написал. Когда кто-то хочет делать игру - он хочет именно делать игру, сюжет, геймплей, дизайн, а не ебать лучи.
Для ДЕЛАНЬЯ ИГР - с++ нахуй не сдался. А вот для ковыряния в движках и прочем - конеш нужен. Только это байтоебство опять, а не гейдев
Хуйню несешь.
>Для ДЕЛАНЬЯ ИГР - с++ нахуй не сдался.
Вот и имеем с таким подходом йобы с графоном уровня третьей плойки которые отжирают более 8 гектар памяти и весь проц. А сверху дерьмувой намазано, чтоб неповадно было.
А есть толковые ребята вроде Вубе которые на плюсах заебашили игрень оперирующую буквально миллионами предметов без тормозов.
Надо знать пределы просто, и не замахиваться на йобы когда один хуячишь на плюсах, соло на плюсах вполне можно потянуть индюшку.
Если что-то покрупнее то уже бригадой надо, но там и на юнитазе особо один бы не потащил, так что это ни к чему сказано.
>А вот для ковыряния в движках и прочем - конеш нужен. Только это байтоебство опять, а не гейдев
Так может быть нужно.
>Надо знать пределы просто, и не замахиваться на йобы когда один хуячишь на плюсах, соло на плюсах вполне можно потянуть индюшку.
Двачую. Шизики берут какой-то юнити или анриал и делают на нем майнкрафт. То что эти движки не расчитаны на такие типы игр их мало волнуют, ребята просто ебашат тысячу динамических источников света в виде лавы и фпс дропается до нуля, но на эти небольшие проблемы можно не обращать внимания если твою игру покупают за 3$ в стиме и лайкают на реддите
f(h(args...) + args...); // Nested pack expansion:
// inner pack expansion is "args...", it is expanded first
// outer pack expansion is h(E1, E2, E3) + args..., it is expanded
// second (as h(E1, E2, E3) + E1, h(E1, E2, E3) + E2, h(E1, E2, E3) + E3)
Если я хочу, чтобы это развернулось в h(E1, E2, E3) + E1, E2, E3, то как это должно выглядеть?
h(args...) + ... + args
ну и мем в том что второе ... как и положено в крестах значит совсем не то что первое
Я сделаю игру на УЕ чисто на блюпринтах красивее на пару порядков и без единой строки кода на С++
Так args... вроде и нельзя записать в виде args ... ?
ето fold expression
но я проебался немного. если ты хочешь именно h(E1, E2, E3) + E1, E2, E3 а не h(E1, E2, E3) + E1 + E2 + E3 то надо разделять пак на первый элемент и остальные, и еще потом попердолиться
А (... , args) раскроется в аргументы через запятую?
А есть же еще Val и Circle
Эта хуета форсится везде и всюду.
Почему нельзя писать на Rust/C/C++/Go?, т.е. на языках программирования с адекватной производительностью.
Агрессивный студентик, очки подросткового максимализма снимай и начинай смотреть на мир не однобока
В книгах.
>Но как же я проиграл, с того, что ты на C собрался чето в 23ьем писать. На языке, в котором даже строки сложить без гомоебли невозможно.
Ну ты отсталый. Сейчас ты и не будешь сам писать на сях, только корректировать выдачу нейросетки.
Какой ламповый гуй, аж олдскулы свело.
Ну смотри, мне больше 40, и я со школы пишу на с/с++, и до сих пор узнаю какой нибудь новый способ словить UB.
Вот вчера мне надо было решить задачу, обработать пдфку и перевести ее, ну я постепенно написал питон скрипт на 120 строчек, просто добавляя по паре строчек обрабатывая нужные мне условия. На крестах я хз, наверное к концу дня только бы закончил собирать нужные либы, если бы нашел.
В геймдеве такая же история, я могу писать на с++, или на скриптовом языке, конечно с++ быстрее и лучше когда какие-то вычисления, там, многоугольник разрезать лучами, но писать логику тупо быстрее на скриптах, быстрее итерация между написал-запустил.
чтоб все охуели как ты можешь
Везде.
Одна из "прелестей" C++ как раз в том, что такие казалось бы простые вещи размазаны по всему языку.
Человек, который пишет учебник по C++ или читает курс лекций, не может просто так взять и заявить "теперь мы дошли до темы приведения типов, давайте вскроем эту тему". Не выйдет, потому что приведение затрагивает буквально все от азов Си до наследования, шаблонов и RTTI.
Я запрещаю, не делай.
>Сейчас ты и не будешь сам писать на сях, только корректировать выдачу нейросетки
РАБОТАЕШЬ С ДАННЫМИ ЮЗЕРОВ
@
ПРОЧИТАЛ ГДЕ-ТО В ИНТЕРНЕТЕ ЧТО ЗЛЫЕ КАКИРЫ МОГУТ СЧИТАТЬ ПАРОЛИ ПРЯМО ИЗ ПАМЯТИ ПРОГРАММЫ
@
ПОПРОСИЛ НЕЙРОСЕТЬ СТЕРЕТЬ ДАННЫЕ ИЗ ПАМЯТИ
@
memset(password.c_str(), 0, password.size())
Не все поймут, не многие вспомнят
Хороший язык, и загадки интересные.
В чем код пишете, XCode/VS/что то другое?
Я почему-то думал, что string::data гарантирует выдачу внутреннего буфера, через который можно безопасно редактировать строку. Оказалось, что это то же самое, что и string::c_str, и всегда возвращало const char*.
"pwd"[0] = 0;
могло быть хуже, что-то типа
std::string string_to_clear = password
memset(string_to_clear, 0, string_to_clear.size())
Вот говорю же, ИИ это охуенно, нечего его бояться, не только удобный инструмент для говнокодинга в промышленных масштабах, а еще и козел отпущения!
Даже если это очистит строку(заполнит его нулями), это его не освободит. Будет утечка памяти
Нехуй на сях писать не разбираясь. Давно много чего понаписали про небезопасные функции, переходи на безопасные, не хочу развиваться, хочу ебашить код из девяностых.
Насколько я знаю, даже если бы это сработало, это бы не решило проблемы приватности данных.
Даже если бы там был правильный мемсет, он мог быть убран оптимизацией компилятора, т.к. он посчитал бы что это ненужная операция, ведь потом данные не используются https://cplusplus.com/articles/ETqpX9L8/
Как минимум, надо вызывать memset_s, а не memset
А еще есть всякое кэширование, да в конце концов оперативники могут вытащить плашку из компьютера и считать прямо из памяти магнитный заряд.
Нужны специализированные решения. В идеале которые еще и не хранят данные плейнтекстом, а расшифровывают.
Так что это в любом случае не задача, которая решается однострочником, а тянет на отдельный подпроект.
>специализированные решения
>тянет на отдельный подпроект
какая-то шиза уровня баяна про хакера в столовой
еще двухфакторную авторизацию с отпечатком пальца забыл
теперь твоя лаба4 под угрозой
Метанит слабоват, имхо.
Звёздочка стоит там где нужно. Её совать к переменной надо если ты несколько поинтеров в строку зачем-то объявляешь, что чревато ошибками и не стоит так делать.
Упоминание детей нерелевантно к посту, это просто наблюдение связанное с тем что современные дети "программируют" на жабоскрипте копипиздя код со стековерфлоу и в итоге мы имеем сайты-визитки отжирающие сто метров памяти и траффика имея килобайт полезной инфы.
К сожалению только на ангельском. 295 печатных страниц. Вот что сам автор пишет, перевел с английского:
История создания этой книги началась в 2001 году с поста на форуме какому-то еблану как инициализировать переменные в С++. Я исправлял неточности и дополнял различными примерами. За 20 лет эта тема стала слишком большой для одного поста, и мне пришлось оформить ее в книгу. Данная книга на протяжении 14 глав подробно охватывает все 19 видов инициализаций в современном С++, изменения вносимые новыми стандартами С++11, С++14, С++17, и С++20, а так же разбирает различные тонкости и идиомы. Книга будет полезна как продвинутым разработчикам, так и самым распоследним вкатутосям, поскольку разобраться как работает инициализация в С++ обычному человеку невозможно.
Есть два варианта как можно написать - звездочка относится либо к типу, либо к переменной. Технически это одно и то же, разница в голове.
Type⚹ ptr - переменная типа "указатель на тип"
Type ⚹ptr - "переменная-указатель" на тип.
Мнения за и против можешь почитать здесь https://stackoverflow.com/questions/398395/why-is-the-asterisk-before-the-variable-name-rather-than-after-the-type
Как написал анон выше, подвох будет в объявлении нескольких переменных.
Type⚹ a, b;
Может показаться, что это две переменных Type⚹. Но на самом деле это
Type⚹ a; Type b;
Что же касается твита, то это автор игры Braid с отмоткой времени, который считает себя крутым программистом и даже пилит свой язык JAI (убийцу Раста) и настроен негативно в сторону C++.
А его высказывание можно понять так, что дети насмотревшись на такое автоисправление, не научатся писать как он считает правильным.
Париться по этому поводу не нужно, это просто древний холивар, в любом случае в си бардак с объявлениями, поэтому в современных языках и стараются это как-то упорядочить.
Кул cpp сториес.
>пилит свой язык JAI (убийцу Раста)
Почему раста? Это же язык для геймдева, а там раста то практически и нет. Это он скорее на C++ покушается.
Ну, написано что он начал его пилить, потому что ему не понравился Раст как убийца C++.
Ебать ты смешной.
Хорошего человека отсосом не назовут!
>звездочка относится либо к типу, либо к переменной
В контексте объявления переменной звездочка - это declaration operator, относится к части объявления, называемой declarator и она модифицирует одну переменную, ближайшую справа от себя. К части объявления base type звездочка не относится.
Нужно понимать, что например, float[5] и float[7] - это разные типы. И что эти типы не являются базовыми (встроенными). Встроенным является только тип float, [] - это вообще не тип, а снова declaration operator, а тип float[N] создается исходя из конкретного объявления.
А вот, например, когда ты объявляешь псевдоним типа, то звездочка уже "реально" модифицирует базовый тип, т. к. кроме типов там ничего не фигурирует.
Нет способа всегда приклеивать звездочку в каком-то одном месте.
*будут
Это что за собес такой страшный?
Где скачать? Я не то что бы имею хоть какую-то возможность приобрести книгу.
>К сожалению только на ангельском.
Почему к сожалению? Ты не настоящий программист, если не знаешь английский.
Смотрит на стек напрямую.
a) The class itself
b) All of its direct and indirect base classes
c) If the class is a member of another class, the class of which it is a member
d) The innermost enclosing namespaces of the classes added to the set
Я что то не понял это. Можете, пожалуйста, пример привести? То есть функцмя не должна быть членом класса, иначе толку нет от этого правила. Тогда статик? Статик у меня не нашелся. Только friend. Почему?
Не имею возможности приобрести книгу в любом варианте. Свифт до сих пор не вернули.
Могу принять платеж на карту рф и скинуть в тред электронную версиб
Спасибо большое, ты очень помог.
Словил психологическую травму с этой хуеты. Впервые пришёл прахраммировать и дали проект, написанный под большим впечатлением от этой книжонки. Ехали шаблоны через шаблоны, имя метода в дебаггере длиной под тысячу символов.
При этом, никаких технологических причин хуярить шаблоны не было, проект представлял собой программу-сервис, которая опрашивает железо, складывает в случае событий всякое в БД, ну и предоставляет информацию о происходящем подключающимся клиентам. Ещё оно было написано на С++03, т.н. ещё до std::thread.
Я уже написал более продвинутую версию этого софта и никакие шаблоны мне для этого не понадобились (ладно, полтора вспомогательных шаблонных класа есть), хватает наследования.
1. Свободный разговорный английский (не обсуждается, никаких СО СЛОВАРЕМ или НАЧИНАЮ УЧИТЬ).
2. Знать нужный язык программирования в вакансии (никто не требует быть спикером конференций, но бля, будь добр, хотя-бы Скотта Майерса осиль и осознай, и хоть чуть-чуть интересуйся тем, что завезли хотя-бы в С++17, 6 лет прошло).
3. Соответствуй требованиям. Если в вакансии знание CUDA допустим, то без знания CUDA не выйдет.
4. Опыт. Многие вкатуны, почему-то считают, что они охуеть какие умные, просто этого никто не видит, а тупые эйчарки не пускают к тех специалистам. Вот я бы их сениорам УХХ показал. Короче - нет, нужен опыт. Минимум года 3-4, и, в идеале, качественного, а не "улучшал систему логгирования в файл", "формочки на куте шлепал" или "какую-то хуйню писал, до прода так и не дошло".
5. Хотеть жить в Ереване
Вообще, если хочешь работать в топе-околотопе, то рецепт очень простой. Даже на мне сработал.
Пойми, что это все - марафон. Если ты, допустим, вкатишься в 25 лет (старик), в 27 устроишься в яндекс недомидлом, в 29 тебя нахуй пошлют на собесе в Нвидии, в 30 тоже, а в 31 устроишься - до пенсии еще 34 года ты будешь работать в лучшем месте, и у тебя будет охуенное резюме на будущее.
Планировать надо на несколько лет вперед вот так - и все получится. Бонусом - у меня друг к собесу в гугл готовился полгода, дрочил литкод и прочие все эти задачки. С треском его провалил, дрочил еще полгода - на второй раз прошел на L4 (мидл).
Он не ныл, что все вокруг пидорасы, что таких зарплат не бывает, что гугл с улицы не нанимает, что бычок насрал ему в рюкзак. Он сидел и дротил ебаные задачки. Делай так же (задачки, С++, лидерство на текущей работе) - и все получится рано или поздно
>Словил психологическую травму с этой хуеты.
Так и должно быть, это ж Александреску.
>Впервые пришёл прахраммировать и дали проект, написанный под большим впечатлением от этой книжонки. Ехали шаблоны через шаблоны
А это вполне может быть валидно с эджайлом под слабо обрисованные спеки. Шаблонишь универсальную ебаторию и потом специализируешь.
Когда понятно четко что и как нужно, то можно и без шаблонов, зачастую они излишни, и такая универсальность только мешает.
У меня тоже на одной работе первый проект сеньор за пару дней нашаблонил, а я дорисовывал, было... гм... интересно.
>вкатишься в 25 лет (старик)
А 35 летнему формошлепу на qt из НИИХУЯ есть смысл куда-то выкатываться или уже все, гроб, кладбище... Хотя до пенсии тоже ещё далеко.
>вкатишься в 25 лет (старик)
А 35 летнему формошлепу на qt из НИИХУЯ есть смысл куда-то выкатываться или уже все, гроб, кладбище... Хотя до пенсии тоже ещё далеко.
Я 23 у.о формошлеп, 3 года формошлепаю в том же НИИЗАЛУП, ощущение будто проебал все полимеры.
>1.
Соглы.
>2.
>(никто не требует быть спикером конференций, но бля, будь добр..
А много у вас таких "линейных" разрабов без имени в индустрии? Сам-то ты ведь не на рандоме залетел, а выступал с докладами на конференциях, т.е. уже довольно выделяешься среди толп.
>3.
Вот как его можно знать, если он буквально используется либо вами, либо парочкой ниизалуп? Нет, я могу это знать на уровне "писал свои проекты и что то там считал на гпу" но на собесах же будут ожидать более высокой компетенции?
>4.
Соглы
> Вот как его можно знать, если он буквально используется либо вами, либо парочкой ниизалуп? Нет, я могу это знать на уровне "писал свои проекты и что то там считал на гпу" но на собесах же будут ожидать более высокой компетенции?
Искать другие вакансии - их дохуя было открыто до кризиса.
> А много у вас таких "линейных" разрабов без имени в индустрии? Сам-то ты ведь не на рандоме залетел, а выступал с докладами на конференциях, т.е. уже довольно выделяешься среди толп.
Почти все у нас обычные, я на конференциях не выступал, хз с чего ты это взял. Только ходил тусить пару раз зрителем.
>>57010
В яндекс на пару лет, а потом искать дальше.
Еще добавлю, что в случае того же гугла, например - достаточно только языка, задачек и систем дизайна (на сениора) не просто так, т.к. почти все инструменты внутренние, и их невозможно знать с улицы.
>Почти все у нас обычные, я на конференциях не выступал, хз с чего ты это взял. Только ходил тусить пару раз зрителем.
Если я тебя ни с кем не перепутал, то ты нвидиа-кун тот самый.
Хз, я видел 2-3 доклада некоего чувака из нвидии на ютабе, чекнул его резюме и там информация совпадает один к одному с тем что писал про себя нвидиа кун.
Я понял о ком ты, нет, это коллега, который вместе со мной переехал.
В задании сказано, чтобы я определил выделенный конструктор в теле класса в заголовочном файле.
До этого он был определен в файле исходного кода и использовал метод Read, который определен там же. Когда я определяю его в теле класса в заголовке, он метод Read уже не видит.
Вопрос. Можно ли определив этот конструктор внутри класса использовать в нем Read, который объявлен вне класса и определен в файле исходного кода?
Что меня смущает, мне ридер предлагает read от другого заголовка, а этот не видит вообще.
Ну и как я полагаю, заголовочный файл тоже является файлом исходного кода. Но думаю меня все поняли.
Во-первых разберись с терминологией, что такое определение, а что такое объявление.
Во-вторых, пойми как работает компиляция в принципе. Можно сказать, что #include это просто копипаст заголовочного файла, потом идет компиляция разных cpp файлов, а потом полученные объектные файлы линкуются. На момент использования, функция должна быть объявлена.
Соответственно, есть One Definition Rule. Это значит, что во всех .h файлах может быть объявлена одна и та же функция Read, но определена (иметь тело, сам код) она должна быть только 1 раз, в одном .cpp файле.
Например
//mycpp.cpp
Read(istream&, SalesData&) { readfile();... }
//myheader.h
SalesData() { Read(); } //wtf is read?
Значит надо писать
Read(istream&, SalesData&);
SalesData() { Read(); }
Но в этот момент у тебя может возникнуть WTF is SalesData?
Таким образом ты получил циклическую зависимость (SalesData нужно Read, а Read нужно SalesData)
Но ты можешь объявить класс, не определяя его, таким образом компилятор будет знать просто что такой класс где то существует
struct Sales;
Read(istream&, SalesData&);
SalesData() { Read(); }
Так, я еще писал про линковку, представь себе что у тебя есть
//header.h
Read(istream&, SalesData&);
//file1.cpp
#inlude "header.h"
main() { Read(file, data); //тут компилятор не знает, а что же реально в коде Read - он только знает из объявления в header.h что такая функция есть
//file2.cpp
Read(istream&, SalesData&) { readActualFile(); }
Итого после компиляции у тебя остается
file1.o который суть header.h+file1.cpp, в котором есть вызов некой неопределенной функции Read()
file2.o в котором есть определение функции Read()
И линковщик их объединяет в один исполняемый файл, указав что из file1 вызывается Read предоставленный file2
Во-первых разберись с терминологией, что такое определение, а что такое объявление.
Во-вторых, пойми как работает компиляция в принципе. Можно сказать, что #include это просто копипаст заголовочного файла, потом идет компиляция разных cpp файлов, а потом полученные объектные файлы линкуются. На момент использования, функция должна быть объявлена.
Соответственно, есть One Definition Rule. Это значит, что во всех .h файлах может быть объявлена одна и та же функция Read, но определена (иметь тело, сам код) она должна быть только 1 раз, в одном .cpp файле.
Например
//mycpp.cpp
Read(istream&, SalesData&) { readfile();... }
//myheader.h
SalesData() { Read(); } //wtf is read?
Значит надо писать
Read(istream&, SalesData&);
SalesData() { Read(); }
Но в этот момент у тебя может возникнуть WTF is SalesData?
Таким образом ты получил циклическую зависимость (SalesData нужно Read, а Read нужно SalesData)
Но ты можешь объявить класс, не определяя его, таким образом компилятор будет знать просто что такой класс где то существует
struct Sales;
Read(istream&, SalesData&);
SalesData() { Read(); }
Так, я еще писал про линковку, представь себе что у тебя есть
//header.h
Read(istream&, SalesData&);
//file1.cpp
#inlude "header.h"
main() { Read(file, data); //тут компилятор не знает, а что же реально в коде Read - он только знает из объявления в header.h что такая функция есть
//file2.cpp
Read(istream&, SalesData&) { readActualFile(); }
Итого после компиляции у тебя остается
file1.o который суть header.h+file1.cpp, в котором есть вызов некой неопределенной функции Read()
file2.o в котором есть определение функции Read()
И линковщик их объединяет в один исполняемый файл, указав что из file1 вызывается Read предоставленный file2
ООо недогнал, что можно просто название класса объявить. Теперь получилось. Спасибо.
Я не стал заостряться на исключениях.
как шарпист со стажем могу сказать и "да" и "нет".
На шарпе можно хуярить приложения просто с огромной скоростью, ты оперируешь более высокого порядка вещами ( там ебошишь и крутишь коллекции , делаешь выборки , транслируешь в линк, создаешь и обходишь классы на лету ). Но крестах есть какая-то хардкорность , прокачка мозга, некоторая красота ( header и cpp - это красиво, хотя похожая хрень partial есть и в шарпе, но никто не пользуется) .КОроче хуй его знает .
люблю обмазываться портянками с говном , да .. :)
Похуй, главное пиши
Да.
SDL2 охуенен.
Но вообще можешь хоть на чистом графическом АПИ писать, для простенького не требует больших усилий.
писал простенькую хуйню на директе и опенгле
Поясните, что за фокусы sdl2 с мейнами творит?
>Сдл это си
Как что-то плохое?
С плюсами полностью совместим, каких-то профитов не теряет, в чем проблема?
Вот если бы на дотнете или жабе было бы, тогда да.
Свою васянскую обёртку? Не, лучше буду SFML.
>в чем проблема?
Я вангую, что чел хочет написать игрушку чтобы набраться опыта в C++.
С сдл'ом опыт не тот будет.
Почему не тот? Ты тупо дергаешь методы либы, просто без пердолинга с низким уровнем. Если по-твоему надо низкий уровень ебашить, то ему никакая либа не нужна, если наоборот, абстрагироваться от графена, то любая либа подойдет.
Если ты про то что сишные методы сдл-а не очень дружат с стл-ом, то всегда можно обмазаться врапперами, для новичка полезно.
Почему в этом вашем таком охуенном и современном языке нет нуль-коляски?
Есть ли какой-нибудь способ получить общий листинг всех файлов в один в VS 2019? Т.е. допустим есть main.cpp, common.cpp и нужно получить один файл в котором #include "common.h" заменится на сам файл
Любой компилятор умеет выдавать препроцессированный файл, в случае с msvc это cl.exe /p
https://learn.microsoft.com/en-us/cpp/build/reference/p-preprocess-to-a-file?view=msvc-170
Не очень помогло, куча стандартной библиотеки мешает. У меня ошибка то что к одном модуле он не видит класс Item:
C2079"item" использует не имеющую определения структуру class "Item"
Несколько модулей связаны между собой по принципу каждый к каждому, как найти место где нужно объявить class Item;
Посмотрел интервью Константина Владимирова. Он говорит, что ядро Линукс надо переписать на C++, но Торвальдс сопротивляется прогрессу, потому что он фанатик. В то же время когда его спросили, если бы он был в комитете стандартизации, что бы он добавил в новый стандарт, он ответил, что не добавлял бы, а наоборот блокировал бы все нововведения потому что мы на самом деле еще C++11 не переварили. То есть что мы имеем, человек десятка три лет программирует на крестах, наконец изучил все тонкости, подводные камни, UB, тайные тропы, ему наконец стало комфортно на нем писать, но он говорит - все, АСТАНАВИТЕСЬ, хватит, кресты не резиновые. Такой ли уж Торвальдс фанатик после этого?
Это база. Кресты конечно ван лав, но обьективно в них куча ненужного говна, без которого было бы еще лучше.
Просто на крестах так не пишут. Зачем туда вообще передавали null? Сразу конструируй нужный объект.
Так все думают, а когда попадают туда - начинают срать с новой силой.
Сам бы всеми силами продвигал рефлексию.
А ещё есть expected
Это не крутейшая фича, это обычное свойство тьюринг-полных ЯП.
>Сам бы всеми силами продвигал рефлексию.
Ты бы и сборщик мусора для классических указателей продвигал.
- Референсы
- Темплейты
- Старых дедов
- Конструкторы
Ты сейчас будешь смеяться очень громко, но тут изобрели чип, который следит за правильностью выделения памяти в С/С++. Правда, программу придется перекомпилировать.
https://www.cl.cam.ac.uk/research/security/ctsrd/cheri/
Содомитю
Миллион различных проблем уберёт
Можно будет потом явное клонирование задать
Только представь, ты пишешь a = b и в 100% случев уверен что у тебя всё скопируется правильно
Это ли не мечта?
>Что скопируется?
b в a
а чтобы склонировать будем писать a = b.clone()
> не сконструировал
ну а конструирование у всех будет происходить стандартным способом Type{field:value...}
Попробуй Lua
> Как освобождать ресурсы собираешься?
Деструктором, его же я не убрал еще
> Как будешь копировать ссылки/указатели?
А ссылки убрал, а указатели по значению, хочешь дип копи? Явно копируй
Type construct() { return Type{field: value};}
Type a{field1: value1, field2:value2};
Type b = construct();
a = b;
Вот тебе пример двух инициализаций, тебе может показаться что я обосрался с construct и Type будет копироваться лишний раз, но компилятор как нибудь соптимизирует наверное
Проблема смартпоинтеров в том что ими не пользуются. Сделай обычные пойнтеры умными шоб все охуели!
Ты реально только что С
Бурбулятор.
Попробуй так, обмазавшись стековерфлоу и сппреференсом, может сможешь.
Это плюсы, тут новые фичи не для, а потому что.
Как в проекте заведено - так и наводишь.
Я могу ошибаться, но по моему тут речь о том, что создается временный объект, на который ты берешь ссылку, но это нельзя делать, потому что объект уничтожится.
Вот если бы ты написал
auto temp = Govno(mocha);
auto g = govno.Combine(temp);
Тогда, вроде бы, сработало бы.
Ну а если ты напишешь
auto temp = mocha;
auto g = govno.Combine(temp);
То опять не сработает, уже потому что как ты сказал надо 2 преобразования.
Работает все кроме средней перегрузки. И в ней проблема в отсутствии константности аргумента. У меня реально ступор на этот счет.
Параметра, точнее
Ну я написал что по моему мнению происходит.
Компилятор видит Combine(mocha)
mocha это string. String передать в Combine нельзя.
Значит он пытается вызвать Combine(Govno&)
Для этого ему надо сконструировать объект.
Combine(& Govno(mocha) )
Но проблема тут в том что объект временный.
Сразу после последней скобки он будет уничтожен.
Об этом пытается сказать компилятор.
Не ссылку, а константную ссылку было бы можно, тут я не помню. Может быть это продлевает время жизни объекта.
Ты прав.
Так и навожу, хороший совет.
Избавляет от конфликта имен в конструкторе.
Иначе для параметров конструктора придется выдумывать синонимичные имена. И кроме того, что необходимо на пустом месте что-то выдумывать, это еще и мудизм, когда одно и то же называется по разному.
Можно конечно делать как на пикрил 2, но это стремно как-то.
return std::move(x) + 2;
или
return std::move(x + 2);
Нигде что-то не получилось найти ответ.
Первый вариант перемещает х в никуда.
В случае с int перемещение не имеет смысла, как и для других базов типов.
Если у тебя х такой тип, что он может складываться с int, и при этом у него определены операции перемещения, то пиши как во втором варианте.
Алсо, случай с return - специальный. Скорее всего тебе вообще там не нужен вызов std::move(), т. к. компилятор все сам оптимизирует, а ты ему только мешаешь. Гугли RVO.
Справедливо.
>на пикрил 2, но это стремно как-то.
Почему? Единственное, где можно наебаться - это если забудешь написать в конструкторе this.someMember = someMember. Зато в остальном везде будет чистый код - и внутри методов, когда будешь непосредственно обращаться к полям, и аргументы нормально называются.
>Избавляет от конфликта имен в конструкторе.
Но его нет, если ты используешь список инициализации.
И можно наоборот - для входящих параметров пометку типа in_ или вроде того, а мемберы остаются без помарок.
>Единственное, где можно наебаться - это если забудешь написать в конструкторе this.someMember
Ну вот ты уже забыл, что надо не this.member, а this->member.
>Почему?
Больше помнить, больше думать - зачем?
Я вообще совсем недавно и чисто случайно узнал, что так можно. И не уверен даже на 100%, что это стандартное поведение, т. к. лень проверять. Вроде работает, но не встречал, чтобы так писали.
+ есть правило в core guidelines, говорящее "P.1: Express ideas directly in code".
>>60173
>если
Решение, которое работает всегда, лучше, чем решение, которое работает "если". Так мне кажется.
>И можно наоборот - для входящих параметров пометку типа in_ или вроде того, а мемберы остаются без помарок.
Технически Ok, но имена параметров - это часть интерфейса, они читаются клиентом (через подсказки IDE, например). Клиент всегда имеет дело только с параметрами и не имеет доступа к приватным полям. Для него эти пометки лишние.
Ты хотел сказать this->somemember или (*this).somemember? Кстати липман пишет, что так стараются не делатт.
Конструктор как-то отменяет, что this - указатель?
Не, мне сейчас нужно. Не хочу вкатываться по дедовским методичкам и осознать потом что выучил старье.
Ничем не могу помочь, сам только 17ый ковыряю
Ничего. Это не стандарт для вката.
Вкатываешься в C++11/14, вся основная модернизация произошла там.
Потом читаешь в статейках что добавили/поменяли в C++17/20/23. Там уже будет не так много и в основном это фичи типа о, мы там в 14 недодумали, а теперь эта конструкция будет работать и в таких случаях.
Так тебе на работе все равно говно легаси вычищать придется, а как ты в нем разберешься не выучив старье? Тут проблема то как раз в том, что надо не только свежий стандарт знать, но и все предыдущие и в чем разница.
Так это они еще стараются не ломать. Просто из за того что много конструкций, их комбинаций еще больше.
Нет идей. Посмотрел в компайл эксплорере, ассемблер одинаковый. Попробуй отправить еще раз, может тупо баг какой то вылез.
Хотя, нашел одну лишнюю инструкцию в варианте с size_t, и вызывается она внутри цикла
cdqe
Если собирать БЕЗ оптимизаций (-O0)
Может быть там сделано так чтобы все были в равных условиях и сравнивался алгоритм программиста, а не оптимизации компилятора?
Бенчмаркать мне лень честно говоря. По идее это быстрая инструкция.
Позапускай несколько раз и увидишь что компьют тайм меняется. Этой хуйне от литкода верить нельзя.
Сделай компилятор с++ на с++, вот тут все охуеют.
NetHack написан на Си и выводит символы в терминал.
>Игру это слишком серьезное что-то.
Я тебя умоляю. Не шибко сложнее сетей.
>Не хочется еще с графончиком ебаться
Ну на крестах тут не так элементарно как на юнитазе, но ты можешь и аски-арт ебануть, или какую-нибудь либу вроде сдл подрубить, накидать копипастную рисовалку за полдня и ебашить логику. Графен что-то сложное если ты напрямую на каком-нибудь опенгле хуячишь, и то там больше просто затраты времени на копипаст.
Не то скинул
Нет, этого мала
Лол. Поешь говна просто.
1. Давайте использовать кастомный заголовочный файл так чтобы было непонятно откуда реально берутся те или иные функции и как работает консольный ввод-вывод.
2 Так короче тип double длинее int. Операторы посмотрите в кривой схемке, щас бы вам даунам еще за них пояснять. И вообще простые типы данных это скучно, давайте просто не будем о них.
Отлично, вот теперь у нас есть время поговорить о важном: самолетах, кораблях и медицине.
3. ООП я вам поясню на основе велосипедной либы которую вы никогда не будете больше использовать.
4 Вместо пояснения ООП целый раздел поясняет эту самую либу на уровне линий, точек и кружочков, периодически использует поинтеры и коллбеки не заморачиваясь с тем что нигде это не объяснял
Сразу приучает к тому, с чем ты столкнешься в легаси.
Мне кстати вообще не зашла его книга. Хуже только яндекс практикум.
Да и страус помер.
Александреску, разумеется.
Для вката читай Прату. У Стивена Праты именно буквально учебник по плюсам, просто читаешь, выполняешь упражнения и так осваиваешь без особой мозгоебли, там все понятно и просто.
Про Александреску я пошутил, если ты не понял.
В хедере нельзя сделать все что угодно. Например без ебли завести глобальную переменную (один раз).
Второй момент - нельзя сделать статическую либу с которой линковаться. У тебя каждый раз будет инклюдиться хедер и удлиннять время компиляции.
А если я уже достаточно взрослый, чтобы смотреть на большие мужские шаблоны?
а есть еще что? это я в принципе и так знал, а глобалs заводятся без проблем с constepr
Я имел в виду такую ситуацию условно
header.h:
static int i = 0;
laba1.cpp:
#include "header.h"
i = 1;
laba2.cpp:
#include "header.h"
i = 2;
Почему маразм? В библиотеке может быть какой-то стейт или синглтон.
В случае с cpp, все будет работать
lib.h
extern int state;
lib.cpp
static int state = 0;
laba1.cpp
#include "lib.h"
state = 1;
laba2.cpp
#include "lib.h"
state = 2;
До самого нужного не успею на другие сходить
чекнул спс, как там стоят пути кланга вперед пути гцц, знаешь где прописать что гцц первее искалось?
опять же собирает гцц правильно, это только глангд ошибается.
Липпмана читай.
>В шапке старье
На русский ничего и не переводилось с тех пор. Страуструпа "The С++ Programming language" 4-го издания вроде бы перевели, но это не для вката.
Литкод мне помог. Решал задачки, в каментах/решениях видел алгоритмы/концепции о которых спрашивают.
Раньше почему-то плавал в сложностях, немного порешал и заметил что сложности пишут и сразу запросто запомнил что линейно, что логарифмично, а потом как раз и спрашивали, и я сразу отвечал, а не как раньше "ээ мээ хузнаит квадратично наверна" - тупо не запоминал.
Я уже написал.
А. Ноним. "Как вкатиться в плюсы".
Там одна страница, на ней написано "Никак".
Это продолжение бестселлера "Стоит ли вкатываться в плюсы", в котором одна страница на которой написано "Нет".
Это как то систему сборки фиксить надо
Вот топовая книжка по вкату в плюсы.
300 страниц, посвященная способам инициализировать переменную.
Вот такую интересную книжечку нашел, еще и опенсорсную и бесплатную.
https://github.com/changkun/modern-cpp-tutorial
Она конечно больше для переучивания сишников и си-с-классами на современный лад, и сам 23 стандарт еще не затрагивает, но полистал вроде норм и по делу.
Мне чисто плюсы проверить надо
Не надо еще забывать что фичи стандарта добавляются одна по одной и не всегда целиком.
23 еще мало доделан, 20 получше, даже в 17 еще не все готово, и даже в 14 можно найти частично недоделанные фичи.
о, как в жеэсе - спецификации новые я дам, еще нужна их поддержка везде, поддержку я не дам
Да, нахуй надо! И ассерты тоже в топку! И трайкетчи! Падения, ошибки и эксепшены должны быть неотлавливаемы и выпадать только в продакшене!
Это что? Не понимаю.
Вот например инту я могу присвоить 2147483647 - это его максимум.
А флоату что?
Смутно думаю что чем больше целых, тем меньше будет дробной части.
Хорошо, тогда так:
xxx..xx.yyy
Вот допустим мне хватит тысячной дроби yyy. Тогда какое максимальное целое там будет?
Как это самому посчитать?
Просто у меня расстояние в метрах хранится в флоатах, а я даже не могу понять какое максимальное расстояние я туда могу записать. 100 метров? тысяча метров? десять тысяч? Сколько?
у меня так
Публичные методы с большой буквы.
Публичное поле с маленькой (это чтобы не конфликтовать с каким-нибудь векторами/матрицами/цветами - где уже привычно x/y/z с маленько)
Приватный метод также с маленькой чтобы их различать
Приватное поле с m_
p.s. тем кто против префикстов у полей, типа IDE умная, и нахуй это не надо - я много раз себе колено простреливал на этом - кода заносил данные не в поле класса, а в локальную переменную внутри блока - очень весело такую херню потом отлаживать
Сколько в мантиссу влезает цифр - столько и можно независимо от того, где разделение целой и дробной частей. Для флоата где-то 7-8 цифр, для дабла около 15.
Есть стандарт IEEE 754, где под мантиссу флоата выделено 23 бита, а для дабла - 52 бита. log10(2^23) ~= 6.92, log10(2^52) ~= 15.65. Загвоздка в том, что стандарт C++ не указывает, что реализации должны юзать именно IEEE 754, так что как повезёт.
Твой вопрос напомнил о шатающихся вертексах в ранних триде играх.
Там еще assume завезут. Способ расставлять UB ковровыми бомбардировками.
получается, что с помощью цэ++ можно прострелить себе ногу, это просто возможность, но идейная дорога
не просто возможность*
Это уже похоже на какой то саботаж.
Итого C++23 вместо убирания UB ввело еще и ТРЕТИЙ (кроме std::unreachable, [[assume]]) способ его получить.
Добавили std::expected для обработки ошибок.
Нюанс в том, что если ты забыл проверить result.has_value(), и обратился к value = *result но у тебя ошибка, или к result.error() но ошибки не было, то ты ловишь UB.
Все правильно сделали.
ИИшечки теперь нескоро вкатятся в плюсы.
старое пародийное интервью со Страуструпом.txt
> прострелить ногу
Ну хуй знает, насколько нужно быть гением чтобы тут ошибиться
Очевидно эта штука звучит как какая то штучка для микрооптимизации
Чел, это несерьезно. Увидев такой код, я ожидаю ассерт в рантайме, и вообще хорошо бы ошибку типов в компайл тайме. А не сегфолт. Пример совершенно угребищный, но это скорее всего потому что этой хуйне и не придумать нормального примера, потому что она нахуй не нужна.
> я ожидаю
Ну молодец что ожидаешь, но схуяли это должно быть так?
Нужен ассерт, пиши ассерт
Нужна ебля с микрооптимизации пишешь анричебел
> не нужна
Тебе не нужна - не используй
Предложи пример, где такая оптимизация имеет смысл. В switch-е же нет обязательного default, значит там ничего и не подавляется, могли просто не писать default.
Но вообще советую в таких случаях пэперы напрямую читать
https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p0627r6.pdf
Пишешь документацию к generate_texture, где поясняешь, что невалидный xy приведёт к UB. Проблемы? Смысл-то от этой штуки очевидно есть, оптимизация сработает. В данном случае просто станет на одну ветку меньше в свитч-кейсе. Что в этом плохого?
Это особенно полезно, если ты пишешь реализацию стандарта какой-то библиотеки, например MPI. Там, где стандарт говорит, что будет UB - оптимизируешь.
Да, охуенно такое еще в либы пихать, чтобы вся программа юзающая либу становилась UB.
Нормальный способ - это писать концепт, шаблон, или хотя бы enum class, а не словами где-то предупреждать и вводить в 23-м году UB.
Не будет никакого уб, пока ты не сделаешь то, что вызывает уб. Или как ты себе это представляешь, код законтачился от std::unreachable, и теперь его трогать нельзя?
Если ты написал бред в духе деления на ноль, то кто ж тут виноват?
Это блин пример, которым мотивировали добавление фичи в стандарт. Более нормальных примеров и нет.
Или нет, лол
Есть какой-то роад мап? Сегодня вечером начал читать 'beginning c++ through game programming 3th edition '(4ый не нашёл, если есть ссылка - кидайте).
Всё правильно делаю?
И вообще, я же сказал - хобби. Игры можно на каждом втором языке делать. Какая нахуй разница, что я учить буду?
Годот, анрил, юнити, библиотеки, перформанс, апи. И вообще, хули ты меня из спп треда своим с шарпом гонишь?
Хорошее начинание. Книгу не читал, но осуждаю потому не могу ничего о ней сказать. Раз для новичков, то почему бы и нет. Готовься много гуглить и лазить по всяким cppreference.com, stackoverflow.com и прочим двачам. Задавай свои ответы и охуевай вместе со всеми.
>Готовься много гуглить и лазить по всяким cppreference.com, stackoverflow.com и прочим двачам. Задавай свои ответы и охуевай вместе со всеми.
Да у меня были когда-то знания в веб-верстке но все улетучились уже давно, мне это даже нравилось.
Это весьма хорошая книжка, но к геймдеву она относится почти никак.
Читал ее сразу после Липпмана, прочитал за неделю. Хороша она тем, что дает законченные проектики с какой-никакой иерархией классов, в которых можно поковыряться нубу.
>Есть какой-то роад мап?
Отложи эту книжку, бери Липпмана. Приходи годика через пол.
C/C++ тупо лингва-франка гейдева: библиотеки, книжки, лекции, исходники игр, движки, практически все на C/C++.
С# ограничивается комьюнитями Unity.
>C/C++ тупо лингва-франка гейдева
Только вот реальные инди игры доведенные хотя бы до бетки это в 99 процентов случаев будет Юнити.
Тут больше вопрос в том чего ты стоишь, а не стоят ли того плюсы.
Потому что если бы ты хотел - то уже начал учить. И не важно что, а не вопросы глупые задавал. Как можно ответить на вопрос 'стоят ли или нет'. Бля, конечно стоят, как и любой другой язык программирования.
Это. Быстро и доступно разжевывает, дальше уже с каким-никаким пониманием вопроса можешь копать.
> как и любой другой язык программирования
Такие как брейнфак или эпл бэйсик?
Не любые. Эзотерику не стоит. Легаси не стоит (первым языком) учить. Бестиповые не стоит
Юнити-поделки - это отдельный жанр.
>99 процентов
Во-первых, ты преувеличиваешь;
во-вторых, нет смысла лезть в эту нишу с такой конкуренцией.
Единственный плюс у C# в том, что если мечты взять штурмом гейдев не сбудутся, то будет проще найти работу с таким багажом.
Я обобщил. Говно в учёт не брал.
>Юнити-поделки - это отдельный жанр
Это абсолютное большинство всех игр на стиме. Исключение только AAA игры c сотней разработчиков.
>Такие как брейнфак
Не является языком общего назначения. Не имеет выхода на функции ОС.
>эпл бэйсик
Хз о чем ты, но на Visual Basic .NET можно пилить абсолютно тоже что и на любом другом языке.
>команда из 120 человек
Очевидно что да. Топовый уровень не обязательно значит топовый графон, огромные затраты на маркетинг тоже показатель.
Плюсы это буквально монструозная надстройка над Ссями.
Для того чтобы выучить плюсы нужно выучить большую часть того же что и для Си, а потом еще и специфичную для плюсов кашу из темплейтов.
Хз какие ты тут нашел бонусы в качестве первого языка.
Инди пилит не сыч, а команда, не зависящая от издателя. На собственные средства то бишь.
Доооо, точно так же, если пишешь канкуляхтур или поиск палиндрома для универа.
Всем уже понятно, что ты не писал на этих языках в какой бы то ни было достаточной степени, не позорься дальше.
>Вот стим и превратился в помойку.
Это называется малобюджетные игры. Т.е. именно то что будет делать любой анон если вкатиться. И да, продавать такие игры тоже надо уметь.
>так и что по итогу? учить плюсы или нет? стоят того?
Если хочешь делать именно игры - учи С#и 3D
Если хочешь пилить движки и библиотеки для игр - бери C++
Специфическая подача, тараторит быстро и многое поверхностно объясняет. Копать после его роликов надо много. Но с другой стороны важные ключевые моменты затрагивает, в толстых книгах эта инфа была бы размазана очень тонким слоем.
Это ты не писал, только тот кто не знаком с обоими языками может такую хуйню спороть (или кодил на них в девяностых).
После 12 лет работы в одиночестве, работы в команде в шестерьмя мужчинами, повторного уменьшения до команды из четырех мужчин, и страданий из-за ужасной катастрофы поиска пути для обновления в 2015… мы продолжаем идти до конца и,наконец, дошли до версии 1.0.
Dwarf Fortres между анонсом в стиме и релизом прошло года два. На момент анонсы игра была уже давным давно готова.
Dwarf Fortres писана на сях.
Тут как посмотреть. С одной стороны какие-то невменяемые сроки. С другой стороны, инди-бояре могут себе такое позволить.
Не, это у него название студии из шестерьмя мужчин такое.
Чел прав, за джавоговно не скажу, но про си по факту. Боьшее отлисие плюсов и си это компилятор. Все что в плюсах, вообще все базируется на сишных фичах. Даже те же темплейты, ужастно убого но реальзуются сишными макросами.
Есть ли такая книга по плюсам чтобы тебя вкатывали в классы, наследование и темплейты на основе создания реального проекта под какую-то бизнес задачу? Ну или онлайн уроки какие-то?
Ну справедливости ради С++ до 11 стандарта действительно в значительной степени был расширением сишки.
ну, пролистав несколько десятков книг по с++, скажу что такой книги не существует
но самые лучшие комплексные задачки в конце глав, имхо, у самого страуструпа в книжке "Язык программирования C++. Специальное издание"
липман отлично разжевывает, лучее изложение материала о самом языке с++ по сравнению с остальными учебниками
но большой минус - слабые и простенькие упражнения в конце глав не позволяют закрепить усвоеный материал
проблема в том что геймдев в россии мертв, его не существует
но если ты в других странах то окей
>лучшие комплексные задачки
Да ну, задачки без ответов это пустая трата времени. Проще уже что-то самому начать кодить.
ну до сво пока интел не свалил с россиюшки, работу там получали совершенно конкретные ребятки с известных кафедр известных вузов, дурачкам со стороны там было делать нечего
++98 стандарт никуда не делся, на нем все также можно писать программы в современных компиляторах. Просто указываешь -std=c++98 и все работает.
У меня есть пара подобных по SFML с примером разработки игры. Правда, главы там выстроены по фичам SFML, а не фичам C++.
Есть также 1 книжка по структурам данных и алгоритмам. Вот там выстроено по фичам C++ - классы, шаблоны, наследование. По собственно языку там краткие сведения, просто чтобы вспомнить. В принципе, можно рассматривать как один эволюционирующий проект, т. к. ранее написанный код активно рефакторится и используется.
Насколько можно ее рекомендовать, я хз. Она написана еще до 98 Стандарта, диска с исходным кодом кодом в интернетах нет, содержит опечатки, ошибки и антипаттерны. Но мне она, как ни странно, именно этим и зашла. Ты не просто списываешь примерчики, а думоешь и рефакторишь. Для моих знаний получился околоидеальный баланс между самостоятельной работой и повторением за авторами.
Но все эти книги не заменяют базовых учебников по плюсам.
>Есть также 1 книжка по структурам данных и алгоритмам. Вот там выстроено по фичам C++ - классы, шаблоны, наследование.
Что за книга, анон? Первый раз слышу, хотя скачал уже наверно кучу разных книг по алгосам от Вирта до Седжвика.
Спали хоть название.
>98 Стандарта
Да пофиг, классы с тех пор остались классами.
>Вот там выстроено по фичам C++ - классы, шаблоны, наследование.
Лол, ты про Александреску штоле?
А я так и не нашел, где ее скачать. Исходники нашел, содержание нашел, а саму книгу нет.
Она сильно отличается от первого издания. Например, исходники от нее вообще ничем не помогли. Охват материала +/- тот же, но в остальном все по-другому.
Понял. тогда гляну после этой книги. А что-то промежуточное есть между липпманом и Beginning C++ Through Game Programming? Я в основном во время практики обучаюсь, а не во время чтения, т.е. мне необходимы какие-то задачи, а сам задачу придумать - чё-т фантазии не хватает, либо она оказывается слишком сложной/слишком лёгкой. Причём спрашивать в треде задачи - такая же тема, либо слишком сложно и приходиться что-то гуглить (в итоге находится полноценное решение - и какой смысл от решения задачи тогда в кач-ве обучения?), либо слишком просто и нет прогресса (хотя в этом случае хотя бы запомнить что-то можно).
Может какие-то подходы можете посоветовать определённые помимо книг? Ну к задачам и их решению. Чтоб не оказываться в двух противоположенных концах
>>66224
А еще можно писать съ дореволюціонной орѳографіей. Объ актуальномъ языкѣ это ничего не говоритъ. C++ сейчасъ сильно отошелъ отъ своихъ корней, объ этомъ рѣчь.
Судя по иллюстрациям, аффтар шарит в говнокодинге. Я думаю, ему бы лучше по жабоскрипу писать книги, там актуальнее такому учить.
Ну анонче, Библиотека Гены же ну)))
имхо кресты в этом плане жощще. в жепаскрпте всего лишь говноед-комбо из динамикопараши и неявного приведения типов (а чо такое тип? я жсмакака))0) +еще пара граблей
цпп же берет количеством говна которое хрен выучишь и гарантирует что рано или поздно ты таки оторвешь себе обе ноги по самые яйца
имелось в виду задания на программирование, типа реализовать хешмпап c stl-интерфейсом и подобные у него программиские задачи
>У меня есть пара подобных по SFML с примером разработки игры.
А годнота там есть в твоем списке, что-то не из серии Packt?
Нет, плюсы четко себя ведут, если не нарываться на УБ, там какая-никакая логика есть, а вот чтобы на жс кодить надо отринуть логику и принять безумство.
Издают ноунеймов штампующих книги по вопросам в которых не разбираюся?
Use Qt, я вот на нём говнокодю. Понятия не имею, как на плюсах написать что-то асинхронное, а тут просто сигналы-слоты дрочулькай.
Оно не про плюсы. Прочитал все книги несколько лет назад и могу вспомнить из них практически нихуя.
Qt-говнокодер
Ну давай расскажи мне как там бурно развивается десктопный дотнет, на который уже сами майки забили.
>Что ты делаешь на Qt?
Пилю клиент-серверную приложуху. Сервер по сетке работает с железками, кладёт данные в БДшку. Клиент к нему подключается и может смотреть, чё там с железом и с БДшки запрашивать всякие данные.
Всегда думал, что draw.io существует только в виде сайта. Сайт, понятное дело, на жопаскрипте.
Дык десктопная приложуха поди и есть тот же сайт, только локально. Ну, мож с какими подкрутками-добавками.
Ебаный стыд.
>>Весь код приложухи можно просто посмотреть в блокноте
Ну неси тогда сюда код десктопного дискорда, даун ебаный.
>не знает что код электрона это просто скрипты
Это ты походу даун безмозглый.
Принес тебе за щеку, проверяй.
Пиздабол, неси сюда код дискорда который на электроне написал или уебывай с треда к хуям.
>код электрона это просто скрипты
И что что это джаваскрипт, ебанутый? Мобильные приложения на реакт нейтив это тоже жс, может и их код тоже заодно посмотришь, клоун блядский.
>>Весь код приложухи можно просто посмотреть в блокноте
>Ну иди посмотри
>Кода так и не увидели
Что и требовалось доказать что сын тупой шлюхи способен только пиздаболить и не разбирается даже в базе
Иди нахуй, обоссаный
>ебанутый сын шлюхи собрался смотреть код через блокнот у discord.exe
Бля, ты просто тупейший хуесос. Я думал хотя бы про декомпилирование спизданешь что то, хотя это и с плюсами/qt сделать можно.
Просто ебучий урод, пошел нахуй.
>Весь код приложухи можно просто посмотреть в блокноте
Нельзя. Во первых - даже если можно то это нарушение копирайта и тебя выебут
Во вторых - практически любой известный мне скриптовый язык можно скомпилировать в байткод для VM, и в таком виде он компактнее, быстрее загружается и в добавок для того чтобы его спиздить его нужно декомпилировать, а декомпиляторы для таких вм пишут гораздо реже чем для условных С/С++ если ты не на шарпах и джаве пишешь конечно
В любом случае если ты можешь его спиздить - то точно так же можно проверить что ты его спиздил и штрафануть твое тупое ебало на пару лямов
мне уже расчехлять пасты из дотатреда или еще постов 20 подождать?
Расчехляй. Только перепиши их под контекст.
Уебище, подобное тебе, должно еще на этапе зиготы самым жестоким образом уничтожаться.
Что ты пытаешься доказать, прилюдно спустив штаны и навалив огромную кучу дерьма.
Иди нахуй отсюда.
>>68055
Как-то очень неуверенно ты это говоришь. Так вижу трясущиеся руки, спешащие расстегнуть ширинку, и не успевающие. Темное пятно расползается по одной из штанин и в нелепой попытке сохранить лицо ты выдавливаешь ломающимся голосом: "иди нахуй))". Даже любопытно, что ты дальше будешь делать.
Счастливо. Спасибо за пасты, приятно отдохнуть.
Посиб, сохранил. Очень много, страшно. Заценю после книги. Там прям всё идеально подходит, что под сабжем c++ и геймдева?
Если есть какие-то советы - готовы выслушать.
всё. разобрался. я думал что не надо в main() заворачивать. Получается всегда надо функцию делать?
Пиздец. Какой урод капчу придумал новую...
Так я ток вкатился. Ещё и на автомате Do с большой написал.
Теперь допустим я делаю класс, который при достижении определенного уровня персонажа добавляет ему соответствующие фиты. Получается в этот класс должны инrлюдится все соответствующие заголовки. А список может быть достаточно большой и таких классов может быть несколько под разные события. Карочи это ебля какая-то.
Я вот думаю, может в заголовке базового класса прописать заголовки всех наследников и просто его пропихивать каждый раз в инклюды?
Тогда еще надо будет в нем делать объявление наследников тоже. Правильно я понимаю?
Забейте, анриал уже послал меня нахуй.
Ты так нихуя не запомнишь, вкидывайся успокоительным и читай внимательно.
Можно придумать механизм создания "фита" из некоего набора параметров. Наборы хранить в БДшке или ещё каком внешнем ресурсе и оттуда читать при наступлении этих твоих событий (оно тоже один из параметров фита).
>жопаскрипт повсюду, как аллах
што поделать
рак кожи тоже начинается с маленькой красной родинки, а заканчивается пиздецом по всему телу
>приятная работа, можно не думать
Думать надо, но над "архитектурой", т.е. над тем, как облегчить самому себе жизнь путём организации объектов, их взаимодействия между ними, структур данных, БДшки и прочей хрени, чтобы не путаться и "фичи" добавлять было не сильно сложно. В общем, думание (и велосипединг) происходит по собственной инициативе.
Платят соответственно (мало), сотку с копейками. Вроде и надо стремиться к большему заработку, но это ж придётся не своё говно на расслабоне пилить, а какое-нибудь легаси, ещё и наверняка в более жёстких условиях (делай вот так, приходи-уходи вовремя, вот тебе задачи на неделю, отчитаешься о выполнении и прочая паибень).
Блять, такое ощущение что я знаю проект над которым ты работаешь.
Но могу ошибаться, таких производств тысячи.
Расскажешь что нить ещё о проекте?
Да, тебе нужен dependancy inversion.
Это значит да или нет?
Нет здесь перекатов.
Я мобилоблядь с щяоми 5 летней давности, лагов не обнаружено
ну просто интересно было
типо номер треда 141 и он не бесконечный, поэтому думал может всем просто лень что ли
Он нахуя x и о записал туда? Это же просто картинка выйдет, а не крестики-нолики.
https://www.w3schools.com/cpp/cpp_arrays_multi.asp
тут вроде понял на примере корабликов. А нахуя он делает то, что делает? Вот продолжение. Он просто картинку решил сделать?
А какая разница? Он туда мог и 0, 1, 2 записывать, и 'p', '}' и '»', и похую, надо три разных значения, так что булом не обойтись, а если сразу "Х", "О" и " " писать, то вывод становится тривиальным.
Так он просто картинку делает, получается? А нахуя? Чтоб показать просто?
Ладно, хуй с ним. Другой вопрос. При создание второго cpp в исходных файлах в проекте появляется ошибка fatal error LNK1169: one or more multiply defined symbols found
Как делать больше одного спп файла, чтоб не создавать каждый раз новый проект? И чтоб их можно было запускать. Или это слишком сложно будет для меня на данном этапе?
Если просто функцию мейн переименовать, то он всё равно первый файл запускает. Может можно как-то выбрать какой компилить
>Так он просто картинку делает, получается? А нахуя? Чтоб показать просто?
Например. Его спрашивать надо.
>Ладно, хуй с ним. Другой вопрос. При создание второго cpp в исходных файлах в проекте появляется ошибка fatal error LNK1169: one or more multiply defined symbols found
>
>Как делать больше одного спп файла, чтоб не создавать каждый раз новый проект? И чтоб их можно было запускать. Или это слишком сложно будет для меня на данном этапе?
В студии? Можешь удалять спп из проекта (не удаляя файл), потом добавить который надо.
Вариантов куча, на самом деле.
>В студии? Можешь удалять спп из проекта (не удаляя файл), потом добавить который надо.
>Вариантов куча, на самом деле.
Пон. Спс.
Как подходить к такой задаче? Пишут про меморизацию а я не знаю об этом, не научился так думать.
> Как подходить
Как и обычно, сначала пытаешься решить самым тупым способом, в этом случае перебором
> меморизация
Не представляю даже что это
Мемоизация - сохранение результатов вызова функции для аргументов.
Задачу не смотрел, но видимо там будут повторяющиеся рассчеты, их можно хранить в ассоциативном массиве.
Прочитал. Гугли префиксные суммы. Видимо для каждой стопки нужна своя, потом искать сумму по ней.
Аноны, я почти сделал небольшой проект который генерирует хуйню. В основном старался использовать стандартную библиотеку.
Что дальше? Прикрутить к этому сервер? Сделать тг бот? Приделать гуи?
я вкатыш, не судите строго
Да, может иметь смысл. Для чего-то очень простого вроде банальной утилиты у которой нет потанцевала для расширения - может и не надо, а вот если расширяешь, особенно раз с гуи чесаться будешь, имеет смысл, особенно в качестве практики.
Алсо, если не пихаешь в гит - начинай, тоже полезная практика. Бранч для гуя, бранч для хуйни, бранч для малафьи, коммит коммит коммит, сразу видно что да как развивается. Даже для мелкохуйни гит норм тема. Необлизательно на гитхаб пихать, можешь локально репу иметь.
Понял, спасибо. Буду думать над ООП и паттернами.
Очень муторный, особенно муторный с Qt. Проще сделать нативное приложение для мобилки, чем заставить Qt одинаково работать везде. Но придётся учить говножабу/говнокотлин.
Может быть тогда можно связать жабу и плюсы? Чтобы я написал ядро на плюсах, а дальше дергал это из жабы. Есть такой вариант?
Типо пусть ядро крутится отдельным тредом/процессом, а гуй его дерагет. И гуй уже везде свой
Можно, в случае с Андроидом пишешь отдельную динамическую либу и подгружаешь её в приложение на жабе.
Это если приложение умное и всё делает само. Но если у тебя там обычный клиент-сервер, ядро лучше крутить на сервере и обращаться к нему через сеть.
Что не так с Qt на мобилке?
Одно время на выжил-студии вроде был ксамарин или как его там, для мобильной разработки, это нерилейтед?
замарин шарповый фреймворк
Я не понимаю, неужели GPT ничего не может тебе толкового сказать?
Этот нейроублюдок половину кода за меня пишет на питоне
Где я его задекларировать должен был? :hmm:
бля я тупой. понял. сори
А можно ли как-то упрощать лупы и прочую хуйню. Ну может их записывать как-то логически, чтоб не теряться? А то я всё никак не могу правильно этот луп сделать.
Либо я БАЗУ, ФУНДАМЕНТ забыл касательно лупов, т.к. два дня ниче не делал.
Спасибо огромное, бро!
Получается, что:
>когда выбор не равен слову И выбор не равен выходу
>тогда если напишем хинт - получим подсказу, иначе - извини, не понимаю.
>Предлагаем ввести снова.
А если:
>когда выбор не равен слову или выбор не равен выходу
то мы из лупа не выходим? Или как это понять?
Можете не объяснять, если лень, я завтра на свежую голову ещё подумаю.
>>74956
В том случае у тебя выход будет только если у тебя загадано слово выход.
Чтобы такое наловчиться понимать рисуй таблицу истинности.
СПАСИБО!
1. ctrl+f
2. ищу слово
3. Выделяю слово
4. ???
5. Все схожие слова выделились тоже и я могу их переписать с клавиатуры.
Чтобы схожие выделились тыкаешь мышкой на них.
Не понял что значит "переписать с клавиатуры". Переименовать эту переменную? Правой кнопкой - Rename, или когда курсор на ней жмешь Ctrl+R Ctrl+R (да, дважды, контрол можно не отпускать).
смотри, есть у меня tries. я хочу единовременно все tries на attempt переписать, например. Как это сделать?
А как правильно писать a!=b в таком форме? Не после ровно ставить или до или как?
Равенство не надо. Когда ты сравниваешь стринги у тебя два варианта - равно или нет. Сама операция сравнения стрингов это булевый результат. Потому сравнения записывай как булевы переменные.
Можешь их отдельно для прстоты вынести.
Понял. Спасибо ещё раз!
Мне пока что пиздец всё нравится, ток сложно бывает и ошибки какие-то постоянно лезут, я 80% времени ошибки выдаваемые визуал студио фикшу, а не пишу что-то. Надеюсь не заброшу через месяц и будет так же приносить удовольствие, а то у меня АБВГД
Уже минут 30 пытаюсь осмыслить и перенести всё в текст.
Тут получается "a ∧ b", как я понял.
А в каком случае получится " !=a ∧ !=b"? Когда мне надо инвертировать для удобства ПОНИМАНИЯ рез-тат?
UPD: после 10-го переписывания одного и того же куска кода оно таки заработало правильно. Что я изменил - в душе не ебу. Но вроде всё понял после переписывания происходящего в текст.
> Что я изменил - в душе не ебу. Но вроде всё понял после переписывания происходящего в текст.
Причём заработало оно в момент разбора этого в тексте, так что видимо я к чему-то таки пришел с помощью этого разбора. Понять бы ещё к чему. КЕК
https://github.com/arvidn/libtorrent/issues/3878
Это пиздец... Я думал vcpkg должно решить все мои проблемы. А нихуя.
Есть IDE под названием Visual Studio https://en.wikipedia.org/wiki/Visual_Studio которая существует с 97 года.
Есть редактор кода под названием Visual Studio Code https://en.wikipedia.org/wiki/Visual_Studio_Code который существует с 2015 кода года.
Это разные вещи.
>>75454
>Мне пока что пиздец всё нравится, ток сложно бывает
Преодоление сложностей приносит удовольствие.
>и ошибки какие-то постоянно лезут,
С опытом не проходит, просто ошибки другие, лол.
>я 80% времени ошибки выдаваемые визуал студио фикшу, а не пишу что-то.
Не знаю, поможет тебе или нет, но попробуй сменить парадигму, это не вскод выдает ошибки, а ты. Если не будешь смотреть "а где я ошибся", вместо "че этому блокноту от меня надо", то шансов развиваться маловато.
>Надеюсь не заброшу через месяц и будет так же приносить удовольствие, а то у меня АБВГД
Смотри гайды, читай книги, и ты пока не наработал логику и тебе это надо подтянуть.
>>75476
Разбивай все на атомарные куски пока что.
Вот для выхода, например, из цикла заведи булеву переменную. Потом отдельно булевы подо все. Пока не придет понимание и не будешь тернарники с приведениями писать, попробуй так, потом "усложняй" убирая булы.
Вот твой код, например, для выхода пусть имеет bool shouldContinue = true; который проверяется и меняется в цикле. Хотел shouldExit написать, но лучше положительные булы иметь, так более читабельно.
Я как понимаю в compile_commands.json хранятся только флаги для cpp файлов, а потом исходя из того откуда ты заинклудил хэдер для него выводятся
Но у меня это в большинстве случаев ломается, например хэдер неожидано забывает на каком стандарте плюсов я пишу, забывает где ему хэдера смотреть и тд
Как чинить????
>>75506
Бесконечные циклы это не уб, пустые бесконечные циклы - уб
> Бесконечные циклы это не уб, пустые бесконечные циклы - уб
Не правда. Даже на cpp reference есть пример не пустой
>Вот твой код, например, для выхода пусть имеет bool shouldContinue = true; который проверяется и меняется в цикле. Хотел shouldExit написать, но лучше положительные булы иметь, так более читабельно.
Понял, спасибо за наглядный пример. А это не будет работать в худшую сторону, что я не привыкаю к нормальному построению/не ищу ошибки? Или это как раз таки наоборот улучшит понимание?
А то я ведь могу налопатить дерьмовые циклы, который будет только на этому булине построены, которые идёт не пойми как и не пойми где.
Перефразируй что ты хотел сказать, я что-то недопонимаю.
> я не привыкаю к нормальному построению/не ищу ошибки
Разве твой постинг в этом треде это не поиск ошибок?
>А то я ведь могу налопатить дерьмовые циклы, который будет только на этому булине построены, которые идёт не пойми как и не пойми где.
Можешь, наверное? Надо конкретные случаи рассматривать. Я сделал грубо говоря то же самое что и ты, но вынес проверки из условия цикла, потому что мне показалось что так нагляднее и правильнее для процесса.
>Разве твой постинг в этом треде это не поиск ошибок?
Хорошо, тогда новый вопрос:
Как вернуться к началу цикла из конца после вопрос о продолжение игры? Обернуть ещё в один цикл?
Вызовы main() не подходит, т.к. мне надо учитывать счёт во время игры. С другой стороны я 100% могу вынести счёт за пределы int main(); делать return score, но это пока что слишком сложно и не понятно.
мой уровень интеллекта на ответе в капче
>Как вернуться к началу цикла из конца после вопрос о продолжение игры? Обернуть ещё в один цикл?
Если чё - не прошу ничего расписывать. Просто кратко, чтоб я сам всё написал.
>Как вернуться к началу цикла из конца после вопрос о продолжение игры?
Много способов разной степени ужасности.
Пик 1 пример как делать не надо.
>Обернуть ещё в один цикл?
Возможно. А лучше чуть перестроить логику. Пик 2 как сделал бы я.
>Вызовы main() не подходит, т.к. мне надо учитывать счёт во время игры. С другой стороны я 100% могу вынести счёт за пределы int main(); делать return score, но это пока что слишком сложно и не понятно.
Мейн дергать не нужно. Можешь вынести в функцию, но цикл тебе обязателен для повторной игры.
В цикле должна быть инициализация и проверка на повторение, далее вложенность это уже вопрос того хочешь ли ты вкладывать еще один цикл.
В целом не лучшая затея циклы в циклах иметь, большие уровни вложенности негативно сказываются на читабельности.
>>75592
Извини, я это заметил только после того как расписал. Так что не подглядывай на картинки, если не хочешь.
>>75593
>>75594
Вернуться в начало цикла можно... не выходя из него.
Да это так-то понятно более менее, просто мне ещё надо скор считать, и вот тут я встрял.
Если я определяю интеджер внутри цикла или проверки if/else - то он только внутри цикла будет существовать? И достать его от туда нельзя?
Т.е. мне надо всё, что внутри функции - обернуть в цикл while(cont == true), предварительно создав "int score = 0" и " int finalScore = 0" и "bool = true" вне while.
В while надо создать if( cont == true), где будет весь существующий код. В коде надо получить score из length и за правильное слово к finalScore - добавлять score, а для hint - делать score -= (score/2).
в конце предложить продолжить игру или прекратить, а так же cin >> cont
И вот тогда, после, создать else(т.е. если конт будет не тру), написать 'спасибо за игру' + 'финал скор'.
Звучит, вроде, логично... Но я уверен что я опять какой-нибудь андейфайнд словлю.
>Если я определяю интеджер внутри цикла или проверки if/else - то он только внутри цикла будет существовать? И достать его от туда нельзя?
Верно.
>В while надо создать if( cont == true), где будет весь существующий код
Необязательно. Как я говорил - большая вложенность плохо влияет на читабельность. Если "иф" больше того что в него не входит, то лучше обернуть то что в него не входит.
while(...)
{
if (cont)
{ / dohuya coda /}
else {/ final words/}
}
->
while(...)
{
if (!cont)
{ /final words/
break;
}
}
Ключевое слово "break" выходит из цикла.
О, я понял! Если в программе объявить ВСЕ переменные volatile, UB вообще никогда не будет!
И оптимизацию выруби от греха, дебажный билд в продакшен хуячь.
Какой смысл передавать выделенное через std::forward<>()?
Не знаю.
В каком месте я напиздел?
Два вопроса:
-При каких условиях getFileSize https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getfilesize запишет -1 вместо размера?
-При каких условиях readFile вместо содержимого запишет 0 в буфер?
При этом файл должен существовать.В тырнетах ничего найти не смог.
>-При каких условиях getFileSize https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getfilesize запишет -1 вместо размера?
If the function fails and lpFileSizeHigh is non-NULL, the return value is INVALID_FILE_SIZE and GetLastError will return a value other than NO_ERROR.
Вот скажите мне, залетному, в чем проблема настроить либу так, чтобы она нормально компилировалась? Это же даже не какая то экзотическая платформа, где надо писать свои дефайны, чтобы нужные функции дергать и дегко накосячить. А ебучий виндовс. Почему нельзя настроить сборку на винду, сука?
Очевидно потому что вцпкговно и прочее не нужное дерьмо.
Бери сорс собирай на здоровье сам, очевидно же.
Даже не поленился в новую капчу.
Вопрос не про случаи возврата -1, а про то как такого добиться.
Студентик, для laba2.cpp да, не надо.
Устроишься на работу первый раз - увидишь, что все дохуя как надо
Короче при таком коде - когда я что либо ввожу - программа офается.
По идеи у меня следующее:
контр = тру
whike cont true = делать следующий код
if cont true = делать основной код
спросить cin >> cont в самом конце if
Он запускает код по кругу и проверяет, если я пишу фолс - конт уже не тру, и он сразу переходит к else. Но на деле он просто офает код. Даже если тру напишу или любойдругой ввод.
Убрал вообще елс. он его тупо не выполнял даже.
Получается како-то не так cin >> cont взаимодействует?
А ещё у меня все cout начали подсвечиваться. Грешу на это и не понимаю как пофиксить. Появилось после добавления int tempScore = 0, если его удалить - то он всё равно подчёркивает ошибку
Блядь, дурдом. Удалил бул+инт+инт+инт в мейне и луп вайл-иф, после чего нажал ctrl+z и каут перестал подсвечиваться...
А cin надо постоянно cin.clear делать после каждого ввода? в коде другого чела увидел...
https://0bin.net/paste/+GSi2gWC#K8zNLRpyPhJuiE9UIOJC60skuJpJ-74NpRZbBbXk5Dq
Вот так вот сейчас код выглядит. Всё выглядит элементарно, как по мне. Но почему-то син не меняет тру на фолс и не хочет воспроизводить элс. Совершенно не могу понять, почему.
>>76344
Я бы помог, если бы понимал что ты пишешь.
1. Например гугл не очень помог, я сравнил и понял только то, что стоит под себя код переписать.
2. Стоит ли дальше в нём копаться и разбираться? Может стоит то же самое, но с нуля написать?
3. Стоит ли переписать его под себя? Потому что за основу взят код из книги и вот основной блок игры с циклами - мне не нравится, например, из-за тех же условий, например.
>>76349
Почему каждый раз встреча с этой частью языка вызывает у меня тошноту?
Поправляйте:
void f(T&& callable){
invoke(forward<T>(callable));
}
Как я понял, без форвард мы передадим лвалуе. Что может быть важным, если у функции есть cv-quals.
>если бы понимал что ты пишешь
Зачем форвардить вызываемый объект в контексте std::invoke() ?
Есть вообще такой сценарий, когда это имеет смысл?
Насколько я разумею, std::forward() нужен для того, чтобы перемещение сработало там, где это ожидается.
А у вызываемых объектов в принципе есть чего перемещать?
>>если бы понимал что ты пишешь
>
Бро, если бы понимал что ты пишешь - в целом о программинге, я ж порофлил. Я вообще нихуя не знаю и профан. KEK
Короче пойду какую-нибудь лёгкую программу на лупах писать, чтоб разобраться, что не так...
Лучше сразу на питонах.
Бля. Нихуя не понимаю.
Может кто какой-то сайт посоветовать, где я могу в залупах потренироваться/последовательности и пр. пр. и изучить всё это. Пока что мне это явно не даётся...
Да что угодно. Я пытаюсь понять, в какой момент мне вставлять cin > cont1, в какой момент мне просить 'выберите cont1 true or fales', и как при случае true - возобновить цикл while (cont1), потому что куда бы я эту хуйню с син конт1 не вставил - он её продолжать не хочет, а выходит из лупа самого первого и офает программу.
Почему когда я делаю cont1 = true - он её офает? Он же дожен рептить её. Я сто проц куда-то не туда вставляю что-то и не понимаю последовательности.
>>76457
Так у меня тоже самое ведь, пока конт = тру цикл работает. Только вот если я меняю конт1 на true повторно - то он выходит из цикла. Я вот этого не понимаю, почему он не продолжает работьать.
>>76460
>Я пытаюсь понять, в какой момент мне вставлять cin > cont1
В любой внутри вайла, но чисто логически лучше вставить в конец.
>я меняю конт1 на true повторно
Ты еблан и вводишь true скорее всего. Если бы ты внимательнее смотрел на мой скрин, то увидел бы, что я ввожу 1.
Вкатуны 2023. Итоги.
Пиздеееееец. Конечно я ввожу тру и фолс. я думал он их как тру и фолс может воспринимать, а, точно, он же тру и фолс как текст воспринимает.
бляяяяяяяяяяяяя
я с этим весь день ебался.
спасибо огромное.
>Вкатуны 2023. Итоги.
Да это чисто хобби новое, в индустрию вряд ли пойду, потому что я слишком тупой. я творческий рисовальщик, хотя хуй знает, что из этого может выйти
Это бесполезный дубликат, потому что у тебя while уже проверяет cont и если ты в цикле поменяешь его, вайл просто не запустится и ты сразу выйдешь из цикла. То что в else не будет выполнено никогда в принципе. Иф первый лишний, элс, соответственно, тоже. Можно второй иф оставить.
>>76319
Нет, цин тут ни при чем.
>>76321
Перестал менять условие которое позволяло бы выйти из цикла.
>>76322
Смотреть надо.
>>76349
У меня не открывается, картинкой можешь закидывать.
>>76354
>А когда такие вот затупы происходят - что стоит делать?
Метод резиновой уточки: попытайся подетально объяснить что делает каждая часть твоего кода воображаемому собеседнику, представь что объясняешь младшекласснику или тебя учитель попросил объяснить, или еще что угодно, лишь бы тебя разговорило.
>>76442
>>76454
>>76460
>>76462
Я не пробовал, но по-моему в бул считывать инпут приведет к тому что любой инпут будет тру. Считывай инпут в стрингу или чар и сравнивай буковку, например.
>>76472
А hui оно засчитало как false что ли? Никогда не пробовал в булы цином писать, занимательно.
>Метод резиновой уточки: попытайся подетально объяснить что делает каждая часть твоего кода воображаемому собеседнику,
Да, так и начал делать, сам до этого допердел. Вон >>76454 Но почему оно не работает, я так и не понял, пока анон не сказал совершенно очевидную хуйню >>76472
Короче пиздец я ебалн.
>больше четырех гигабайт
Пробовал и 4.5 и 9 гб создавать через fsutil, все равно нет.
>дебажишь что-то
Ну типа.
Я тупанул, имел в виду ровно четыре гигабайта. Точнее 0xFFFFFFFF байт. Тогда выдача размера совпадет с константой INVALID_FILE_SIZE
Ничего конкретно про поломку гетфайлсайза не могу найти, функция, видимо, работает весьма прямолинейно. Пока не пойму суть задачи - не знаю куда еще копать.
Суть - программа выводит одно если 0, другое если 1. Как получить 1 описано на скрине, т.е. должен выполниться тот if. А вот как этого добиться я пытаюсь понять.
Решил воссоздать этот код сам. Читаю через
HANDLE file = CreateFile("filename.txt", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
Получаю размер через
DWORD file_size = GetFileSize(file, NULL);
Диагноз - неверно получает размер файла, но таки выводит (тестировал на 8.38гб), содержимое судя по всему тоже выводит ибо он забит пустотой при создании.
Нет, просто напиши отдельную программу, которая будет блокировать этот файл, а из основной программы вызови GetFileSize() и посмотри, что она вернёт. Вдруг как раз -1
Отключил права чтения, ситуация пикрил.
На Visual C++ был такой же внешний вид, скорее всего это он и есть на борланде он бы кодил mouse.click:=true
Джунам и не только в реверсе шарить не обязательно имхо.
Короче я вернулся с новым пониманием проблемы. Мне нужно где-то найти код функций либы windows.h. Или хотя бы адекватную доку а не те полторы строчки, которые есть на сайте майкрософта
На пике дама выглядит будто у нее какая-то генетическая умственная болезнь, будто череп малформирован
Так люди и выглядели в 1600-1700 годы, как Мантенон
Я правильно понимаю, что цикл работает сверху вниз и даже если у тебя 10 if else if etc то они будут поочередно выполняться?
Как в таком случае сделать так, чтобы ЕСЛИ был использован хинт, - при введение word давал /2 очков? Куда и какую конструкцию вставлять? Добавить в if ещё один cin и if? Тогда как-то хуй пойми как оно работает. Хз короче, совсем запутавася.
Я долбавлю счётчик для хинта и сделаю две проверки ворда, если счетчик будет n, то даст /2 а если n1 то фулл скор.
Но нормальное ли это решение?..
>>77258
Во ебать, хуя я себя сейчас хорошо ощущаю. Прям как будто дофаминчика через шприц в мозг ввели.
Чувак... У тебя верстка, то есть отступы
Сбиты
Так легко не заметить, что уровни вложенности не такие, как ты предполагаешь
Проверь control flow
Мне не нравится когда вот так
if ()
{
blabla
}
else
{
Мне хочется так, а он автоматом первый вариант делает или хуй пойм как:
if asdfasd {
}else {
}
На самом деле мне похуй как - просто он постоянно как попало всё это делает из-за того, что я то интер удалю, то таб, то фигурную скобку не туда впендюрю...
Я так пишу:
для функций/классов открывающая{ на отдельной строке
для лямбд/ифов/вайлов -- на той же
вложенный блок, даже если это одна строка без {}
-- всегда на отдельной строке с отступом
все {} блоки -- тоже, что в фигурных скобках -- на один таб больше
хорошо, когда есть автоформатирование, которое так делает, если хирургией кода занимался
особенно заебись, когда at will хуячишь всему файлу автоформат,
и на большую часть кода это никакого действия не оказывает
PS в виме форматирование это =
== действует на строку
=5j на пять строк вниз
Первое лучше.
>он автоматом первый вариант делает
На копипасту или на ввод ';' он автоматом форматирует по заданным правилам форматирования. Можно этот автомат отключить.
А, я кажется понял. Мне выдаёт тот, что в конце, а не тот, что в if? а почему в if cout не работает?
кажется начинаю понимать. Это как-то с хинт каунтом связано... но если честно - не до конца.
у тебя вызывается унарный оператор плюс, который, как правило, просто возвращает свой аргумент
Ну там какой-нибудь неймд пайп или хэндл драйвера, или назвать файл "__SIZELESS_PLEASE__"
Как захочет
Так, частично понял, а более информативно рассказать можешь? Т.е. у меня возвращается значение плюса? Или что? ну += тоже не работает. Надо просто finalScore = finalScore + score написать?
Так в каком? У меня даже рабочий вариант есть, который я для упрощения писал - а разницу хоть убей не вижу...
hint это подсказка а не ответ answer;
угадать guess а не choose
делишь умножаешь нихуя не поняно
Чиво...
guess == hint
если guess (cin это - ввод) == hint { do something}
choose - вы выбрали слово и получили половину очков. Ну тут я просто на рандоме написал, т.к. в упрощённом варианте был не guess, а choose a word
Я тебе помогал и даже я уже не понимаю что твой код должен делать.
Распиши конкретно по кускам что за что отвечает, проследи за потоком и возможными вариантами ветвления (именно это всегда делать надо), проследи за переменными какая за что отвечает.
Вот мой вариант того как я понял твой код мог бы выглядеть.
Что особенно запутывает это вложенность твоего кода, кстати.
ну короче спасибо. ща анализировать буду.
Вообще мой код работает в упрощенном виде, просто когда я его перенёс - что-то забыл, видимо, и теперь не могу это найти.
(слева рабочий, справа - нет)
И ещё, почему он иногда начинает cout подчёркивать? При этом всё работает. Обычно это происходит, когда я ctrl+c ctrl+v делаю или условие в цикл вписываю и он подчеркивает, пока я его не сотру и заново не напишу идентичное...
Да, вот же на третьей >>77868
показано что у тебя мешанина со вложенностями.
Используй "форматировать документ" хотя бы.
Не помню как в коде, в студии Ctrl+K, Ctrl+D
>>77886
>bool continue;
>...
>continue = input == "stay";
Разберем:
>input == "stay"
либо верно, либо нет. И это значение ты записываешь в бул.
Тебе не надо проверять на второй стринг потому что у тебя не может быть третьего значения, бул только два хранит, и эти два могут быть либо твоя строка совпадает с одной загаданной нужной, либо нет, так что проверяешь на одну.
Если надо две строки проверять то два була.
>>77890
Бывает когда интеллисенс тупит. В ошибках не светится - продолжаешь как ни в чем ни бывало.
>>77892
Я думаю, что по коду ответ очевиден.
Пол года js где-то, ну и html+css до этого.
Но в какой-то момент js стал выглядеть убогим и трудночитаемым, с каким-то совершенно дикими условиями, где в ряд написано большое кол-во символов, в пермешку с дичью из css, из-за чего я начал путаться и сдался. Совсем не моё.
При этом когда копался в чужом коде по с# (просто ради интереса) - там такого не было и было всё более-менее понятно, даже без знания языка.
>>77894
>Да, вот же на третьей >>77868
А, блин. Не обратил внимания. Для меня это совсем не очевидно было.
>Не помню как в коде, в студии Ctrl+K, Ctrl+D
Сработало, спасибо.
>где в ряд написано большое кол-во символов, в пермешку с дичью из css, из-за чего я начал путаться и сдалс
например слайдер с картинками на сайте каком-нибудь. Как же эта ебала страшна выглядит.
А мне хотелось именно ПОНЯТЬ, а не к бутстрапу прибегать и пр. говну или как это называется.
Но я не про совсем обычный слайдер, если что. Не тот, который на анимациях затухания, а тот, который перелистывает длинную картинку и репит делает.
Что по C++ читаешь?
Не обижайся, но твои вопросы прям очень дилетантские, я бы посоветовал тебе без рофла зарегаться на чатгпт и спрашивать у него, аля упрощенный гугл. Оно тебе и объяснит лучше, и примеры кода напечатает.
Да вообще, ньюфагу какому-то плюсы помогают освоить, лучше бы спорили что УБ а что не УБ, да?
Чем этот ваш чат гпт лучше стэковефлоу того же? Он хоть ссылки на источники дает?
Как верифицировать-то плоды его фантазии?
Я вот даже если в книжке вижу ответ на свой вопрос, все равно не уверен на 100%, что этот ответ правильный. Даже если это книжка Страуструпа.
Чатгпт ускоряет написание простого говнокода, который тебе в падлу писать самому. Очевидно, что на сложных вопросах он не вывозит.
Так там везде говорится зайти на опенаи, а там не работает, акцес денайд почему-то.
А че я сделал? Мне-то за что запретили, пидоры? Только за то что я здесь живу? Вот они мудаки.
До C++17.
а буфер ты ему на 4Гб выделил чтоб читать?
это ide называется
самый простой способ - vs studio
не самый простой - LSP самый популярный щас clangd
для самых умных - grep
да нет
>это ide называется
>самый простой способ - vs studio
Хммм, а разве ИДЕ не будет уметь такое только в своих собственных проектах? Если я открою с помощью vs studio рандомные сишные исходники с гитхаба - он в них разберется?
>а разве ИДЕ не будет уметь такое только в своих собственных проектах?
Еще умеет в CMake проекты, а всё остальное через боль и превозмогание
Была такая хуйня, что допустим файл имеет размер в 3 инта, а мой массив в 4 инта. В итоге readFile возвращал пустой массив.
Вот какое решение данной проблемы мне предложил чатГПТ:
Если ваш файл меньше размера массива, то читать его можно следующим образом:
1. Открыть файл с помощью ifstream и прочитать его содержимое во временный буфер, которому выделена память по размеру файла.
2. Затем вы можете скопировать содержимое временного буфера в ваш массив чисел.
Например, если ваш массив чисел имеет тип long long (64 бита), то вы можете выполнить следующий код:
```
#include <fstream>
#include <iostream>
int main()
{
const std::string filename = "file.bin";
const size_t array_size = 64;
long long array[array_size] = {};
std::ifstream file(filename, std::ios::binary);
if (file.good())
{
// Определить размер файла
file.seekg(0, std::ios::end);
const size_t file_size = static_cast<size_t>(file.tellg());
file.seekg(0, std::ios::beg);
// Выделить временный буфер для чтения файла
char buffer = new char[file_size];
file.read(buffer, file_size);
// Скопировать данные из временного буфера в массив чисел
const size_t elements_to_copy = std::min(file_size, array_size sizeof(long long));
std::memcpy(array, buffer, elements_to_copy);
delete[] buffer;
}
else
{
std::cerr << "Failed to read file " << filename << std::endl;
}
// Вывести содержимое массива чисел для проверки
for (size_t i = 0; i < array_size; ++i)
{
std::cout << array << std::endl;
}
return 0;
}
```
Этот код считывает содержимое файла "file.bin" во временный буфер, затем копирует данные из временного буфера в массив чисел, используя функцию memcpy(). В конце программа выводит содержимое массива на экран.
Обратите внимание, что функция memcpy() копирует данные в байтах, поэтому мы умножаем размер массива на sizeof(long long), чтобы скопировать нужное количество байтов из временного буфера. Если размер файла меньше, чем размер массива, то скопируется только нужное количество байтов.
Была такая хуйня, что допустим файл имеет размер в 3 инта, а мой массив в 4 инта. В итоге readFile возвращал пустой массив.
Вот какое решение данной проблемы мне предложил чатГПТ:
Если ваш файл меньше размера массива, то читать его можно следующим образом:
1. Открыть файл с помощью ifstream и прочитать его содержимое во временный буфер, которому выделена память по размеру файла.
2. Затем вы можете скопировать содержимое временного буфера в ваш массив чисел.
Например, если ваш массив чисел имеет тип long long (64 бита), то вы можете выполнить следующий код:
```
#include <fstream>
#include <iostream>
int main()
{
const std::string filename = "file.bin";
const size_t array_size = 64;
long long array[array_size] = {};
std::ifstream file(filename, std::ios::binary);
if (file.good())
{
// Определить размер файла
file.seekg(0, std::ios::end);
const size_t file_size = static_cast<size_t>(file.tellg());
file.seekg(0, std::ios::beg);
// Выделить временный буфер для чтения файла
char buffer = new char[file_size];
file.read(buffer, file_size);
// Скопировать данные из временного буфера в массив чисел
const size_t elements_to_copy = std::min(file_size, array_size sizeof(long long));
std::memcpy(array, buffer, elements_to_copy);
delete[] buffer;
}
else
{
std::cerr << "Failed to read file " << filename << std::endl;
}
// Вывести содержимое массива чисел для проверки
for (size_t i = 0; i < array_size; ++i)
{
std::cout << array << std::endl;
}
return 0;
}
```
Этот код считывает содержимое файла "file.bin" во временный буфер, затем копирует данные из временного буфера в массив чисел, используя функцию memcpy(). В конце программа выводит содержимое массива на экран.
Обратите внимание, что функция memcpy() копирует данные в байтах, поэтому мы умножаем размер массива на sizeof(long long), чтобы скопировать нужное количество байтов из временного буфера. Если размер файла меньше, чем размер массива, то скопируется только нужное количество байтов.
Хочу переделать под себя проект c++
Я думал на гитхабе код выкладывают, а там еще и такое. Большое спасибо.
>remove_copy_if
Не, не то.
Короче проходимся по каждому элементу arr1, если predicate возвращает true, то перемещаем его в arr2. На месте где был этот элемент в arr1 будет пропуск. После того как прошлись по массиву arr1, все эти пропуски нужно убрать, просто перемещая "гравитационно"(хз как по другому назвать) элементы сверху вниз.
Блжад, это с 11 стандарта было и я этого не знал, ну что за биздедз. Есть какое-нибудь удобное овервью стандартов часика на четыре на каждый?
Да это ненужное же. Этот стл полюзуют только в туториалах, в проде все для себя свое пишут.
Копилот по умолчанию гтвно потому как рпботает удаленно.
Poe .com
Хуйня ебаная. Дропаю. Не смог собрать. Мб я тупенький. Найду что то другое
Делал по этой инструкции https://libtorrent.org/building.html
Проделал эти шаги (пик 1,2)
Команда была такая : BOOST_ROOT="" cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_STANDARD=20 -DCMAKE_CXX_COMPILER=clang++-15 -DCMAKE_CC_COMPILER=clang-15 -G Ninja ..
Сборка закончилась словами Creating library symlink libtorrent-rasterbar.so.2.0 libtorrent-rasterbar.so
В Cmake прописал
INCLUDE_DIRECTORIES(/home/username/programming/libs/libtorrent/include/)
add_library(libtorrent SHARED IMPORTED)
set_property(TARGET libtorrent PROPERTY
IMPORTED_LOCATION "/home/username/programming/libs/libtorrent/build/libtorrent-rasterbar.so.2.0.8")
Проект не собирается с ошибками undefined reference to ...
В симейке пропиши
Какие можете посоветовать хорошие книги по современным плюсам? Последние три почти четыре года работал на полузагнившем госпредприятии, где писали на диком гибриде С и древних плюсов и о вещах типа STL, auto или буста даже не слышали. Теперь я снова на рынке труда и осознаю, что мои знания и опыт в общем-то и нахуй не нужны никому, ибо устарели. Что читать, чтобы идти в ногу со временем?
Майерс, Саттер, Александреску + несколько докладов с cppCon посмотреть от ГЛЫБ и ГИГАНТОВ айтишечки.
>Александреску
И что же читать у сего титана? Блевотину 15-летней давности про шаблоны?
мимо баттхертнуты от этого пидараса
Шизоид, напихивающий шаблоны из-за болезней головы, а не для решения конкретных задач, ты?
>слооожнааа нипаняяятнааа пусть пишут прощииии мам скажи им!!1
Угомонись уже, скрипторебенок, что ты разнылся? Джуном даже не берут?
а сам-то что на двачах делаешь посреди рабочего дня? или дрочишь пока твои метапирамиды третий час конпелируются?
Да. За меня код пишет компилятор, пока ты изливаешь свои неосиляторские бугурты, скриптодикарь.
ровс - ряды. колумнс - колонки.
В первую очередь появляется массив 1 потом массив 2?
т.е. в моём случае
= {}
= {{'1'}}
= {{'1','0'...}
= {{...}{...}}
А то я чё-т запутався.
Поместим по байту в каждую клетку доски 100х100 (международные шашки).
одномерный стобайтный массив это int8_t value[columns]
так как принято смежные байты читать слева направо
двумерный 100х100 это int8_t value[rows][columns]
так как
typedef int8_t row[columns];
typedef row board[rows];
Как повернешь так и будет, главное чтоб никто не путался.
>А то я чё-т запутався.
Ох, щи-
Контейнер первого порядка у тебя пишется в строку, контейнер в котором он лежит выводишь на каждой новой строке, ряд за рядом, и номер элемента в нем - номер ряда содержащего контейнер первого порядка.
суть в том что квадратные скобки это оператор индексации, а никак не умножения структуры данных
char value[rows][columns]
первый раз индексируешь value -- получаешь row
второй -- char
>new возвращает ссылку на объект
нет, возвращает поинтер на объект
> Чем вариант обычного создания MyClass Obj хуже?
тем что оно в конце скоупа умрёт
>нет, возвращает поинтер на объект
Черт,это я тут описку сделал,честно-честно. Конечно же поинтер,а не ссылку
Спасибо за пояснение.
Можно какой-нибудь пример ,в котором нам нужен объект,который не должен уничтожаться после выхода из скоупа?
>тем что оно в конце скоупа умрёт
Так это наоборот заебись. А если ты забудешь сделать delete для new объекта(что немаловероятно), то потом заебешься искать где у тебя утечка.
Ну без указателей ты больше хелрувордов писать не будешь, и даже если ты нахерачишь ретернов ьебе это не поможет.
Пон. Всё, я просто тупанул жёстко. Спасибо
Любая функция типа createWindow() createWidget() и так далее результат которых ты будешь передавать в другие функции типа renderMahWindow(window)
Как consteval заменит шаблоны? Как по-твоему должны работать контейнеры без шаблонов? И что с тобой не так?
да как в любом современном языке, например Zig.
Что нибудь типа
auto get(auto t) {
if(consteval isFloat(t)) { return 1.0; }
else if(consteval isInt(t)) { return 2; }
}
конечно еще лет 9 придется подождать нормальной рефлексии...
Чего блять? Причем тут указатели и ретерны?
Я пишу что если ты забудешь удалить new объект из скоупа(а это частая ошибка) - то это хуево, даже в книгах пишут что всегда оптимальнее юзать Obj obj; без явного указания создания объекта.
> > Как consteval заменит шаблоны?
> да как в любом современном языке
> Что нибудь типа
> auto get(auto t) {
> if(consteval isFloat(t)) { return 1.0; }
> else if(consteval isInt(t)) { return 2; }
> }
Ну да, все же знают, что ничего сложнее хеловорлд и физзбазза нормальный программист не пишет, это несовременно.
> Удачи создавать все объекты на стеке, ограниченном одним мегабайтом. Даже пару картинок в память не загрузишь.
Он может возразить, что для этих целей нужно просто использовать библиотеку, который предоставит обёртку под это. Какой-нибудь PngImage, который в стеке займёт байтов 40, например, а в кучу полезет сам, чтобы тебе не пришлось. Так же и динамический массив используют в обёртке std::vector. И получается, что new нечасто приходится использовать, если ты программируешь на высоком уровне. А уже на "среднем" (даже не на низком) уровне, когда тебе нужен собственный контейнер или пресловутый PngImage, выгружающий картинку в память, тут без new никак. От себя добавлю, что QT, например, из-за своей изъёбистости, может просто принудить тебя создавать новые объекты через new, когда окажется, что контейнеры не способны хранить QObject.
объявлено как
#define JS_PUBLIC_API
#define ..
.....
Это может быть нужно для генерации кода или документации сторонней утилитой. То есть в с++ ничего не происходит, но в какой нибудь либе в экспорте помечены доступными только они.
Комунити полноценный уже давно, лет пять наверное.
Про и ынтерпразь отличаются подключенными тим-хуйнями и интеграциями с мелкософтовыми сервисами, ничего из того что тебе как одиночке когда бы то ни было могло бы пригодиться за редкими исключениями.
у того полуебка спроси
заодно поинтересуйся знает ли он значение ключевого слова consteval
хотя по его посту и так все ясно
>А, и еще аддоны вроде к коммунити нельзя было прикручивать
У меня на комунити стоит 1 простенький плагин.
А, и PVS Studio тоже как плагин подрубается.
>>81759
>Насколько сильно Community урезан?
Из того, с чем я сталкивался в 2019 версии: 1) в режиме отладки нельзя шагать назад; 2) недоступны фичи по метрикам кода, в частности нельзя узнать сколько строчек кода ты наговнокодил.
Еще вспомнил. Нельзя сменить встроенный браузер. Там гвоздями прибит IE, который больше не работает.
А как собсно говнокодить БЕЗ raw указателей? Шейред птр превращает нейминг это учитывая что я всюду тайпдефаю в залупу.
Ссылки не везде прокатывают.
Есть ещё какие нибудь варианты?
cout << "\nThe item name ’" << myIterator << "’ has ";
cout << (myIterator).size() << " letters in it.\n";
(*myIterator) в скобках? Что будет, если я напишу не в скобках?
Типа myIterator - это объект и я показываю имя объекта. А во втором случае я обращаюсь к дереференсу(eh?) и считаю его сайз, но зачем там скобки? Почему я не могу без скобок написать дереференс?
Хотя не, дереференс это же просто цифра... нихуя не понял...
Аааа... Понял.
Дереференсет - имеется ввиду из референса передаёт вэлью. А если сайз вызвать обычному, без круглых скобок, то он выдаст сайз элемента?
Хотя нахуя там скобки я всё равно не понял...
Я смешарик в итераторах, но
it.size() - вызов метода у итератора
(*it).size() - вызов метода у объекта, кмк
Для меня это как пук в воду. Интересно, но не понятно. Т.е. функция сайз не работает с итераторами?
Какая функция size()?
Такого метода у итераторов(я конкретно про istream_iterator) нет.
Ты про sizeof?
>Такого метода у итераторов(я конкретно про istream_iterator) нет.
всё, пон, спс.
А почему у *it.size() такой функции нет, почему её не сделали? Зачем эти злоебучие скобки? Я просто не очень понимаю, нахуя они нужны, если можно было бы просто функцию size() для .it сделать.
Может просто правило какое-то есть или ещё что...
>>83802
myIterator->size()
Как я понял исходя из этого >>83811 это уровень вложенности или что-то типа того?
struct MyStruct {
int member1;
double member2;
};
MyStruct *myStructPtr = new MyStruct();
myStructPtr->member1 = 42;
А вот в случае с гумозным it->size() - не очень. Тут наверное надо глубоко залазить в дебри кода и понимать, как оно работает, чтоб воспринимать это на 'человеческом языке'.
Т.е. даже если так подумать, итератор это контейнер, который лежит где-то и имеет вэлью. Т.е. мы из этого контейнера перемещаемся к вэлью на уровень ниже?
>>83851
Хотя стоп. Это же одно и то же...
для указателя ptr->x это (⚹ptr).x
для инстанса класса, допустим, итератора:
iter->x это (iter::operator ->())->x
(iter.operator ->()) я имел в виду, ну это понятно
для стлевских итераторов возвращает iterator::pointer_type
если написать operator -> возвращающим объект, скажем, shared_ptr, то и для него будет вызван operator ->, пока компилятор не доберется до указателя настоящего
Гугли приоритеты операторов
а что, компилируется? круто
просто непонятно, что делает код полезного, и у меня включились игры разума
У оператора выбора члена приоритет выше, чем у оператора разыменования. Поэтому ★iterator.size() равносильно ★(iterator.size()), а тебе нужно именно (★iterator).size(). Хотя для итераторов, как и для указателей, работает стрелочка: iterator->size().
сложна...
А поясните вот эту приколюху.
Мы создаём строку софар(слово выбранное выше, '-') - типа, чё это за хуйня в скобках? Я могу СТРОКАМ передавать ПАРАМЕТРЫ? О_О Как это вообще работает? Я либо чё-т забыл, либо мне это не объяснили по книге.
Или я что-то не так понял?..
А. Всё. Я понял. Бот пояснил. Короче стрингу с названием можно передать 1. длину. 2. символы. Забыл, видимо.
И заранее спрошу(я ещё до этого не дошёл): можно же код выше вынести в отдельную функцию, чтобы постоянно её не писать каждый раз после cin >> guess
Прим.:
cin >> guess
upperFunction(param1); // (param1 = guess)
Функция, которая в свою очередь повторяет код с пика. Как в таком случае добавить параметр в функцию, чтоб я мог ввести guess в качестве param1 (предполагаю, что int upperFunction(param1) и далее его в коде функции использовать) и что писать в return(явно не ноль, а как-то выводить конечный результат).
Первое - я хз что я не так сделал.
А по поводу функции - если лень писать код - попрошу скинуть ссылку на гайд или сказать чё гуглить, чтоб найти гайд, например, по созданию функций с параметрами и ретурнами правильными, а то я чё-т погуглил и не нашёл то что нужно.
Спасибо. Прочитаю уже завтра
Вот раз ты не понимаешь что пишешь const auto &, то не используй пока это.
Сделай через обычный цикл.
Мы спросили уважаемого Вонни, члена ISO C++ Committee:
-- Чем вы обрабатываете HTTP-запросы?
-- С помощью Boost.Beast
Мы спросили сеньора Потчка:
-- Как вы роутите разные пути и методы запросов?
-- С помощью <variant> и std::visit. Парсинг пути -- в зависимости от проекта, Boost.Spirit либо руками.
И мы спросили миддла Болка:
-- Вы нам не пиздите?
-- Код я еще не написал, но выглядит разумно.
https://lina-tv.ru/
Напиши просто через обычный цикл, все станет понятно.
А потом исследуй, как можно это упростить.
Ну обычный цикл не сложно написать...
IDE жалуется на конверсию из стринга в инт. Я так полагаю, в ретурн можно передавать только цифровые значения. Получается надо как-то конверить строку в инт?
>When a variable is passed by reference, changes made to it inside the function are reflected in the original variable. This is in contrast to passing by value, where a copy of the variable is created and changes made inside the function do not affect the original variable.
Т.е. когда мы используем референс, мы работаем напрямую с вэлью оригинальным. Таким образом & создаёт временный референс для каждой буквы в оригинальном guess
А в случае, когда мы этого не делаем, то вэлью менется только внутри функции.
Правильно понял? Т.е. буквально мы ссылаемся на внешний вэлью(вне функции)?
Очевидно что тебе не приходится копировать объект при "муве".
Бля если ты тот же анон, что выше ковыряет язык - забудь про этот аспект языка, он тебе пока нахуй не нужен и только сломает моск.
Потому что приссылуе тебе придется функцию перегружать два раза, для лвэлью ссылки, и для рвэлью ссылки
Ну а если по значению брать, то там всего на один мув конструктор больше, а он должен быть дешёвым
на самом деле про перегрузку два раза не совсем правда, можно всякими приколами это обойти, но код такие финты только загромоздят
А можно специально ради этого сделать шаблонную функцию, чтобы perfect forwarding заработал?
Можно, но сам понимаешь что запарно, собственно я под приколом это и имел ввиду
что то вроде подобного
func(auto&& arg) requres decltype(arg) == my_type {}
псевдокод
компилятор никаких операторов не выполняет
компилятор компилирует твой код в ассемблер, как ты видишь код с бесконечным пустым циклом в ассемблерном эквиваленте?
если Ты Сын Божий, бросься вниз Jmp на самого себя, ибо написано: Ангелам Своим заповедает о Тебе, и на руках понесут Тебя, да не преткнёшься о камень ногою Твоею
А когда нам может быть проблематично отсутствие перегрузки для rvalue? Разве не всегда эту ссылочность можно убрать?
Всем привет, я долбоёб!
Имеется два проекта на плюсах, один представляет из себя либу, которую постоянно пишу, а второй - основной проект, в котором либу использую. Пока что они у меня лежат в соседних папках, по необходимости пушатся в гит. При этом использую cmake + git submodules. Т.е. либа прописана в основном приложении как сабмодуль (соответственно, либа сразу в двух местах на диске - по соседству с основным приложением и внутри него же, но как сабмодуль). Подход походу дурацкий, потому что я заебался обновлять сабмодуль с либой руками. Не понимаю, как правильно реализовать подключение зависимости, которая разрабатыватся параллельно с основным кодом? Гит сабтри решит проблему? Может, сделать ход конём и поместить либу внутрь основного проекта, при этом прописать папку либы в гитигнор? Но как тогда в гите зависимость прописать? Уууу сука, уже третий день жопа горит от своей тупости и не знания методик.
Или проще вообще nmap сделать и пусть ОС ебется как хочет?
>нахуя?
Ну либа отдельно, приложение, использующее её - отдельно, в чём проблема? Либа достаточно большая, заслуживает отдельного репозитория.
Что мешает ссобирать либу как шаред и просто лигковать к основному проекту?
Я так делаю уже оооочень давно для этапа оазработки, разумеется просто все что можно выносишь в отдельные шаред либы и конкретно текущий модуль легко править.
Желание предоставлять в каждом коммите рабочую сборку, а для этого мне надо же каким-то образом предоставлять зависимости вместе с основным проектом, делаю это сабмодулем. В пакетник какой-то засовывать пока не хочу, средствами смейка решать типа fetchcontent - тоже хуйня какая-то. Ну и сабмодуль позволяет собирать одной кнопкой всё, без сборки либы + сборки проекта в два этапа. Одно только плохо - обновлять руками сабмодуль приходится, поэтому стало интересно, какие здоровые подходы есть для подобной нонстоп разработки
так зачем тебе вообще вторая копия, если можно сделать cd в субмодуль во втором терминале?
>так зачем тебе вообще вторая копия
основной проект - гит репозитарий. Либа - гит репозитарий. Оба отслеживаются и коммитятся регулярно. Добавить репозитарий в другой репозитарий и отслеживать оба как два отдельных проекта нельзя, или я чего-то не знаю?
>если можно сделать cd в субмодуль во втором терминале
Если я сабмодуль положу за пределы этой папки, то поломается симейк и будет ушлепанская структура проекта в гитхабе.
Мотивация такая: у проекта есть зависимость от либы. Необходимо эту зависимость автоматом подтягивать к пользователям. Каким инструментом можно это сделать? Я пока решаю это так, что внутри основного проекта есть папка с зависимостями, где сабмодули и лежат, в т.ч. сабмодуль с либой.
так у тебя субмодуль уже гит репозиторий
зачем тебе вторая его копия на том же уровне что проект
Бамп. Я всё правильно понял?
А вообще понимания таких сложных вещей - со временем лучше становится? Или это всё чисто дрочь и запоминание и понимание терминологии?
>>84935
b .
Имелось ввиду игнорировать операторы, которые идут после бесконечного цикла. Компилятор имеет право так сделать, и это действительно уб.
Большая часть этих слов имеет русский перевод. Читать надо уметь на обоих языках, при наличии оригинала - в оригинале.
Твой капитан
как понять ебанные массивы?
понимаю практически все ооп,функции и т.д.
но написания кода с помощью массива и цикла даются невероятно тяжело.
даже вот сегодня час потратил на задание по сумму всех элементов массива и получилось, слава богу
может мне неправильно о них рассказали и т.д.
есть какие-то источники по этой теме, который раскрывает полностью массивы
с меня нихуя
спасибо
>невероятно тяжело
Когда мамка даёт пронумерованный список продуктов и отправляет в магазин, тоже зависаешь?
Пальчики загибай когда массив индексируешь.
Что за задание?
Я спрашиваю нужно ли знать перевод слов на русский, если понимаешь на английском, потому что в программирование совсем не прямой перевод слова, а адаптация под русскоязычные понятия.
Я бы сказал, что если тебе встречается понятие в процессе разработки, ты должен уметь его назвать на хотя бы одном языке, то есть треугольник: 0) мир идей 1) русский 2) ангельский
ну и в процессе левелапов у тебя все больше нейронных связей
Кодварс.
acmp.ru
Ещё мой дед смеялся над этим мемом.
А мув вобще бывает дорогой? Почему бы мне везде где только можно принимать по значению, а не писать две перегрузки функции
Ну вызовется на 1 мув конструктор\оператор= больше, ну и похуй, это же дешево должно быть
Может плюсы это даже соптимизировать смогут?
Так можно, если тебе норм, что объект, который ты передаёшь, перестанет существовать сразу после вызова функции. А это далеко не всегда норм.
- возвращаешь провисающий референс
- будешь мувать просто все константное, даже если это не рвэлью
Как мне к этому подходить? Симейком прокидывать как-то байнари директори основного симейклиста в код?
На питоне быстрее напишешь, красивее визуализируешь в нотбуке
На плюсах быстрее, ну и соответственно все кишочки питоновских либ написаны на плюсах
Ну и вообще где важна скорость там скорее всего плюсы
А где надо наиболее быстро принести заказчику вэлью - питон
Кладу бинарник в каталог, куда пользователь без прав админа/суперюзера не может ничего записывать, и запускаю под этим пользователем. Твои действия?
из-за таких мудаков теперь файлы лежат в "C:/Users/Pidor/AppData/LocalLow/Govno_inc/zalupa/Profiles/User/UserProfiles/saves/cache/data/data/data/config.ini"
"Documents/hui/pizda/345fc02b08734efff/ne_vlezai_ubyot/"
"D:/Games/C++"
но сука не в папке с программой
>Часто в требованиях вижу помимо питона просят знания C++. В чём разница между этими языками в этой области?
Потому что питон используется как язык "клей" для склеивания библиотек на си/цпп. Ну знаешь там байты переложить, текстом пукнуть в консольку и т.д. А вся вычислительная часть и числодробилки пишутся как раз на си/цпп.
А как иначе?
Перемещение - это передача владения ресурсом, т. е. состояние перемещаемого объекта необходимо изменяется.
>>89159
Такой конст-каст UB.
Объект не перестает быть константой. Вообще, касты никогда не изменяют объект, касты всегда возвращают вновь созданный объект (или ссылку).
>>89391
std::move() ничего никуда не перемещает.
Она просто преобразует тип в &&-ссылку и все. А уже на основании этого типа по общим правилам разрешения перегрузки выбирается соответствующий конструктор или оператор присваивания.
>А как иначе?
С мувом никак
Но очевидно нужно придумать новый кейворд const_move() который бы говорил что замувленный конст больше не будет сущетсвовать и перемещает его с помощью нового конст мув коснструктора, который будет на метамагии запрещать менять состояние обьекто муваемого
всё для того чтобы просто скопировать конст вэлью
Если мы возвращаем && на объект созданный внутри функции это будет повисшая ссылка? Я вот это спрашивал.
О х лол ты что совсем нюфаг? Симейк так же позволяет задавать любой дефайн, те ты можешь легко передать в код любое строку/число.
> Выдаю ошибку что файл с настройками не может быть создан, предлагаю выбрать другой путь
При каждом запуске надо заново выбирать? Или путь сохраняется в каком-то другом месте?
В том куске кода не создается объект, там создается новая ссылка.
>Если мы возвращаем && на объект созданный внутри функции это будет повисшая ссылка?
Если & ссылка, то будет висячая.
Если && ссылка, то по идее должно сработать перемещение. Но так делать все равно не надо, потому что RVO.
Нельзя под андроид писать. С костылями только, основа на java/kotlin, а остальное на C++.
как аргумент пусть приниает путь к конфигу
можно и под андройд, гугленул бы хотя бы для начала android c++ прежде чем тупые вопросы задавать
На каталог с программой у юзера может не быть прав на запись. Поэтому настройки-конфиги и кладут в его домашний каталог.
Что именно "да нет". Мол этот язык уже не актуален сегодня/ближайшие годы или это язык будет актуален ещё долго?
Нет да
Что значит актуален?
Востребован? Да
Пишут ли на нём новое? Да
В мете ли он? Нет
Легко ли залететь? Нет
Нет, если есть выбор.
>уже маловостребованный язык?
Востребованный, но ты озябнешь учить до уровня востребованного специалиста.
>но ты озябнешь учить
А если в геймдев идти? Тоже ёбнешься пока учить всё будет? Или для вката в анрил какой-нибудь всё не так уж и плохо?
>озябнешь учить до уровня востребованного специалиста.
А если я уже знаю другой язык ? Всё равно, озябну ?
>Что значит актуален?
Значит порешали ли специалист от новичков до гуру всякие чат гпт и прочие нейросети? Появилась ли альтернатива C++ и разрабатывается ли?
Нет и не порешают. Говнокода и Легаси на плюсах столько, что ещё на пару поколений работы хватит. если не введут смертную казнь за использование крестов
А в чем? На плюсах можно делать вообще что угодно. Можно писать круды, можно писать движки для игр, можно писать софт для стиральной машины.
Плюсы универсальный инструмент, проигрывающий более специплизированным. Тебе он нахера нужен?
Что мамка хвасталась что я умный дабы развить свой интеллект, не все же быть великовозрастным долбоебом
Про работу не я писал, а другой анон. Матан знаю на удивление неплохо
Петушиные языки, в которых есть явные названия для методов и функций (вот, вижу тут есть fn как в петухлине fun) сразу в топку.
Ничего не скажу, так как не знаю, что это такое. Я вообще жабоёб, решил побаловаться педалями вчера, чтобы быть ТруЪ погромистом.
Чего?
>Или для вката в анрил какой-нибудь всё не так уж и плохо?
Когда ты уже будешь знать плюсы и арил, то задним умом, возможно, сможешь разделить свои знания на полезные для анрила и бесполезные. Но как ты это определишь еще не зная ни того, ни другого?
>>91494
> развить свой интеллект
Кроссворды порешай.
Сложность C++ не имеет ничего общего с челленджем для интеллекта, скорее наоборот насилие над здравым смыслом.
>>91321
>А если я уже знаю другой язык ?
Если ты уже знаешь ООП, алгоритмы, паттерны и умеешь лепить из этого всего программы, то это будет хорошим подспорьем.
Это копия, сохраненная 23 мая 2023 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.