Белеет парус одинокий В тумане моря голубом!.. Что ищет он в стране далекой? Что кинул он в краю родном?... Играют волны — ветер свищет, И мачта гнется и скрыпит... Увы! Он счастия не ищет И не от счастия бежит! Под ним струя светлей лазури, Над ним луч солнца золотой... А он, мятежный, просит бури, Как будто в бурях есть покой! C++
Q: Я хочу тотчас вкатиться, а разбираться буду в процессе. Что я должен делать? Q: Не уверен, что хочу изучать C++. Как мне пощупать его без лишней ебли? A:
Читаешь эту книжку, смотришь упражнения из нее и суешь в онлайн-компилятор. Сообщения компилятора об ошибках копипастишь в гугл, ответы на возникающие у тебя вопросы ищешь в предыдущих тредах, спрашиваешь в этом треде, если не нашел. Если тебя послали на хуй или не ответили, то ты спросил платину, читай предыдущие треды внимательнее.
Памятка ньюфагу
Вопросы по синтаксису идут на хуй
Лабы идут на хуй
"Как мне сделать Х на чистых крестах без библиотек" идут на хуй
Все идут на хуй
Хейтер сосет члены на пару со своей мамашей
Небольшие фрагменты кода размещай в треде при помощи тега [code] и жабаскрипт-костыля. Для больших фрагментов используй внешниесервисы.
FAQ
Мотивация
Q: Почему стоит использовать именно C++? A:
Ни один язык не идеален, но по совокупности киллер-фич C++ оставляет все остальные языки позади. Вот основные три:
Скорость
C++ действительно быстрый язык — вместе с C, его прародителем, они с большим отрывом уделывают по скорости все остальные языки высокого уровня. Код на C++, как правило, медленнее аналогичного кода на C приблизительно на 0-20% а в ряде случаев C++ оказывается даже быстрее, причем замедление появляется только при использовании высокоуровневых конструкций (в C++ ты никогда не платишь за то, чего не используешь). Таким образом, если тебе требуется высокопроизводительный код, C++ станет отличным выбором.
Мощь
C++, являясь одним из наиболее выразительных и мощных языков, позволяет использовать большинство существующих парадигм. Его философия построена на минимальном ограничении программиста в выборе методов и инструментов простреливания ноги решения задачи. Как следствие, используя C++, ты можешь не думать о том, как обойти искусственные ограничения языка, а беспрепятственно выбрать наиболее подходящие к ситуации средства.
Популярность
C++ по-настоящему популярен. На нем написаны десятки тысяч приложений и миллиарды строк кода, о нем написаны сотни книг, он до мельчайших подробностей документирован и стандартизован. Используя C++, ты никогда не останешься без работы или поддержки комьюнити.
Q: Но он же давно устарел! A:
Современный C++ весьма далек от языка, которым он был в 1998 году. В настоящее время кресты живее всех живых, их развитие движется семимильными шагами, а новые стандарты принимаются каждые три года, сохраняя при этом полную обратную совместимость с предыдущими. К сожалению, из-за обилия некачественной литературы по С++, в которой игнорируются новые средства языка, бытует мнение о его "несовременности".
Q: Сейчас все пишут на %languagename, а кресты сосут у него! A:
Нужно понимать, что используемый язык должен соответствовать поставленной задаче. Никому не придет в голову писать на C++ скрипты или веб-фронтенд хотя это вполневозможно, но лишь немногие языки могут соперничать с ним по разнообразию решаемых задач.
Q: Хуле тут так сложно? Я открыл учебник, там какой-то ад! A:
Попробуй учебники, изданные после 2011 года, в которых рассматриваются возможности новых стандартов (C++11 и C++14). Этифичи не только добавили выразительности, но и серьезно упростили жизнь разработчиков. Теперь программировать на C++ стало проще, чем когда-либо! Это не отменяет необходимости прочитать несколько серьезных книжек, чтобы написать на нем что-то годное. Тем не менее, да, C++ это по-настоящему сложный язык. Его никак не получится выучить за 21 день, ну вот совсем никак. Именно высокий порог вхождения повышает твою ценность как специалиста, не позволяя нанять вместо тебя индуса за еду. Более того, крайне нежелательно пытаться изучить его первым, если ты раньше вообще не программировал. С большой вероятностью это приведет к разочарованию и потере времени. Гораздо лучше будет начать с другого языка и базовых вещей алгоритмы, архитектура пека, операционные системы, а уже потом вернуться к крестам.
Литература
Q: Окей, я решил вкатиться. Какие же книги мне читать? A:
Специально для тебя аноны /pr собрали уникальную коллекцию отборной литературы по крестам. Только лучшие книги, последние издания, без хуев! Выбирай категорию и обмазывайся:
Для нюфань
Учебники для начинающих. Все примерно одинаковой годноты, читать имеет смысл только какой-нибудь один, который больше приглянется:
Автор(ы)
Название
Год
Ссылка
Бьерн Страуструп
Программирование. Принципы и практика использования C++
Кроме того, есть еще пара старых добрых учебников для ньюфагов. Часть информации в них устарела, но многие считают, что это компенсируется их большей, по сравнению с современными учебниками, понятностью:
Следует пролистать все перед переходом от лаб к написанию настоящего софта.
Последний пункт есть квинтэссенция ГИБКОСТИ, поэтому стоит прочитать его в любом случае, чтобы охуеть от того, как можно делать:
Автор(ы)
Название
Год
Ссылка
Ален Голуб
Веревка достаточной длины, чтобы выстрелить себе в ногу
Ахтунг!
Предыдущие два раздела дополняют, а не заменяют классические книги о лучших практиках разработки без привязки к конкретному языку (Макконнелл, Uncle Bob, GoF).
Справочники
Наиболее детальные описания языка. Удобно использовать как референс, читать от корки до корки не обязательно:
Q: Я готов начать погроммировать! Куда мне писать код? A:
На этапе написания хэллоуворлдов можно не ебаться с установкой софта, а использовать онлайн-компиляторы: раз, два, три, четыре. Для работы над более серьезными вещами удобнее всего установить какую-нибудь IDE. Ниже приведены несколько хороших вариантов:
Платформа
Название
Описание
Ссылка
Windows
Microsoft™ Visual Studio®
Общепризнанно самая продвинутая и удобная IDE, не имеющая равных по части автодополнения и возможностей отладчика. По ссылкам справа можно скачать бесплатную редакцию последнего выпуска (2015 Community Edition). Кроме того, существуют редакции с расширенными возможностями (Professional и Enterprise). Они стоят сотни денег, но если ты студент вуза, подписанного на Dreamspark Premium, то ты можешь получить их безвоздмездно (то есть даром). Многим новичкам интерфейс студии кажется чересчур сложным, так что обязательно прочти этот гайд, если у тебя возникают проблемы с компиляцией хэллоуворда
Простая, легковесная, кроссплатформенная, швабодная IDE. Менее навороченная, чем студия, но среди бесплатных вне конкуренции. Вероятно, это наилучший вариант для новичка с *nix. Под Windows же требует чуть больше ебли с установкой компилятора MinGW/LLVM
http://codelite.org/, "sudo aptitude install codelite codelite-plugins"
для установки под *nix
Все
CLion
IDE, призванная похоронить Visual Studio пока не особо получается. Она стоит денег, но можно украсть почти не протухшую версию на торрентах или получить бесплатную лицензию на год по скану студбилета, если ты студент. Удобные свистелки и перделки присутствуют. Тормоза и баги присутствуют. Кросплатформенность присутствует
Здесь ты можешь найти все остальные существующие IDE, если ни одна из вышеперечисленных тебе не приглянулась.
Разумеется, установка IDE вовсе не обязательна. Ты можешь использоватьтекстовыйредактор в связке с каким-нибудькомпилятором, выбросить мышку, отрастить бороду и примкнуть к Церкви Святого Столлмана. Но лучше тогда сразу отправляйся в тред сишников, если не хочешь быть обоссанным другими сектантами за использование б-гомерзкого C++.
Q: Не буду я все делать сам! Подавайте сюда софт, который все сделает за меня и подотрет мне жопу! A:
Без проблем:
Статический анализатор, который умеет находить в коде ошибки и неоптимальные места. Швабодный. Есть плагин для Visual Studio
Гугловский фреймворк для автоматизации тестирования
Также не стоит забывать о том, что правильные посоны экономят свое время и нервы, используя мегагодные git и cmake во всех проектах.
Q: Мне надоело писать велосипеды, какие у вас тут популярные либы? Q: Нужно зделать %монструозная_хуйня_нейм, но я обосрался от одной мысли о написании ее с нуля, что же делать? A:
Гляди сюда:
boost
Бесспорно, это самый популярный набор C++-библиотек. Не будет лукавством сказать, что C++ во многом обязан популярностью именно ему. Воистину всеобъемлющий, boost способен удовлетворить твои самые скотские фантазии. В нем есть практически все - от математических функций до сетевых компонент, от инструментов тестирования до динамических типов. Функции для работы с твоей мамашей там тоже есть. Разумеется, все это швабодное и работает на любых платформах. И да, boost является своеобразным инкубатором хороших библиотек, поэтому наиболее удачные из них с большой вероятностью можно будет увидеть после принятия очередного стандарта уже как часть стандартной библиотеки.
Недостатком boost можно считать его размер - более 300 мегабайт. Большинство компонент boost не являются независимыми, и попытка использовать один единственный контейнер обернется фактическим подключением 2/3 всего присутствующего в комплекте. Таким образом, если boost не будет использоваться на полную, лучше юзать другие, более специализированные библиотеки.
Существует швабодный кроссплатформенный фреймворк-надмножество C++ под названием Qt. Он содержит довольно большое количество компонент (для работы с сетью, базами данных, для юнит-тестирования и др.), но киллер-фичей и основным полем его применения являются возможности по разработке графических интерфейсов. Qt сам по себе, как расширение языка, предоставляет для этого более удобные средства, чем обычные библиотеки, а использование специализированных IDE наподобие Qt Creator позволяет в буквальном смысле собирать интерфейсы мышкой, а код писать только по существу.
Тем не менее, использование Qt нельзя однозначно назвать хорошей практикой. Во многом это уже не C++, а другой язык, со своими концепциями и паттернами. Qt-код требует дополнительного препроцессинга при помощи встроенных в Qt утилит (т.н. метаобъектная компиляция), поэтому не получится просто подключить Qt как обычную библиотеку и использовать свой любимый компилятор без дополнительного софта. Нельзя сказать, что это существенное препятствие, но есть мнение, что использование Qt нарушает дух C++, раздувает машинный код и порождает макак-любителей кодогенерации.
В настоящее время основные версии Qt - 4.8 и 5.х, полной обратной совместимости между ними нет как в пистоне, ага.
Несколько специализированных библиотек для часто встречающихся задач. Все — маленькие, быстрые и простые в освоении:
libcurl - сишная библиотека для работы с сетью (существует также curlpp - крестовая обертка для нее, но использовать ее не стоит, ибо разработка заброшена еще в 2009 году)
Q: Я прочитал все вышеперечисленное, теперь я гуру! Что дальше? A:
Дальше переходишь по ссылке, пробуешь отвечать на вопросы и понимаешь, что ты пока в самом начале пути. Кроличья нора крестов практически бездонна, поэтому продолжать постигать тонкости и детали можно очень и очень долго. В то же время, на этом этапе у тебя должно быть достаточно знаний, чтобы уверенно писать неплохой код. Поэтому читай исходники открытого софта и библиотек, отправляй пулл-реквесты в них, читай книжки по предметным областям и общим методикам разработки, а дальше уже сможешь запилить свой проект или вкатиться в существующий.
>>841155 Там осиливай make, gcc, gprof, gdb, clang. Потом читай писанину Страуструпа, после прочтения ознакомся с текущим стандартом C++ 2017 и GNU разширениями. Готово, теперь читай код GCC, приводи в порядок, было бы хорошо разбить его на куски отдельно для каждого языка компилятор, общее в отдельный модуль запихнуть. После этого если хочешь разрабатывать GUI apps то изучай Wayland API (оно короткое, 100 Пунктов, да и не обязательно знать все.) и QT5/6 с wayland. Вот и все.
>>841250 Вектор это такая недоколлекция? А есть чтоли как в явке коллекции? Хешмапы, связные списки, очереди, иммутабельные версии? Или все пихать в вектор?
>>841253 В плюсах все есть маньк, все. Выбирай то что быстрее работать будет, если конечно не надо поддерживать говнокод и писать в стиле говнокода чтобы другим говнокодерам небыло "Неприятно".
>>841251 >В куте Ну так учи куте ебана врот, плюсы во многом как джава, так что справишься. Только под Xorg не пиши, пиши сука под Wayland, сноси центось и ставлий Генту, установи Weston без xwayland для тестировки и Sway или любой современный оконный менеджер с xwayland для работы.
Ананы, как мне теперь бабло зарабатывать? Ну, вот допустим, я прочитал все книги Страуструпа, Мейерса, Саттера и др.. Что мне теперь изучать, чтобы, скажем, через пару лет не остаться с голой жопой и все еще программировать на плюсах? Что читать, какие фреймворки/либы учить?
>>841290 Странный вопрос. Устраивайся на люблю работу, спустя год ее меняй, потом еще раз спустя год меняй - и вуаля, ты чувак, который немножко всякого разного умеет. Дальше уже занимайся тем, чем нравится.
В случае конкретно крестов - читать надо либо про qt, либо про алгоритмы всякие, либо про пекасети.
>>841288 Мудачье блядь, опять велосипед какой-то придумали? Вам что существующих дистрибутивов не хватает? Ну бздя, ну план9, нет сука, хотим говно жрать.
>>841366 В надо знать хорошо С++, понимать, что есть в бусте и знать, чем nlogn отличается от n^2. В качестве бонуса - очень полезно поковырять qt.
Но ты сам понимаешь, что "знание голого С++" это очень обширная область и так.
Я в своей жизни проходил 5 собеседований на С++ программиста, почти все спрашивали за сам язык\STL и алгоритмы. Предметной области разработки конторы не было (ну, я нихуя и не сениор с 300к в наносекунду, чтобы еще и область знать). Области разработки учили сами уже на месте. Делай проекты, используй клевые фишки 11\14 стандарта, обязательно используй эксепшены (чтобы понять, как с ними работать) - и все будет хорошо.
>>841612 Есть блядь GNU - мобильная ос, нет, хотят говно жрать, говорю же. Тем более ты на с++ пишешь, там тоесть нативные приложения, или ты IDE с костылями пользуешься что в яву превращает все? Говорю же есть нормальные платформы, которых более чем достаточно, мейнстрим это GNU/Linux оно сейчас везде, и если под это разрабатываешь то не пропадешь, а андроид, мак, салфиш - хипсторская хуета. В мобильных устройствах критично важно время работы, чего интерпритируемое говнище никак обеспечить не может, дисплей протоколов нормальных туда тоже хуй завезли, там вообще хуй что поменяешь, часто с каким ведроидом брал телефон с таким он и здохнет. Ну если там нативные апы, то еще норм, лучше андроида.
Есть один map который использую только внутри одной из функций членов класса. В ней я его объявил и инициализировал. Но при каждом вызове функции он заново создаются. Выносить из функции и засорять глобальное пространство имён я не хочу. Что же делать?
НЬФАГ ЗДЕСЬ Ладно, на самом деле не совсем ньюфаг. Хочу спросить вот что: Можно ли как-то менять значения объектов в рантайме, обращаясь к ним по имени? Ну, то-есть, есть у меня, например, какое-то гуи приложение. На нём есть текстбокс. Я хочу ввести в чекбокс имя объекта (скажем, money_value) и во второй чекбокс значение (скажем, 199) и чтобы значение money_value стало 199. Типа, как с RTTI, но имя инстанса, а не тип. Что-то вроде рефлекшна в джаве. Я могу, конечно, для моего юзкейса просто парсить команды и потом что-то чему-то присваивать, но хочу узнать, есть ли какие-то механизмы для этого.
Блять, за такой уёбищный дизайн языка надо комитет, его создавший, объявить профнепригодным и распустить. Что это блять за хуйня? Почему они не могли ввести тип универсальных ссылок? Почему мне приходится ТАК извращаться?
>>842074 >нет Хуево. Это точно? >>842074 >Можешь сделать глобальную unordered_map<std::string, YobaWidget*> и к ней обращаться. Окей, костылей таких я могу и сам напридумывать.
В плюсах это реализуемо именно через RTTI – именно для объектов, т.е. тип класса == имя класса (правда нужно деманглить кашу от typeid – а это жутко вендорлочные костыли). Следовательно, для твоей задачи можно написать боксы как в жяве Integer.
Впервые столкнулся в QT, нужно работать с MySQL. Узнал, что в этой хуйне нужно ставить дрова, чтобы с базой работать. Откомпилировал дрова без ошибок, поместил, вроде бы, куда нужно, но при запуске уже моего приложения - ошибка, блядь. Причем при построении - все ок. Как это фиксить?
Алсо, SQLBrowser. из примеров КьюТи, выдает ту же ошибку. Я нарукожопил, или КьюТи пидор?
Сходил к другу, попробовал на его лэптопе провернуть такое же - все так же, значит я даун. ЧЯДНТ?
>>842125 Не совсем, в QT его нужно еще и отдельно установить, как я понял.
>>842172 Нихуя. Даже пробовал насильно указывать директории библиотек - один хуй.
Какова вероятность того, что скачанная мной папка с дровами MySQL - фуфло, и лучше перекачать?
Аноны, помогайте. Жутко не хочу пилить клиент для работы с БД на той же Джаве, где у меня что-то да получалось, и потом настраивать передачу данных между процессами.
Дело в том, что КьюТи подхватывал библиотеке, но не мог найти их у Венды. Инсталятор с офф сайта МуСкл, почему-то, нихуя не поставил мне свои дровки, он их просто в папочку сохранил. Вручную кинул ДЛЛку в папку /windows/ - все ОК.
Господа, как решить проблему с неполнотой типа в этом коде? Есть класс массива строк, и есть дружественный ему указатель на этот массив строк. Но из-за того, что указатель определяется ниже, нихуя не работает.
>>843280 Самый лучший контейнер. Легко добавлять новый элемент, произвольный доступ быстрый, можно в сишечку передавать дату :3. Везде использую его (зависимость уже), брат пока жив.
Пишу класс матриц. Хочу сделать конструктор, чтобы можно было передавать initializer_list вот так: { {1, 2, 3}, {4, 5, 6} } Как из него выделить строки, чтобы получилась матрица типа: 1 2 3 4 5 6?
>>843389 Класс матриц неудачный вариант для новичка. Класс сложный, возможностей мало, работы тоже мало, а на каждую вакансию десяток макак. Сейчас каждый школьник пишет класс матриц, а потом не знает что делать с ним. Лучше попробуй Haskell. На нём и конкуренция пониже, и зарплаты больше, и сам язык понятней. Если никогда не занимался программированием, то начинать лучше всего с Haskell - после него другие языки учатся быстрее. Работы полно, платят отлично. По книгам. Если есть хоть немного знаний программирования, читай это: http://www.ozon.ru/context/detail/id/30425643/ Если совсем новичок, пойдет эта книга: http://www.ozon.ru/context/detail/id/28346038/ Ну и куча онлайн-учебников. Вот, например: https://anton-k.github.io/ru-haskell-book/book/home.html Хороший учебник, всё расписано подробно. Сам по нему учился. Рекомендую.
>>843428 Своим незнанием откуда в языке есть эти пару фишек ты сам себя позоришь своим безкультурием. Все равно что приехать во Францию и орать "хуй ахах ресторан жир русское слово))))".
Тебе ещё следует узнать про Universal References и Perfect forwarding, чтобы была возможность умножать объекты с перегруженным оператором без копирования.
Так, ананасы, решил я тут поиграться с системами сборки анусом, и нашел WAF. Пуфон, все дела, очень удобно, после богомерзкого cmake, но вот проблема в том, как сгенерировать проект для Eclipse или какой еще поебистики того рода, чтобы нормально работать, а не в блокнотиках собирать всякое говно. Может сталкивался кто с таким?
так двоч начал вкатываться в с++ и тут такой трабл в методичке никак не могу разобраться как взаимодействуют функции а конкретнее как реализовать данный пример y = (x + 1)(x + 2)(x + 3)(x + 4) ... (x + n) рекурсивной функцией, можно без кода но желательно на пальцах пояснить за каждую строку чтоб тупице вроде меня было понятно
Я не хочу каждый раз когда мне надо узнать размер структуры вызывать для этого функцию. Я хочу переменную где это значение будет хранится. Но тогда нужно обновлять значение это переменной в каждой функции которая размер структуры меняет. Можно ли сделать такую переименую которая высчитывается при обращении к ней? А можно так чтобы она была доступна для чтения извне класса, но не доступна для изменения.
Няши, покидайте книжек/видео по Qt и в частности QML. Никогда с ним не работал, и сейчас не совсем понятно, куда даже копать. Есть один webView, и он умеет открывать ссылки. Как открывать ссылку по нажатию кнопки я понял, но мне надо, чтобы ссылка открывалась автоматически из когда. В первом случае в QML не надо ничего подключать, но при попытке вызвать id webView из другого класса компилятор ругается на отсутствие. Есть какие-нибудь мысли?
Господа плюсисты, подскажите, пожалуйста, как можно использовать строготипизированный енум в конструкции свитч-кейс? Конпелятор ругается на неявное приведение типов.
Проблема - если я ввожу не "text" , а другое слово, либо число, не выполняется else. Подскажите, пожалуйста, в чём причина? Он не может из inc_used(increase used) попасть в get_object(any,other) ? Неправильная нагрузка? Или что. Прошу помочь( includeы все имеются).
template <typename Any> void get_object(Any object) { std::cout << object << std::endl; } template <typename Any, typename other> void get_object(Any object,other number) { for (int i = 0;i < number-1;i++) { std::cout << object << std::endl; } } void inc_used(int used, std::string text) { used++; get_object(text,used); } int main() { int used = new int; used = 1; std::string x = new std::string; std::cout << "What do you want to run?" << std::endl; getline(std::cin, x); if (x == "text") { get_object(x); } else { inc_used(used, x); } delete x; delete used; system("pause"); return 0; }
Сап пр, есть один код, и сука он падает https://ideone.com/j5vxGl. Это примерный набросок участка кода, который вызывает проблемы. Объясните где я обосрался? Проблема, что в момент выделения памяти в функции программа падает с сегментейшен фолт, насколько я понимаю какого-то хуя в момент выделения памяти я перезаписываю стек, никогда такого небыло и вот опять.(Причем на идеоне все работает) Как фиксить то?
>>845279 Спасибо, с делитом действительно нехорошо получилось, но падения вызывал не он. Нашел я ошибку, я выделял под первый массив(тот который в мейне) память через new(), на идеоне я выделял нормально, а вот у себя не заметил.
Какой самый простой и элегантный способ "вырезать" кусок из файла? И какой правильный? Допустим, есть у меня файл с текстом: >aaa bbb ccc ddd А я хочу получить >aaa ccc ddd То есть вырезать символы 4-7 (иил 5-8)
Есть идея открыть два fstream'а (in и out), затем, поставив курсоры куда надо (out.seekg(3); in.seekg(7)), просто писать то, что читаю, ворде while (in.read(block, block_size)){ out.write(block, block_size); } Предположим, что размеры идеально совпадают и последний блок будет прочитан как раз перед eof и т.д. И затем в конце truncate'ить файл, чтобы размер уменьшился до нужного.
>>846266 "вырезать" заменять на "отфильтровать" - пишут что нужно оставить во временный файл, потом удаляют старый и временный на его место так быстрее всего по сути происходит посимвольный ввод-вывод 2мя системными функциями, в потрохах которой рантайм и система все нужные буферицаии-оптимизации делает незаметным образом для тебя
Ананас, в последнее время unique_ptr не даёт покоя. Вот, например, у меня есть массив (внутри unique) и я хочу его передать функцию для какой-то обработки, но терять им владение не хочу и поэтому передаю по константной ссылке. Та же ситуация и с возвратом из функции. Стоит ли так делать?
>>846327 >рантайм и система все нужные буферицаии-оптимизации делает незаметным образом для тебя Ой, ладно тебе, "все оптимизации делает". Что, и sendfile вызывает, когда возможно?
>>846327 >"вырезать" заменять на "отфильтровать" - пишут что нужно оставить во временный файл, потом удаляют старый и временный на его место Ну, то есть, никакой магии "указания на разрыв" нет (типа, вот файл отсюда и до сюда, а следующий кусок там, как получается при фрагментации на диске), и если мне нужно из гигабайтного файла убрать пару килобайт, то нужно пересмотреть архитектуру хранения данных прочитать с диска гигабайт и записать на диск почти гигабайт, да?
>>846507 Если размер удаляемых данных кратен кластеру, то, в теории, можно пошаманить на уровне файловой системы. Но абстракция "файл" не для того была придумана.
>>846504 все нововведения в последних стандартах крестов - это добавление синтаксического сахарка и расширение библиотек, входящих в стандартную поставку те семантика языка не меняется, а значит шарящего чувака все эти нововведения не пугают и не волнуют
>>846507 а как еще то? то что я тебе предложил - наглядно и просто, можно сделать на стандартных getc и putc, потоковым (с внутренней буферизацией) вводом-выводом
Сегодня впервые понял профиты от наследования. Это наследование GUI формочек. До этого всякий раз наследование выглядело таким лютым говнищем, что хотелось всех убить. С формочками согласен -- норм. Но в остальном OOP это ебучий рак.
Не могу установить на винду 15-ю студию, потому что система засрана. Поэтому установил Code::Blocks и прописал в настройках компилятор clang++. Исходники компилируются, но возникает ошибка линковки. Какой линкер можно использовать?
Подскажите пожалуйста! У меня windows 7 а я поставил себе visual Studio community 2015,проблема в том, что при выборе типа проекта выдает "could not find a suitable sdk to target" что делать? окна 10-ые ставить не охото..
>>847353 >Что за ошибки выдаёт? Накати на винду последние обновления Да в пизду ее, у меня винда совсем убитая, надо переустанавливать. Пока что меня устроит и Code::Blocks.
>>847363 И так стоит на ноуте, но в нем отвалилась земля. Пока не сделаю заземление, буду на винде. Посоветуйте, как исправить ошибку error: linker command failed with exit code 1104 (use -v to see invocation)|
Не устанавливается IDE, антуаны. Скоро останусь без интернетов, хотел занять себя кодингом, но у меня пиратская винда, которая никак не обновляется и похоже из-за этого мне не поставить эту хуйню. Вот так и висит. Скачал отдельно эту обнову - не хочет ставиться.
>>847596 А это блядь что за хуйня в настройках? Почему в одном случае слеши в пути левые, а во втором -- правые? И как правильно всё это заполнять на винде?
>>840964 (OP) Поставил C::B, mingw, wx. Сделал хэлловорлд для работы с wx, при билде получил ошибку: >.\wx_pch.h|14|fatal error: wx/wxprec.h: No such file or directory| Где и как я обосрался? Помогите ньюфагу.
>>847642 У меня на него, не поверишь, памяти не хватает. В ВУЗе сказали, что для C будем C::B использовать, поэтому на его основе и начал делать, так как предустановлен уже. На диске меньше 1гб осталось, даже под иные нужды не хватает, за неделю, конечно, подрасчищу, но мне бы уже сейчас начать всё это делать.
Аноны, подскажите, как в Visual Studio подключать библиотеки(тот же boost), не используя абсолютный путь, т.е. чтобы не было проблем с компиляцией на другом компе, например
using namespace std; int mai() { setlocale(LC_ALL, "Russian" ); int x,y,x1,x2,x3,y1,y2,y3; int s,s1,s2,s3; cout <<" Введите координаты треугольника:" ;
>>848046 Парни, в чем причина такой хуйни: QtCreator 3.6.1, создаю проект, накидываю файлы, делаю билд, cpp и h видит нормально, а qml он не копирует в директорию билда. Run qmake тыкал, не помогает.
Первокурсник итт. Посоветуйте, пожалуйста, как сделать визуальную интерпритацию сортировки массива? Нужно, чтобы после каждого нажатия на кнопку Ентер показывалось в консоли, как элемент массива меняется с другим. Хоть убей, не знаю как это сделать. Дайте советов. Саму сортировку я написал, пикр.
#include <iostream> #include <string> #include <vector> #include <cctype> using std::cin; using std::cout; using std::endl; using std::string; using std::vector;
int main() { string (word); vector<string> strings; while (cin>>word) strings.push_back(word); for (auto i: strings) if (islower(strings)==true) strings=toupper(strings); for (auto i=0; i!=strings.size(); i++) cout<<strings; cout<<strings.size(); }
При выполнении выдаёт ошибку "no matching function for call to 'islower" и дальше страшные буквы. Поможете разобраться?
Вот тенденции крестотреда: - Полгода атакуют лабодауны - Полгода скорость постинга 2 поста в неделю - Два раза в год разгорается какой-то технически сложный срач - Раз в два месяца происходит вялое набрасывание за любимую IDEшечку.
При билде хэлловорлда на wxWidgets происходят ошибки. Анон, что не так?
<ДЕАНОНЮЩИЙ ПУТЬ ДОК IDE>/CodeBlocks/MinGW/bin/../lib/gcc/mingw32/4.9.2/../../../../mingw32/bin/ld.exe: cannot find -lwxmsw28ud_richtext <ДЕАНОНЮЩИЙ ПУТЬ ДОК IDE>/CodeBlocks/MinGW/bin/../lib/gcc/mingw32/4.9.2/../../../../mingw32/bin/ld.exe: cannot find -lwxmsw28ud_xrc <ДЕАНОНЮЩИЙ ПУТЬ ДОК IDE>/CodeBlocks/MinGW/bin/../lib/gcc/mingw32/4.9.2/../../../../mingw32/bin/ld.exe: cannot find -lwxmsw28ud_aui <ДЕАНОНЮЩИЙ ПУТЬ ДОК IDE>/CodeBlocks/MinGW/bin/../lib/gcc/mingw32/4.9.2/../../../../mingw32/bin/ld.exe: cannot find -lwxmsw28ud_dbgrid <ДЕАНОНЮЩИЙ ПУТЬ ДОК IDE>/CodeBlocks/MinGW/bin/../lib/gcc/mingw32/4.9.2/../../../../mingw32/bin/ld.exe: cannot find -lwxbase28ud_odbc <ДЕАНОНЮЩИЙ ПУТЬ ДОК IDE>/CodeBlocks/MinGW/bin/../lib/gcc/mingw32/4.9.2/../../../../mingw32/bin/ld.exe: cannot find -lwxmsw28ud_media <ДЕАНОНЮЩИЙ ПУТЬ ДОК IDE>/CodeBlocks/MinGW/bin/../lib/gcc/mingw32/4.9.2/../../../../mingw32/bin/ld.exe: cannot find -lwxbase28ud_net <ДЕАНОНЮЩИЙ ПУТЬ ДОК IDE>/CodeBlocks/MinGW/bin/../lib/gcc/mingw32/4.9.2/../../../../mingw32/bin/ld.exe: cannot find -lwxmsw28ud_gl <ДЕАНОНЮЩИЙ ПУТЬ ДОК IDE>/CodeBlocks/MinGW/bin/../lib/gcc/mingw32/4.9.2/../../../../mingw32/bin/ld.exe: cannot find -lwxmsw28ud_qa <ДЕАНОНЮЩИЙ ПУТЬ ДОК IDE>/CodeBlocks/MinGW/bin/../lib/gcc/mingw32/4.9.2/../../../../mingw32/bin/ld.exe: cannot find -lwxbase28ud_xml <ДЕАНОНЮЩИЙ ПУТЬ ДОК IDE>/CodeBlocks/MinGW/bin/../lib/gcc/mingw32/4.9.2/../../../../mingw32/bin/ld.exe: cannot find -lwxmsw28ud_adv <ДЕАНОНЮЩИЙ ПУТЬ ДОК IDE>/CodeBlocks/MinGW/bin/../lib/gcc/mingw32/4.9.2/../../../../mingw32/bin/ld.exe: cannot find -lwxmsw28ud_html <ДЕАНОНЮЩИЙ ПУТЬ ДОК IDE>/CodeBlocks/MinGW/bin/../lib/gcc/mingw32/4.9.2/../../../../mingw32/bin/ld.exe: cannot find -lwxmsw28ud_core <ДЕАНОНЮЩИЙ ПУТЬ ДОК IDE>/CodeBlocks/MinGW/bin/../lib/gcc/mingw32/4.9.2/../../../../mingw32/bin/ld.exe: cannot find -lwxbase28ud collect2.exe: error: ld returned 1 exit status
>>848314 Чтобы попробовать гуй, очевидно же. >>848315 Я незнаю, когда я прохожу по <ДЕАНОНЮЩИЙ ПУТЬ ДО IDE>/CodeBlocks/MinGW/bin/../lib/gcc/mingw32/4.9.2/../../../../mingw32/bin/, то я вижу ld.exe. Оно там есть. Как я понимаю, -lwxmsw28ud_richtext - флаг с которым оно пытается запустить этот ld.exe. Поэтому я не знаю почему оно так и прошу твоей помощи, анончик. Я не знаю как проверить работоспособность флага и же узнать почему он не работает.
>>848353 > Я не знаю как проверить работоспособность флага и же узнать почему он не работает. Ну блять, потому, что это какая-то либа которой не хватает.
Хелп, не могу вдуплить как реализовывать классы. Чтоб с перегрузкой стандартных операторов, в три файла и пространством имен, что это за магия?Можете пример какой-нибудь накидать?
Нормально ли что маленький pomodoro таймер на C++/Qt5 ест 50 метров памяти? Там ничего такого нет: сохранение/применение настроек (QSettings, пока что существует всегда, а не только когда нужен), звуковой сигнал (QMediaPlayer, объект создаётся только при необходимости и сразу же после использования удаляется), окно настроек (также создаётся лишь при необходимости) и иконка в трее с меню из 2 пунктов. Ну и естественно, объект-таймер, наследник QObject. +стоят обработчики событий на нажатия в главном окне чтобы его можно было перемещать (рамка окна отключена)
Valgrind молчит. Linux (openSUSE Tumbleweed), x64
Как серьёзно уменьшить потребление памяти не урезая прогу?
Нид хелп, имеется класс полиномов(многочлены от одной переменной) http://pastebin.com/trnA03AP это тестовый файл. http://pastebin.com/9ndn2jQ4 polynom h файл http://pastebin.com/mbseYCdJ polynom cpp файл Все компилируется, но во фразе polynom m3; m3=polynom(m1+m2); Вызывается конструктор, а не оператор копирования(который возвращает ссылку на объект типа полином).
>>848734 Создали объект, удалили его. Что не нравится в конструкторе пустом? При том, что вызывается не он, а обычный конструктор, вместо копирования. Ты помочь можешь?
>>848740 >То есть деструктор не нужно самому вызывать. Нет. > А почему срабатывает не тот конструктор? Приведи уже лог, чтобы я мог увереннее тебя отхуесосить
>>848744 Какой лог, я в это не умею, каутами(остатки которых ты можешь наблюдать) обнаружил, что в строке m3=polynom(m1+m2); вызывается polynom(int n, double *x) Хотя m1+m2 возвращает объект и по идее должен вызываться конструктор копирования polynom(&O) Где O – объект класса полином. Насчет деструктора да, если вырезать, то ничего не поменяется.
>>848766 Вот у меня есть конструктор копирования, приведи пример, как я должен его применять. Синтаксис конкретно этого куска взят, кстати, с сайта мелкомягких.
Сап, аноны. Пришла в голову идея учить на C++ геймдев. Имеется не до конца прочитанная книга Шилдта "Базовый курс" 2014-го. Почему не читаю до конца? Потому-что заебался и просто читать без практики нудно. Решил просто начать делать что-нибудь и, если будет непонятно, курить мануалы, книгу и гугл. Посему вопрос: с чего вообще начать в этом? Алсо, скажу, я не долбоеб и понимаю, что сразу начать с "мнагамилеоныхтридэигртипагэтэа" я не смогу, поэтому надеюсь на ссылки мини-игр, типа тетриса, 2д и прочего.
>>848887 Читай Доусона(Dawson) для основ, по делу - гугли и учи SDL или SFML, можешь для первого загуглить Remaking Cave Story in C++, хоть там много говнокода и неосвобожденной памяти, но для новичка сойдет
Сап ананасы. Я сейчас ковыряюсь с проектом, который весь из себя шаблон через шаблон а-ля метода из книжки Александреску. В итоге, дело идет неебически медленно.
Например, разбираюсь с шаблоном, в который мне нужно добавить код. Вижу функцию. Начинаю искать код функции. В итоге, спустя несколько прыжков по typedef'ам и куче классов (т.е. функция лежит в шаблонном классе, который через штук 5 других шаблонных классов и typedef'ов все-таки оказывается в том классе, с которым я, собственно, разбираюсь), я уже забываю блин, что, собственно, искал и зачем.
Для новичка это все выглядит пиздецки ебануто.
Подскажите, может есть какая метода, позволяющая как-то в подобном коде разобраться?
>>849432 >Компилируется, но на третью строку при запуске ругается Debug assertion failed. C++ vector subscript out of range. Что я делаю не так? Непонятно как такой код вообще скомпилировался, учитывая что ты обращаешься к элементу не по индексу и через точку вытаешься вызвать метод указателя...
А вообще — для уёбищ вроде тебя, которые не в состоянии перебрать вектор без эксепшена, сделали range based for.
>>849453 Какого хуя ты обращаешься к указателю, как к объекту?! Ежели эта хуйня каким-то магическим образом собралась у тебя, очевидно, что ты пытаешься обратиться вне вектора (очевидно, sizeof(Player) > sizeof(size_t))
>>849461 Все оказалось до неприличия просто. У меня уже было определение players в заголовочном файле, и я зачем-то переопределил его в local scope метода.
Нужно сделать api к базе данных(mysql). Посоветуйте что можно использовать для сервера, какие есть годные фреймворки. В проритете - готовые решения. Нагуглил связку nginx + fastcgi daemon, но хотелось ещё вариантов.
>>849697 Ассемблер же надстройка над машинными кодами. Даже CALL/RET - какие-то там циферки опкодов. А те в свою очередь надстройка над логическими элементами, которые в свою чоередь надстройка над току бегающему по камушку. Он в свою очередь надстройка над атомами и молекулярной сеткой. И эта рекурсия конца не имеет.
>>849719 Вот и доказали что количество отличий си от с++ стремится к бесконечности пополам. Почему пополам,хз, в математике не силен может надо квадратный корень
Сап крестач! В общем дело такое, я понемножку вкатываюсь в мир сисиплюса, ранее не программировал, занимаюсь с ментором! Дали задание на дом: сделать с помощью массива [3][3] - матрицу, при чем чтобы элементы матрицы запрашивались с клавиатуры, а в конце консоль выдавала полностью матрицу в правильном виде! По сколько я тупой ньюфаг, я решил создать 9 переменных и каждой из них с помощью scanf присваивать значение, ментор обоссал меня (полагаю что и вы сейчас сделаете тоже самое, но срашивать не у кого) и сказал что это тупо, и что нужно делать с помощью операторов for и while, подскажи легион как пральна?
Подскажите, почему в данном случае работать с указателями, а не напрямую. То есть если запустить так, то всё работает прекрасно, а если разкомментировать в main кусок, а другой закомментировать, то он будет выдавать совсем не то, что нужно. Возможно вопрос очень глупый, но я пока только разбираюсь в указателях и почему они нужны. http://ideone.com/uluMMf
>>850085 Буду гуглить, спасибо. >>850089 То есть нужно работать именно с тем объектом, который хранится именно по данному адресу, а не с тем, что находится где-то ещё?
>>850099 > То есть нужно работать именно с тем объектом, который хранится именно по данному адресу, а не с тем, что находится где-то ещё? У тебя есть два петуха. Ты отрубил голову одному, но хочешь, чтобы сдохли два. Два разных объекта никак вообще друг с другом не связаны.
>>850102 > ссаными тряпками за такое Ой, ладно, ну лень мне было в программе на сто строк везде писать std:: > Using Pattern > constexpr Pattern block = {...}; Про это еще не читал. > зачем нужны w, h; если есть уже size() в векторе? Затем что вектор это про хранение клеток, а не про размер поля. Да и за высотой тогда неудобно ходить будет. Или решу я поменять вложенные вектора на один длинный.
>>850102 >ссаными тряпками за такое Ой иди нахуй пидор, using для этого и придумано, всегда так делаю. Книжечку какую-нибудь модную прочитал, что за это надо чморить? Нацики охуели.
Анон, помоги пожалуйста. Если пользователь вводит строку "A build 2 : 3,3 : 1,2,3,4,5,6", как мне то, что между доеточий засунуть в 1 вектор, а то, что после второго двоеточия - во второй?
>>850298 >> cudaMalloc((void)&CU_POSR, *2); что за указатель?! >> N в каком месте он установлен, это дефайн? он не превышает число допустимых тредов, случайно?
>>850487 >> for (int next = 0; next < N; next++) { >> if (first != next) { >> cuAX_M[first] = 0.1 (cuPOSX[next] - cuPOSX[first]) / sqrt((cuPOSX[next] - cuPOSX[first])(cuPOSX[next] - cuPOSX[first]) + (cuPOSY[next] - cuPOSY[first])(cuPOSY[next] - cuPOSY[first])); >> cuAY_M[first] = 0.1 (cuPOSY[next] - cuPOSY[first]) / sqrt((cuPOSX[next] - cuPOSX[first])(cuPOSX[next] - cuPOSX[first]) + (cuPOSY[next] - cuPOSY[first])(cuPOSY[next] - cuPOSY[first])); >> } >> } Что это за хуйня? Зачем ты сначала пишешь в память, причем в одну и ту же много раз подряд и получаешь оттуда значение после последней записи, если уж оно так и должно быть (хотя я крайне в этом сомневаюсь), то какого черта ты не использовал локальные переменные (которые хранились бы в регистрах)
Под линукс в qt-паке идет только gcc. Допустим мне нужно собирать экзешники и под gcc, и под msvc (под линуксом, да, собирать экзешники, почему-то в гугле ничего подобного нет, будто нельзя сидя под одной осью делать софт под другую) Как сделать это, как замутить киты ?
>>850550 Не видел, чтобы такую хуйню вообще кто-то вытворял, знаю, что когда собирают софт под мак, виндусь и линупс под каждую выделяется хотя бы виртуальная машина с отдельным сборочным сервером.
>>850565 >850550 >Не видел, чтобы такую хуйню вообще кто-то вытворял, знаю, что когда собирают софт под мак, виндусь и линупс под каждую выделяется хотя бы виртуальная машина с отдельным сборочным сервером. А разгадка одна - тестирование. Ничего не мешает конпилить все где-то на линупсе, а потом раскидывать бинарники по воркерам и тестить. Но это хуйня, потому что билдеров и так должно быть много, а значит там уже есть виртуалки
>>849397 Вот так выглядит там стек вызовов. К слову, прога из ИДЕ не запускается, разваливается с какой-то ебанутой ошибкой доступа. Делал путем аттача к запущенному процессу.
Длина одной такой строчки порядка 800 символов, хех.
>>850678 Нет, в госконторе. Правда, ебля с этим проектом сильно бьет по мотивации. Я даже сроков не могу предсказать, когда я закончу внесение правок в него (предполагая, что я смогу это сделать за конечное время).
Поянице вкратце плиз. Вот я хочу сделать функцию-метод, которая вызывает другие функции-методы, которые вызывают другие функции методы. Как это сделать на крестах? То есть мне нафиг не нужны параметры-аргументы, мне просто нужна отсылочка так сказать. По базовым запросам по теме функции такого не объясняется, только с параметрами. Какую тему мне вообще погуглить?
ПС насколько помню, в яве я запросто это делал, а в крестах чет не получается
>>850926 >я хочу сделать функцию-метод, которая вызывает другие функции-методы, которые вызывают другие функции методы. А как ты из main() вызываешь обычную func1(), которая вызывает другую обычную func2()?
>>850947 //f1 мне нужна не столько как функция. а просто как отсылка к началу цикла, других отсылок, кроме как вызова функции я не знаю, если знаешь-подскажи //одна из функции функции, которая вызывает функции void f1() { if (bla){ bla; bla; ..} };
//функция с функциями, логично, вызывает функции void f() { f1(); f2(); };
//если условие такое-то, делает то-то и вызывает функцию с функциями if (bla) { bla; bla; .. f(); };
>>850927 >> static Это значит что данные из пространства имён имеют доступность только в одном файле? Ещё видел что делают заголовочный файл с обьявлениями без инициализации в пространстве имён. И суют этот хедерфайл где требуется. Так нужно? Или надо по другому строить программу(парадигма?)
Плюсач, вот поясни, почему unordered_set нельзя изначально было назвать hash_set? Последний короче и как бэ в любом случае намекает, что элементы неупорядочены. Поклонники стандарта говорят, мол unordered подразумевает, что каждый желающий может реализвать свою версию контейнера, и не обязывает основываться на хэшъ таблице.
Но тогда НАХУЯ у unordered_map наружу торчат методы rehash(), bucket_count(), load_factor()? Вот я работаю в фирме, которой захотелось сделать заточеный под свои нужды unordered_map, внутри которого массив и линейный поиск. Как я тогда должен сделать rehash() и bucket_size()?
И второе, если слово unordered умышленно скрывает внутреннее устройство, то зачем метод rehash() раскрывает его?
Парни, я кажется вкурил. Я просто забил на матчасть.
1)В .h файле я должен написать декларацию функции(по параметрам), которую собираюсь создать. То есть в моем случае без параметров это будет просто void f();
2)В .cpp файле я должен написать определение функции, то есть что она делает. То есть void Class::f () { }; (могу ли я записать это в .h файле сразу под декларацией?)
3)И затем уже в самом классе я могу вызывать функцию просто написав f(); -верно? (нужно ли при вызове писать void?)
>>850959 >>850939 То есть вызов функции здесь будет : код... код... checkEN(); dead(); код... код...
Верно?
И еще вопрос уже о другом немного.
У меня есть определенные данные. Потоки, функции и тд. У меня есть куча .cpp с разными классами. Мне нужно как-то по-простому включить эти данные в в .cpp файлы, чтобы ясен пень не копировать каждый раз. Как это сделать?
Вот в любой .cpp файл я включаю(#include) data.h. data.h декларикует класс в data.cpp. Как сделать так, чтобы класс data 'слился' с любым другим классом .cpp? То есть если я просто сделаю #include то с точки зрения комплиятора это будет выглядеть как разные классы, идущие поочередно, без зависимостей от друг друга.
И может нужно делать не класс, а что-то другое? Спрашиваю потому, что знаю что, допустим, в ява все является классом, но в крестах вроде бы не так.
ПС и самый неважный косметический вопрос, у с++ есть паки, в которые можно складывать классы? Я ява допустим есть Проект->Паки->классы-файлы. Можно в один класс включить другой import.packagename.classname. Можно также сделать с с++?
>>850998 1. да, но если у тебя класс будет использоваться ИСКЛЮЧИТЕЛЬНО ЕДИНОЖДЫ, например, как скрытая реализация, то можно его определить в файл сорцов (cpp) 2. да, например class C { void f() { printf("f()\n"); } } 3. не нужно
Какие данные, их разве нельзя уместить в один заголовочный (h) файл и потом везде, где нужно, инклюдить?
>>850981 1) Легаси блять. У майкрософта вроде уже была такая хуитка в стандарте; 2) Чтобы созвучно было, лол. Так же хорошо помогает забыть об обосрамсе комитета с hash_map.
>>850967 >Это значит что данные из пространства имён имеют доступность только в одном файле? Это значит что переменная доступна до окончания программы >Ещё видел что делают заголовочный файл с обьявлениями без инициализации в пространстве имён. И суют этот хедерфайл где требуется. Так нужно? Так можно. Так например настройки программы реализуются которые нужны во всех ее частях. Но вообще, объявлять переменную и не инициализировать это моветон. >Или надо по другому строить программу(парадигма?) Понимаешь, если ты будешь всюду пихать глобальные переменные бездумно, то нахуя ты вообще плюсы изучаешь? Можешь джаву например попробывать, или там дотнет какой.
Затем у меня есть иницилизация элемента класса HelloWorld в .cpp
У меня есть данные: переменные и функции. Все это надо чтобы было включено в иницилизацию класса, любого, а не только HelloWorld.
Проблема еще в том, что в data есть осылки к текущему объекту класса( то бишь this).
В итоге я сейчас ломаю голову как это сделать. Надо создать функцию void Data(), но тогда её надо полноценно декларировать, да я еще хз надо ли пихать класс. Ууу, как с непривычки запутанно.
Если создать CUDA-аналог, по большей части void APM_Math() заменить на: http://pastebin.com/YZYf8qv3 То ничего не считается, но компилируется нормально.
>>851080 А что за история с обосрамсом hash_map была?
Дело такое, что у нас для неупорядоченных ассоциативных контейнеров _ уже _ есть три структуры данных, массив и две хешъ таблицы.
Никак не можем придумать название обволакивающего интерфейса, UnorderedSet слишком длинно и напоминает СТЛ, а HashъSet слишком конкретно и намекает на внутренние детали имплементации.
Устроился на работу чтобы кодить на vhdl, а посадили за плюсы на билдер шестой. Ни плюсов ни билдера не знал. Помыкавшись чутка освоился и мне дали задание - найти причину вылета программы с синим экраном. Точнее не так. Есть прога на плюсах, которое что то отсылает и принимает с оборудования через пси плату с которой прога работает через драйвер по прерываниям. Данную плату надо сначала открыть, проиницилизировать, а по окончанию остановить и закрыть. Когда отключаешь оборудование, выходишь из программы и включаешь оборудование обратно, возникает синий экран смерти. Вопрос - что мне рассмотреть в первую очередь в коде программы? Есть подозрение, что тут косячит неправильное закрытие пси платы. Или какая то бабуйня с потоками или что-то с динамической памятью. Я вообще без понятия. Помогите братцы!
>>851535 Надо зачекать. Именно после выключения оборудования и после выхода из программы, а потом включении оборудования выходит синий экран. Почитал про ошибку, что то про обращение аппаратуры к запрещенным участкам памяти
Понимаю, что вопрос про сети, а не язык C++. Учусь программировать на C++, потому вопрос сюда. Есть сервер, сервер запускает поток ожидания подключения клиента, поток ожидания получает сокет клиента и создает для него новый поток обмена данными. Общение с клиентом происходит через recv() и send(), которые блокируют поток до send() и recv() со стороны клиента. Поток обмена клиента будет иметь доступ к recv_buff, recv_buff_len, send_buff,send_buff_len. К этим же объектам будет иметь доступ код работы с клиентом, который будет просто знать, что если в recv_buff_len что-то отличное от нуля, то надо считать recv_buff_len байт из recv_buff. Так же и с send_buff. Но тогда потребуется 2 потока, так как recv() и send() блокируют поток и не могут независимо обрабатываться в одном потоке, скорее всего и для кода обработки клиента еще поток понадобится. В общем чувствую что что-то я не так делаю в организации своей программы, подскажите плз, как обычно обрабатывается обмен клиент-сервер. Предполагается что я не знаю когда клиенту приспичит что-то отправить, а когда серверу. Хочется универсальности.
>>851426 Еее, то самое, спасибо. Мне и надо было просто указать на тему.
Книжка хуйня, читаешь туторы тоннами, книги перечитываешь, а толку-то если эти закорючки не запоминаются без практики. Нужна практика. А когда практикуешься- с другой точки зрения смотришь.
В яве сидишь, просто хуячь функции только так, хоть рекурсую пили-и так сойдет. А в крестах мне пришлось уточнять как это делать. Хотя подумаешь, функция, она и в Африке функция.
1 поток на приём, он спавнит на каждого нового клиента свой поток. В этом потоке хэндлится recv. Если в recv есть что-то интересное, кидай в очередь ивент. Ивенты обрабатывай отдельным потоком своими хэндлерами. На пример, если у тебя один из клиентов хочет всем другим разослать сообщение, то он отправляет его на сервер. Поток клиента считывает его, определяет тип ивента и кидает его в очередь. Поток на очереди применяет соответсвтующий хэндлер, проходится по мапе с объектами и рассылает всем сообщение.
>>851584 >Читай исходники вебсерверов Я только учу cpp, то что сам написал с трудом понимаю >читац статьи про асинхронность Я работаю с синхронными сокетами > ивентлупы, Да там что-то про то чтобы не плодить кучу потоков.
Вобщем реализую как могу криво, а потом буду изучать всякие технологии, я прост пока что язык изучаю, а чтобы было интересно пишу делаю свой™ класс для работы с клиент-сервер. Думал, что все как-то проще.
>>840964 (OP) Поясните за std::string, что это за тип и чем от обычного string отличается? Нахуй он нужен и почему без этого std:: не выходит насрать в гуй?
>>851629 Что за обычный string? У std::string размер элемента - sizeof(char), то есть 1 байт, естественно, без игры локалями, больше двух языков выдавить из него ничего не удастся, а из азиатских алфавитов - то вообще нехуй делать с таким типом (для этого есть std::wstring - тут уже два байта на элемент), как и сказал уважаемый господин выше.
Можете ответить на пару вопросов? Программирую на PHP, сейчас учусь программированию на C++, как я понимаю строки тут нужно помещать в массив char, к примеру char string[] = "Lorem ipsum dolor sit amet" т.е. одна буква будет равняться одному элементу массива string, а из скольки тогда максимум элементов может состоять массив? Или сколько максимальное количество символов может содержать строка string[]? И ещё как помещать много строк в переменную? В php это бы выглядело просто $string = " Lorem ipsum dolor sit amet consectetur adipiscing elit. Ut a dui est. Fusce lobortis luctus augue a onvallis. Vestibulum ante ipsum primis ... "
Пожалуйста, помогите дебилу, не могущему в ООП Если конечный класс наследует один интерфейс с чистой виртуальной функцией, и один класс в котором эта функция реализуется, что нужно исправить, чтобы ReB можно было инстанцировать? http://pastebin.com/sHWFhG8g
>>851775 В другой проге, использующий данный драйвер и плату, ничего не крашится. Я смог выловить ошибку на синем экране IRQL_NOT_LESS_OR_EQUAL. Погуглив выяснил, что или драйвер обращается к запрещенному участку памяти то ли ещё хуй знает что. Надеюсь, что поможешь мне навестись в правильном направлении, а то я совсем нихуя не умею и не знаю.
Пока что решил сделать клон куска программы, как новую прогу, дабы точно локализовать место косяка в коде.
>>852181 Спасибо, Еще один вопрос, если в ReA вместо override - final, это уже никак не исправить, нужно уже разделять интерфейсы, чтобы ImB не содержал ту функцию, которая финализируется в ReA ?
>>852188 Тебе совсем не понятно, что драйвер не должен крашиться кто бы его ни использовал?
Если его используют некорректно (суют неверные адреса, дескрипторы и любые другие параметры), он должен уметь это обрабатывать и сообщать об ошибке, а не валить систему в BSOD.
>>852320 Каждый раз нужно прописывать вручную через гуи, либо .. Попробуй освоить cmake, там весь солюшн с либами, путями и прочими долгонастраевыми через гуи вещами генерируется за 2 секунды через батник или сх, если все правильно написал.
>>850816 Прикол в том, что Александреску я быстренько пробежался. Ну да, типа уловил кое-каие принципы. Но код от этого читабельнее не стал, лол.
Ну, пока ковыряюсь в этом гавне. Будет возможность съебать в другое место, где хотя бы будут люди, могущие что-то подсказать и объяснить (или задачи близкие моему уровню), съебусь. Ибо скилл от ковыряния в этом гавне ни на йоту не растет. Скилл, очевидно, растет когда ты пишешь код в первую очередь. А тут я три месяца пописал код и вручили эту парашу.
>>852723 На самом деле - скилл растет как раз тогда, когда ты читаешь код. Ты пропускаешь сквозь себя работу других программистов, и постоянно узнаешь что-то новое (и плохое, и хорошее). Когда ты сам пишешь код - ты ничего нового не узнаешь.
>>840964 (OP) Где в шиндовс держать репозиторий третьих вечеринок? Вот допустим, скачал я проект, которому нужен буст, небо и аллах. Можно ли как-то указать вижал сдудии глобально, где находится папка со всеми собранными либами и заголовками? И чтобы все новые проекты, которые я пытаюсь собрать, сразу смотрели зависимости том, и не сношали мне мозг? и чтобы его можно было просто расширять
>>852807 >На самом деле - скилл растет как раз тогда, когда ты читаешь код. Ты пропускаешь сквозь себя работу других программистов, и постоянно узнаешь что-то новое (и плохое, и хорошее). Когда ты сам пишешь код - ты ничего нового не узнаешь. Пиздеж бессовестный. Скилл повышается именно при написании кода, когда ты сталкиваешься со всеми проблемами и мелочами, с которыми сталкивались те самые хорошие программисты. Писать свой код с нуля лучше, чем читать чужой. А еще лучше писать свой и читать в процессе чужой, сравнивая свои решения с чужими.
>>852807 >На самом деле - скилл растет как раз тогда, когда ты читаешь код. Может у опытных пацанов и так. Для новичков наверное лучше все-таки руку понабивать, освоиться и все такое.
Позвольте вам поднасрать. Почему, когда я использую серийный for, то код ниже перестаёт работать?
[CODE lang="C++"]int main() { int array[3]; for (auto i=0; i<=3; i++) // или for (auto i : array); array=i; for (auto i=0; i<=3; i++) // или for (auto i : array); std::cout << array; }[/CODE]
>>853031 Хуйня получилась из-за того, что скобочки съелись у array. Просто в книжке аналогичный код, и я сделал тютелька в тютельку. А при вы полнении выскакивает ошибка сегментации.
>>853045 Индексы почему-то сжираются при постинге, а <= я давно поправил. Суть-то в том, что обыкновенный for работает, а серийный for - нет (при исполнении - ошибка сегментирования).
>>853126 "нормальность" -- это всего-лишь показатель используемости того или иного метода. если ты ориентируешься по этому показателю, то съеби. а так, всё зависит от твоей задачи и о того, перевесят ли плюсы того или иного метода его минусы. обычно от стльных контейнеров не наследуются из-за отсутствия у оных виртуального деструктора, что пускает по шляпе полиморфность и ведёт к ликам. в стль практикуется разделение контейнеров и алгоритмов (те обычно выделены в свободные функции). попробуй сделать на подобии этого. иной вариант сделать так: template<typename T> class Yoba { std::vector<T> vec; ... };
или, в принципе, вот так template<typename T> class Yoba : private std::vector<T> { using vector = std::vector<T>; public: using vector::push_back; using vector::operator[]; using vector::begin; using vector::end; Yoba operator*(const Yoba & ) const; Yoba operator+(const Yoba & ) const; Yoba (); virtual ~Yoba (); };
Обьясняю ситуацию. Есть проект, древний, собирается под старые (очень) Винды на новом MiinGW-w64. К бинарнику libstdc++ линкуется статически. Libstdc++ в свою очередь динамически тянет из msvcrt.dll функции. Прикол в том что на говне мамонта под которое надо компилить проект в msvcrt.dll нету всех необходимых экспортов.
Ок. Я взял в руки HIEW и IDA, покопался в таблице импортов получившегося бинарника, посмотрел что же использует эти отсутствующие импорты и понял что их использует функции из libstdc++ которые моим кодом никогда не вызываются. Из таблицы импортов я вынес нахуй эти ненужные импорты, занопил от греха подальше их вызовы и... все заработало. Какой я блядь молодец.
Теперь стоит вопрос об автоматизации этих костылей:
1) Вариант крайний, не предпочтительный. Написать патчер (хоть блядь на шелле с использованием dd или еще какого говна, всеравно под cygwin'ом компилю), который потом в мейке вызывать. Просто и сурово.
2) Пересобрать libstdc++, вычистив оттуда ненужное говно. Самый элегантный, но гайда по пересборке статического варианта libstdc++ для MinGW я не нашел.
3) Заставить на этапе линковки ld подменить импорты у статически приделываемой libstdc++. Вот тут я вовсем хз, возможно ли в принцыпе такое провернуть? Правда еще остается вопрос с кодом который вызывает эти импорты. Как я говорил, он в принципе никогда вызываться не должен, но его присутствие всеравно мне не нравится.
Собственно, гуру пикапа GCC и MinGW - подскажите по 2-му и 3-му пункту. Что из этого реально и где про такое почитать?
>>853194 Может проще сделать dll-прокладку, которая будет дергать системные функции из msvcrt, где они доступны, или заглушки, если системной функции нет.
>>853126 Нельзя. У всех STL контейнеров невиртуальный деструктор, соотв-но бибу соснешь. Если тебе надо как-то что-то кастомизировать - напиши обертку.
>>853210 Ты имеешь в виду подсунуть проксевый MSVCRT, в котором будут сквозные экспорты существующих функций и заглушки для не-существующих? Мне не хочется поставлять еще одну DDL'ку с проектом, да и вариант такой-же топорный как и первый мой предложенный с патчером. Лучше уж патчер тогда.
>>853302 Я проверял этот вариант. Более новые MSVCRT импортят из KERNEL32 и прочих системных DLL функции которых на некроговне нет. И чем новее, тем больше неудвлетворенных зависимостей. Так что приходится работать с дефолтным MSVCRT. Да, проект KernelEx я тоже проверял, но увы оно эмулит далеко не все экспорты KERNEL32 которые нужны новым MSVCRT.
>>853287 А что я с ним буду делать? Либы как им собрать я понимаю, а куда бы разместить кучку собранных либ или симлинков на них, чтобы студия автоматом от туда все брала.
>>853461 Не, ему надо, чтобы они автоматически добавлялись в левые проекты, насколько я понимаю. Начиная с VS2010 убрали возможность делать общие настройки для всех проектов, в общем-то, теперь будешь сосать лапу.
Ананасы, хочу десктопить на крестах (фриланс). Встал вопрос о выборе гуев. MFC почти ничего не дает из коробки + целевая платформа только шиндовс. На QT нужно покупать дорогую лицензию + громоздкость, хоть он и прекрасен. Какие еще стулья есть? wxWidgets ведь для совсем отбитых, зато швабодка и windows/unix/osx в таргетных платформах. Должны быть еще какие-то швабодные кавайные гуи, подскажите пожалуйста.
>>854359 #undef main перед main(), выстави форсированно консольный проект в опциях, и гугли про "SDL stdio_legacy_definition", если начнет гундеть про какое-то говно типа iob_file
>>854583 Ну да, я бы и сам не против, только ни одна нормальная IDE не может жрать ни мейкфайлы ни какие-либо другие, кроме своих (за исключением clion'a, который проекты делает на основе cmake). Я бы и сам, конечно, рад перейти на WAF или SCons, только вот ни автокомплита, нихуя тебе не будет, а ебаные полу-редакторы типа VIM или emacs не могут мне позволить жрать громадный проект, при этом следя за вложенными проектами, такие дела. Вот теперь и приходится жрать, что дают.
>>854601 Читай OpenGL, тебе SDL нужен будет в том случае только для создания контекста. А в OpenGL минимальный набор - полторы функции, которые даже Сталин бы освоил (без расстрела Khronos'а, естественно).
>>854725 >за исключением clion'a, который проекты делает на основе cmake И в этом он ничем не отличается от других IDE, использующих свои собственные форматы проектов, т.к. cmake-файлы он переваривает только им созданные.
C++. Аноны, срочно. Есть функция float huy (float x1, float x2) { float X; X = x1 + x2; return X; } Она считает X. Мне нужно из другой функции обратиться к этой и вывести X. Бля, надеюсь понятно. Я пытался вывести результат посредством float X1 = huy (); Но нихуя.
>>855044 По сути да, но хотя бы поддерживает хоть какой-то генератор. Вообще, там очень много просят люди, но жид-брэйнс не спешат реализовывать поддержку, скажем automake или makefiles, потому что других багов достаточно.
Кто выдаст ошибку, если не определена функция main и если определено 2 функции main? В обоих случаях компоновщик когда уже в exeшнике из библиотек будут ссылаться на main, правильно? Потому что компиллятору похер, он не формирует автоматически эту функцию.
Не могу понять почему так происходит в выделенной строке. Сначала а присваивается b, потом c присваивается d, а потом вдруг резко a присваивает d. Почему так ?
>>855251 В комитете одни старики, комитет очень забитит производительность и принятием очередного стандарта они пытаются выдавить максимум говна из старых вещей, зачастую не добавляя каких-либо в корне новых. Спустя только 6 лет после появления ЦоПэ11 в библиотеку приехали функции для работы с файловой системой, ну, конечно, всякие ништяки тоже есть (особенно для шаблоноебов полезные, например, сворачивание выражений). Сторонних либ, конечно, итак полно, но самый основной вопрос для меня, где, вашу мать, сериализация?! Мне бы статической за глаза хватило бы, но, блять нет же. Году к 2026, наверно, родят.
>>854835 Тащемта нарисовать наклонную линию с антиалайсингом непросто, нужно изобретать велосипед, за что принято расстреливать. Только готовые либы, например, SDL_gfx.
У меня глупый такой вопрос. А вот все эти нововведения, стандарты и добавления в язык/компиляторы, оно ведь только на уровне, так сказать, программиста делается? То есть, можно ли было в 80-ых написать всё то же самое (добиться выполнения некоторых действий/получения результата), что есть сейчас, или есть что-то, что по каким-то причинам именно невозможно, какое бы количество костылей не использовалось? Если есть такое, было бы интересно пример увидеть.
>>855285 Потому что (a = b) возвращает a: http://ideone.com/nP6mv9 (a = b) = c = d -> (выполняются скобки, значение b присваивется a) -> a = c = d -> (значение d присваивается c) -> a = c -> (значение c (равное d) присваивается a) -> a.
>>855320 Чтобы вынести что-то там в компайлтайм. Самое смешное, что constexpr не даёт вообще никаких гарантий, лол, это всё такая же услужливая просьба компилятору как inline. >>855331 Абсолютно всё было реализуемо, просто большинство всё ещё писало на асме/коболе/алголе/обоссаном диалекте лиспа и хотелки были совсем другие. Ну и ограничения на самих компиляторах были другие — попробуй сделать неоднопроходную залупу с всевозможными выводами типов, дедукцией шаблонов, компайлтайм хуитой и тд когда у тебя 640кб (те самые знаменитые, лол) оперативки в лучшем случае. Явно не очередным рекурсивным спуском дело заканчивалось.
>>855320 > Зачем в ЦоЖоПэ17 добавили if constexpr(), конпеляторы ведь издревне умеют выкидывать неиспользуемые операции при включенных оптимизациях. >>855362 > Самое смешное, что constexpr не даёт вообще никаких гарантий, лол, это всё такая же услужливая просьба компилятору как inline.
>>855392 >constexpr guarantees compile-time evaluation is possible if https://isocpp.org/blog/2013/12/constexpr А вот так по-олигофренски работает constexpr, щито оделать, какой язык такая аудитория.
>>855395 Шестой гусь уже нормально делает, на 4.8 не смог проверить - сломал библиотеки, лол. Даже без constexpr создает, так что да, constexpr он, вроде как и интересен, но и одновременно бесполезен оказался.
В constexp if допускаются только константные выражения (вычисляемые на этапе компиляции). constexpr if ОБЯЗАН отрабатывать в compile-time, т.к., например, в выкидываемой ветке может оказаться вызов несуществующего метода или какие другие конструкции которые не то, что вычислить в рантайме нельзя, но и просто скомпилировать код с ними.
>>855419 Я вообще не читал коммент про constexpr if(а просто увидел кейворд и решил набросить о том, как оно работает) но один хуй это чуть расширенная версия ifdef без задач.
Конкретно наброс такой: constexpr, если ему дать не константу просто молчаливо отработает в рантайме, без ошибки и нихуя => юзабельно пока проект пишет 1 человек (и без таймскипов).
Хотя в плюсах вообще все через такой вот анус реализовано, чему удивляться.
>>855433 При чём тут это мертворожденное говно вообще, поехавший? Нахуя вообще статическая типизации и прочее кококо, если по прежнему нужно искать подобные детские косяки в рантайме?
>>855441 >При чём тут это мертворожденное говно вообще, поехавший? Ну так скажи где сделано нормально.
>>855441 >Нахуя вообще статическая типизации и прочее кококо, если по прежнему нужно искать подобные детские косяки в рантайме? Вот есть например const методы у классов. Они гарантируют что метод не изменяют состояние объекта к которому применены. Однако, их можно вызвать и для не константного объекта. Т.е. const условно говоря означает что методу хватает для работы и константного объекта. Примерно такая же аналогия работает и для constexpr функций. Модификатор означает что функции "хватит для работы" и компайл-тайма. Это не значит что она будет работать исключительно в компайлтайм, точно также константные методы могут применяться и для неконстантных объектов. Все по аналогии. Однако для constexpr функций у компилятора шире возможности по оптимизации кода. Если для const функций компилятор зна Кроме того, можно использовать constexpr вычисления в качестве параметров шаблона или в качестве размерности массива, что раньше можно было достаточно геморно. >если ему дать не константу просто молчаливо отработает в рантайме, без ошибки и нихуя Так дай ему constexpr константу, даун тупой, будет тебе ошибка.
>>855498 >Так дай ему constexpr константу, даун тупой, будет тебе ошибка. Что ты за хуйню написал? >Кроме того, можно использовать constexpr вычисления в качестве параметров шаблона или в качестве размерности массива, что раньше можно было достаточно геморно. Костыль моего костыля - мне вообще не костыль? >Однако для constexpr функций у компилятора шире возможности по оптимизации кода Чем же они отличаются для рантаймового constexpr от const? Занитриговал. >Ну так скажи где сделано нормально. В любом диалекте лиспа. Только это вообще не язык, а строительный материал это другие языки, с другими требованиями, и тащить породию на подобный функционал в, блядь, плюсы да и ещё с такой реализацией - веселуха полная.
Кстати, пока знающий шизоид в треде - почему в 11-х плюсах constexpr настолько кастрированные? Причём совсем до сумашествия - тот же тернарный оператор вместо if else.
>>855426 > один хуй это чуть расширенная версия ifdef без задач. Гениев (буду политкорректен) полон тред...
На этапе препроцессинга у тебя нифига кроме токенов нет, а на этапе constexpr if есть доступ к информации о типах, можешь type traits использовать на полную катушку.
Optical character recognitionАноним12/10/16 Срд 22:03:57#499№855553
Подскажите, какие существуют открытые библиотеки для распознавания текста с изображений с возможностью подключения в С++? Помимо OpenCV и TesseractOCR
Задание написать функцию, суммирующую все аргументы. Темплейт, варьируемое количество аргументов. http://ideone.com/jv4Li9 не накостылял ли я? Три typename'а смущают, хотя и по-другому, вроде бы, никак.
>>855943 http://ideone.com/jIDu1b Так лучше, по-моему, тут вывод типов общий, если ты решищь запихать float или double вместе с впереди идущими целочисленными, значения не обкастрируются
>>856006 Так у меня, вроде, тоже ничего не кастрируется. Ведь при операциях над разными типами оно само к "наивысшему" приводит, если не указано другого.
>>856080 Что-то я не понял, что это и как связано с моей задачей. И фраза >an operator with precedence below cast at the top level Оператор находится на топ левеле и его приоритет ниже каста или приоритет оператора ниже "каста на топ левеле"? И что вообще под топ левелом подразумевается, та часть выражения, которая вне всех скобок?
>>856309 >> Так у меня, вроде, тоже ничего не кастрируется. Ведь при операциях над разными типами оно само к "наивысшему" приводит, если не указано другого.
У тебя на выходе получается в любом случае long double вне зависимости от типов, поданных на вход. Если ты передашь два char'а, скажем, он сначала их сложит, а потом сконвертирует в long double, что само по себе уже затраты. Само по себе такое сложение двух целых чисел не даст существенного снижения производительности, но когда ты начнешь складывать уже три целых числа, то у тебя вторым шагом будут складываться два long double, что, само по себе, очень затратная операция (относительно сложения целых чисел).
>>856312 >У тебя на выходе получается в любом случае long double вне зависимости от типов А, так это по условию так надо. Получается, самый оптимальный и отвечающий условиям вариант это функции с args... возвращать common_type, а в функции с одним аргументом — long double, так?
>>856317 Смотря на то, что ты желаешь получить на выходе. Если ты желаешь выхлоп в виде long double, то можно не париться с выводом общего типа, если хочешь, чтобы было быстрее, делай вывод общего типа для аргументов. Если ты делаешь суммирование одного значения, то используй тип аргумента как тип возвращаемого значения.
>>840964 (OP) Крестаны, хелп. Есть QQuickWindow, как определить, когда оно частично или полностью закрыто другими окнами? visibility подходит только для свёрнутого окна. Попробовал со стороны window() подцепиться к exposeEvent, но isExposed() всегда (кроме сворачивания) выдаёт true, соснулей.
Что за флаг -l ? -lGL -lGLEW, например. Это ведь хэдеры, которые (у меня) в /usr/include лежат. Почему нельзя написать -I/usr/include ? И чем определяется имя библиотеки? Почему GL, а не OPENGL?
>>856659 Но это же хуевый костыль. Я так понимаю, без дрочева с винапи для получения всех окон, сравнивания позиций вручную, описанную проблему не решить.
>>857026 Дохуя в чём. ==12073== Memcheck, a memory error detector ==12073== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al. ==12073== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info ==12073== Command: ./govno ==12073== ==12073== Invalid write of size 8 ==12073== at 0x400A69: main (govno.cpp:12) ==12073== Address 0x5ab5c98 is 0 bytes after a block of size 24 alloc'd ==12073== at 0x4C2E80F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==12073== by 0x400A38: main (govno.cpp:10) ==12073== ==12073== Invalid write of size 4 ==12073== at 0x400ADD: main (govno.cpp:15) ==12073== Address 0x5ab5cf0 is 0 bytes after a block of size 16 alloc'd ==12073== at 0x4C2E80F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==12073== by 0x400A68: main (govno.cpp:12) ==12073== ==12073== Invalid read of size 8 ==12073== at 0x400AA0: main (govno.cpp:15) ==12073== Address 0x5ab5c98 is 0 bytes after a block of size 24 alloc'd ==12073== at 0x4C2E80F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==12073== by 0x400A38: main (govno.cpp:10) ==12073== ==12073== Invalid read of size 4 ==12073== at 0x400B31: main (govno.cpp:18) ==12073== Address 0x5ab5cf0 is 0 bytes after a block of size 16 alloc'd ==12073== at 0x4C2E80F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==12073== by 0x400A68: main (govno.cpp:12) ==12073== ==12073== Invalid read of size 4 ==12073== at 0x400B80: main (govno.cpp:19) ==12073== Address 0x5ab5d40 is 0 bytes after a block of size 16 alloc'd ==12073== at 0x4C2E80F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==12073== by 0x400A68: main (govno.cpp:12) ==12073== ==12073== Invalid write of size 4 ==12073== at 0x400B8D: main (govno.cpp:19) ==12073== Address 0x5ab5d40 is 0 bytes after a block of size 16 alloc'd ==12073== at 0x4C2E80F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==12073== by 0x400A68: main (govno.cpp:12) ==12073== ==12073== Invalid read of size 8 ==12073== at 0x400B21: main (govno.cpp:18) ==12073== Address 0x5ab5c98 is 0 bytes after a block of size 24 alloc'd ==12073== at 0x4C2E80F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==12073== by 0x400A38: main (govno.cpp:10) ==12073== ==12073== Invalid read of size 8 ==12073== at 0x400B4B: main (govno.cpp:19) ==12073== Address 0x5ab5c98 is 0 bytes after a block of size 24 alloc'd ==12073== at 0x4C2E80F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==12073== by 0x400A38: main (govno.cpp:10) ==12073== ==12073== Invalid read of size 8 ==12073== at 0x400B70: main (govno.cpp:19) ==12073== Address 0x5ab5c98 is 0 bytes after a block of size 24 alloc'd ==12073== at 0x4C2E80F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==12073== by 0x400A38: main (govno.cpp:10) ==12073== ==12073== Invalid read of size 4 ==12073== at 0x400BDF: main (govno.cpp:23) ==12073== Address 0x5ab5cf0 is 0 bytes after a block of size 16 alloc'd ==12073== at 0x4C2E80F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==12073== by 0x400A68: main (govno.cpp:12) ==12073== -33 -36 -27 1 -43 1 -36 -42 0 1 -12 1 -40 -9 -13 ==12073== Invalid read of size 8 ==12073== at 0x400BCF: main (govno.cpp:23) ==12073== Address 0x5ab5c98 is 0 bytes after a block of size 24 alloc'd ==12073== at 0x4C2E80F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==12073== by 0x400A38: main (govno.cpp:10) ==12073== 1 1 1 -22 1
==12073== Invalid read of size 8 ==12073== at 0x400C71: main (govno.cpp:37) ==12073== Address 0x5ab5c98 is 0 bytes after a block of size 24 alloc'd ==12073== at 0x4C2E80F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==12073== by 0x400A38: main (govno.cpp:10) ==12073== ==12073== Invalid read of size 8 ==12073== at 0x400C9B: main (govno.cpp:38) ==12073== Address 0x5ab5c98 is 0 bytes after a block of size 24 alloc'd ==12073== at 0x4C2E80F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==12073== by 0x400A38: main (govno.cpp:10) ==12073== ==12073== Invalid read of size 4 ==12073== at 0x400C81: main (govno.cpp:37) ==12073== Address 0x5ab5cf0 is 0 bytes after a block of size 16 alloc'd ==12073== at 0x4C2E80F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==12073== by 0x400A68: main (govno.cpp:12) ==12073== ==12073== Invalid read of size 4 ==12073== at 0x400CAB: main (govno.cpp:38) ==12073== Address 0x5ab5cf0 is 0 bytes after a block of size 16 alloc'd ==12073== at 0x4C2E80F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==12073== by 0x400A68: main (govno.cpp:12) ==12073== ==12073== Invalid write of size 8 ==12073== at 0x400CDC: main (govno.cpp:39) ==12073== Address 0x5ab6280 is 0 bytes after a block of size 32 alloc'd ==12073== at 0x4C2E80F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==12073== by 0x400C2D: main (govno.cpp:29) ==12073== -45 -72 -109 -31 ==12073== Invalid read of size 8 ==12073== at 0x400D7F: main (govno.cpp:48) ==12073== Address 0x5ab5c98 is 0 bytes after a block of size 24 alloc'd ==12073== at 0x4C2E80F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==12073== by 0x400A38: main (govno.cpp:10) ==12073== ==12073== Invalid read of size 8 ==12073== at 0x400D9B: main (govno.cpp:48) ==12073== Address 0x5ab5c98 is 0 bytes after a block of size 24 alloc'd ==12073== at 0x4C2E80F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==12073== by 0x400A38: main (govno.cpp:10) ==12073== ==12073== ==12073== HEAP SUMMARY: ==12073== in use at exit: 72,704 bytes in 1 blocks ==12073== total heap usage: 8 allocs, 7 frees, 73,848 bytes allocated ==12073== ==12073== LEAK SUMMARY: ==12073== definitely lost: 0 bytes in 0 blocks ==12073== indirectly lost: 0 bytes in 0 blocks ==12073== possibly lost: 0 bytes in 0 blocks ==12073== still reachable: 72,704 bytes in 1 blocks ==12073== suppressed: 0 bytes in 0 blocks ==12073== Rerun with --leak-check=full to see details of leaked memory ==12073== ==12073== For counts of detected and suppressed errors, rerun with: -v ==12073== ERROR SUMMARY: 58 errors from 18 contexts (suppressed: 0 from 0)
Постpоить класс для pаботы с многочленами. Класс должен включать соответствующие поля: порядок, набор коэффициентов. Класс должен обеспечивать пpостейшие функции для pаботы с данными классами: вычисление значения многочлена для данного параметра, вывод многочлена в удобной форме и т.д.
Смотрю тут cppconчиту 2016. Преодолев отвращение, решил глянуть на доклад "Latest and Greatest from the Visual Studio Family for C++ Developers".
У них охуенный прогресс: в 2016-м году они узнали об SSA и теперь их компилятор выдаёт не совсем говнокод. См. пик. 1. Кстати, откуда берутся сперманьки, которые вопят, что компилятор от MS самый лучший? Стоит только глянуть на результаты старого оптимизатора, как понимаешь,что все восхвалятели MSVC — ебанутые.
Ладно. Решил я глянуть, а что же там выдаёт шланг. Смотрим на пик. 2. Но погодите!!! Это ведь почти тот же код, что сейчас выдаёт студия! Разница ECX и EDI из-за разных calling conventions. В MSABI первый аргумент идёт в RCX, в SYSVABI — в RDI. Ну и разница в LEA. rcx*2 против rdi+rdi. Скорее всего MS проходятся по асму peephole-обфускатором и делают замену второго на первое, чтобы никто не догадался о заимствованиях.
Вот так вот. Предупреждали вас, господа llvm-щики, что заигрывание с пермиссивными лицензиями добром не кончится. Спиздят ваш код и спасибо не скажут.
Есть инжектор функции в память процесса, и четыре функции, которые я пытаюсь заинжектить. Проблема в том, что инжект каждой из них происходит успешно, но приводит к крашу приложения. В чем тут проблема, почему даже пустая функция крашит все?
>>859712 Например, void zeroFWithRet() { __asm RET } скомпилируется примерно в следующее при выключенных оптимизациях: push rbp mov rbp, rsp ret pop rbp ret
>>859270 Фактически, это то же самое, что и указатель, только константный (если ты сослался единожды на какой-то объект, то уже не можешь сменить место, на которое ты ссылаешься). Естественно, применение ссылок не освобождает от выстрелов в ногу. Ссылка: >> int a = 10; int b = 20; >> int &x = a; // единожды взяв ссылку ты остаешься с ней навеки >> x = b; // записывает в переменную a значение из переменной b То же самое, только в виде указателя: >> int a = 10; int b = 20; >> int const x = &a; >> x = b;
Меня скорее всего пошлют нахуй, но попытать счастья стоит. Можно матрицу заполнить рандомными числами? Чтобы указывать только столбцы, строки и вектор. Пробовал вставлять разные штуки в разные места, компилятор или не работает или работает странно.
Посоветуйте пожалуйста, где можно почитать (ну или посмотреть) на русском о cmake, чтоб понятно и доступно. В ангельский тоже можно само собой, но родной язык приятнее.
На степике есть курс по С++ goo.gl/CxhzOj стоит время тратить или лучше с Стэнли Липпман, Жози Лажойе и Барбара Му Язык программирования C++ вкатиться?
>>860454 На гитхабе проекты смотри, или еще где, там, в принципе, все понятно будет со временем. Непонятная инструкция - в мануал, вот так я разбирался. Если уже в файлы пилить (например, мне надо было qt.conf формировать), то уже в документацию, потому что там, как правило, такое не часто используется. Ну и флаги компилятора надо бы знать.
>>861230 Да у меня и в проектах компании хватает проектов на cmake, понятно, что можно смотреть всё непонятное (95%) в мануале, но можно же и поискать вариант поудобнее вкатиться. Видимо не судьба.
Посоны, а что за указатели такие? Никак не пойму что это такое и зачем нужно. По-братски объясните. Если чё, работаю грузчиком дверей, решил стать программистом.
Няши, не уверен, что мне в этот тред, но всё равно ничего ближе не нашел. Собственно, проблема: изучаю QT и соответственно плюсы неплохо знаю ObjC, но надоело писать по иос. Суть в том, что мне нужно сделать всплывающее окно, но не по нажатию на кнопку, а из кода. В гугле ничего не нашел, все вызывают по кнопке, а как это сделать я и так знаю.
>>862514 Не совсем то, нет. Суть в том, что мне нужно не диалоговое окно, а окно поверх основного, типа QWidget. В него уже надо запихнуть браузер через webView.
В общем реквестирую какой-нибудь не очень большой материал для повторения по С++. Потому как 2 года до этого писал на С++, сейчас пишу на Objective-C(пришлось временно перейти из-за нехватки проектов, а потом на работе С++ отдел развалился) и хочу перейти на другую работу чтобы писать на С++. И каждый раз на собеседованиях сталкваюсь с проблемами связанными с тем что на С++ давно не писал и то не помню как инициализировать char * строки и какая библиотека нужна чтобы использовать функции strcpy и strlen, то не помню как определять шаблоны, то не помню как определять операторы. Нет, начни я кодить - сразу бы загуглил, но вот с ходу вспомнить не всегда могу.
Мне интересно когда создаёшь массивы объектов, методы классов тоже занимают память прямо пропорционально количеству объектов, или создаётся по одному методу на всех?
>>862712 Медоты все в текстовом сегменте лежат. Если виртуальных функций нет, тогда оверхеда не будет, если есть - будет, но только на таблицу переходов.
>>862181 Могу посоветовать не читать книгу из ОП-поста (Уильямса). Говно какое-то. Ни толком кода, ни хотя бы тривиальнейших задач или идей для задач — всё самому придумывать надо; никакого объяснениz о том, зачем вообще то или иное сделано, про промисы даже код не полный и не сказано, что запускать это всё нужно вручную отдельным тредом, да и нахуй они вообще нужны тоже (сначала вообще может показаться как просто лишний код: например, http://en.cppreference.com/w/cpp/thread/future просто future в одну строку, а с промисом мы сначала создаём промис, а потом достаём из него тот же future). Про атомарные типы глава вообще тыковка: лишь спустя 17 страниц описания и использования операций над атомарными типами, принимающими упорядочение доступа к памяти (memory_order_xxx) и активного выделения этого аргумента, что тут принимает то и это, в таком-то случае такие-то виды доступа недоступны, а тут по-дефолту такой, наконец доходит до описания, что это вообще такое. Да и в общем иногда попадаются какие-то громоздкие и корявые предложения (вот прямо как два моих предыдущих), прочитав которые в голове крутится только "что, блядь?" и желание перечитать. Не знаю, проблема ли это автора или перевода (отмажусь сразу: как ленивая мразь просто скачал по ссылке из шапки, а там русик оказался). Впрочем, сравнить мне не с чем, может они все такие.
Вопрос по многопоточности, собственно по книге этого Уильямса.
В разговоре об атомиках и памяти, там есть такой код - http://ideone.com/s9msQ7 И говорится, что при порядке доступа memory_order_relaxed, assertion этот может иногда и выкинуть, потому что нет никакой гарантии, что функция void write_x_then_y(){ x.store(true, memory_order_relaxed); y.store(true, memory_order_relaxed); } запишет сначала x, а потом y, вполне может и наоборот. Заставить свой компилятор так сделать у меня ен получилось, поэтому, собственно, вопрос: А если между записью вставить чтение x'а, то есть x.store(true, memory_order_relaxed); int z = x.load(); y.store(true, memory_order_relaxed); как сделано там же в функции write_x_read_y_write_y, гарантирует ли это запись y после x'а, или и тут assert может не пройтись?
>>862521 Что-то сложно тебя понять. Но если я тебя правильно понял, то тебе надо просто в своём окне сделать QWidget или QFrame, в качестве родителя запихнуть в него это своё главное окно и указать флаг setWindowFlags(Qt::Popup).
Как сделать таймер в C++? То есть ставишь значени в 50 сек и функция исполняется эти 50 сек. Изучал std::chrono, дошло не сразу что это не то. Это не обратные отсчет, а секундомер. То есть он может посчитать промежуток только когда программа отметила конец промежутка, ну и соответственно цикл таким образом не сделаешь.
Чем измерять время из плюсов с точностью до микросекунд? clock_gettime из time.h и CPU'шный таймер дают время вроде до наносекунд, но при этом почему-то время всё равно меняется большими шагами и реальная точность около миллисекунды получается. Или я что-нибудь делаю не так?
Почему такой ебанутый синтаксис? Почему когда я перегружаю оператор "круглые скобки" функцией от 1 аргумента, иногда приходится писать kek(x), а иногда kek()(x)?
Сап, программисты. Есть один вопрос: Имеется декартова система координат и какая-то нарисованная функция на ней. Предположим синус х. Нужно перейти от декартовой системы к эллиптической.
ВТФ? Все рисуется с помощью мувту, лайнту. Имеется формула перехода, но что-то все это запилить в плюсах не получается. Так же в наличии два аргумента posX, posY определяющие соответственно Х и У. Собственно вопрос и заключается в том, как нарисовать элементарный график с переходом в эти координаты
>>840964 (OP) Здарова, петуханы, есть sqlite3 бд, нужен орм под неё, чтоб умел классы генерировать прям по схеме бд из файлика со связями, методами и всякой малафьей. Существует такой? Я нагуглил QxOrm, у него есть QxEntityEditor, который пидор требует лицензии за сотни долларов или там ограничение на 5 таблиц. А мне 200 таблиц нужно, пиздец короче.
Как в Qt Creator сделать так, чтобы таб представлялся в виде таба, а не 4-8 (указанных в настройках) пробелах, я заебался стирать их при необходимости вручную.
Есть убунта и я хочу вкатиться в с++. На чем писать код и чем помпилировать? Слышал про gcc и g++: они нормальные? Скачал вторую из шапки книгу: Стэнли Липпман, Жози Лажойе и Барбара... - она подойдет для новичка, если я собираюсь программировать на линуксе. Могу я из-под прыщей кодить программы для виндоуса?
>>865622 Точно, первый опыт хелоувордов был на в10 с вс, поэтому я не понимаю, как писать в блокноте, чтобы потом в отдельном компиляторе скомпилировать программу.
Создал в дезигнере QVBoxLayout, в который динамично добавляю несколько QHBoxLayout-ов, в которых по две кнопки. Как теперь эти QHBoxLayout-ы удалять? Всегда что-то остается на заднем фоне.
>>865895 К языку там лишь одна претензия, тащемта.
Вообще, вероятно, я просто рано её начал и она не для въезжающих в параллелизм. С другой стороны, там многое прямо вот с нуля и даже мне было лениво читать подробнейшие описания. Как-то под всех сразу попытались, видимо, подстроиться, чтобы читатель сам пропускал то, что сложно/известно/скучно.
>>865967 Там лишь одна глава про это целенаправленно. Но там ведь и про треды всякие тоже с нуля говорится, так что я вообще не знаю, странная книга. Вообще, вроде и понятно всё, лишь практики маловато, как мне кажется. За целую главу (~50 страниц) разбирают пример одного thread-safe стэка и и и всё. Как справочник не поиспользуешь — длинно. За одно прочтение всё это не запомнится, только какие-то отрывки (тоже полезные, разумеется) останутся. А материалов для закрепления и отрабатывания нет. Как-то так, что ли.
>>866406 Статическая инициализируется при запуске программы, ЕМНИП, и, в общем, я не сделал ее нестатической. В объявлении класса разрешается инициализировать (только char, int и им подобные целочисленные типы, в том числе и беззнаковые), но, например double или сложные типы (скажем, std::vector) запрещено.
>>866432 >> В объявлении класса можно инициализировать литеральные типы (LiteralType), но только с constexpr или интегральные без обязательного его применения, естественно начиная с C++11, если стандарт уебищный (то, что вышло до c++11), то придется довольствоваться инициализацией только интегральных типов, как я и написал ранее. Фикс К слову, о плюсах constexpr
Господа, помогите. Пишу в Qt 5.6, использую библиотеку для отображения оффлайн карты https://github.com/raptorswing/MapGraphics Подскажите, как реализовать в ней геолокацию ?
В тумане моря голубом!..
Что ищет он в стране далекой?
Что кинул он в краю родном?...
Играют волны — ветер свищет,
И мачта гнется и скрыпит...
Увы! Он счастия не ищет
И не от счастия бежит!
Под ним струя светлей лазури,
Над ним луч солнца золотой...
А он, мятежный, просит бури,
Как будто в бурях есть покой!
C++
Старший брат:
Предыдущий:
TL;DR
Q: Я хочу тотчас вкатиться, а разбираться буду в процессе. Что я должен делать?
Q: Не уверен, что хочу изучать C++. Как мне пощупать его без лишней ебли?
A: Читаешь эту книжку, смотришь упражнения из нее и суешь в онлайн-компилятор. Сообщения компилятора об ошибках копипастишь в гугл, ответы на возникающие у тебя вопросы ищешь в предыдущих тредах, спрашиваешь в этом треде, если не нашел. Если тебя послали на хуй или не ответили, то ты спросил платину, читай предыдущие треды внимательнее.
Памятка ньюфагу
Небольшие фрагменты кода размещай в треде при помощи тега [code] и жабаскрипт-костыля. Для больших фрагментов используй внешние сервисы.
FAQ
Мотивация
Q: Почему стоит использовать именно C++?
A: Ни один язык не идеален, но по совокупности киллер-фич C++ оставляет все остальные языки позади. Вот основные три:
C++ действительно быстрый язык — вместе с C, его прародителем, они с большим отрывом уделывают по скорости все остальные языки высокого уровня. Код на C++, как правило, медленнее аналогичного кода на C приблизительно на 0-20% а в ряде случаев C++ оказывается даже быстрее, причем замедление появляется только при использовании высокоуровневых конструкций (в C++ ты никогда не платишь за то, чего не используешь). Таким образом, если тебе требуется высокопроизводительный код, C++ станет отличным выбором.
C++, являясь одним из наиболее выразительных и мощных языков, позволяет использовать большинство существующих парадигм. Его философия построена на минимальном ограничении программиста в выборе методов и инструментов
простреливания ногирешения задачи. Как следствие, используя C++, ты можешь не думать о том, как обойти искусственные ограничения языка, а беспрепятственно выбрать наиболее подходящие к ситуации средства.C++ по-настоящему популярен. На нем написаны десятки тысяч приложений и миллиарды строк кода, о нем написаны сотни книг, он до мельчайших подробностей документирован и стандартизован. Используя C++, ты никогда не останешься без работы или поддержки комьюнити.
Q: Но он же давно устарел!
A: Современный C++ весьма далек от языка, которым он был в 1998 году. В настоящее время кресты живее всех живых, их развитие движется семимильными шагами, а новые стандарты принимаются каждые три года, сохраняя при этом полную обратную совместимость с предыдущими. К сожалению, из-за обилия некачественной литературы по С++, в которой игнорируются новые средства языка, бытует мнение о его "несовременности".
Q: Сейчас все пишут на %languagename, а кресты сосут у него!
A: Нужно понимать, что используемый язык должен соответствовать поставленной задаче. Никому не придет в голову писать на C++ скрипты или веб-фронтенд хотя это вполне возможно, но лишь немногие языки могут соперничать с ним по разнообразию решаемых задач.
Q: Хуле тут так сложно? Я открыл учебник, там какой-то ад!
A: Попробуй учебники, изданные после 2011 года, в которых рассматриваются возможности новых стандартов (C++11 и C++14). Эти фичи не только добавили выразительности, но и серьезно упростили жизнь разработчиков. Теперь программировать на C++ стало проще, чем когда-либо! Это не отменяет необходимости прочитать несколько серьезных книжек, чтобы написать на нем что-то годное. Тем не менее, да, C++ это по-настоящему сложный язык. Его никак не получится выучить за 21 день, ну вот совсем никак. Именно высокий порог вхождения повышает твою ценность как специалиста, не позволяя нанять вместо тебя индуса за еду. Более того, крайне нежелательно пытаться изучить его первым, если ты раньше вообще не программировал. С большой вероятностью это приведет к разочарованию и потере времени. Гораздо лучше будет начать с другого языка и базовых вещей алгоритмы, архитектура пека, операционные системы, а уже потом вернуться к крестам.
Литература
Q: Окей, я решил вкатиться. Какие же книги мне читать?
A: Специально для тебя аноны /pr собрали уникальную коллекцию отборной литературы по крестам. Только лучшие книги, последние издания, без хуев! Выбирай категорию и обмазывайся:
Для нюфань
Учебники для начинающих. Все примерно одинаковой годноты, читать имеет смысл только какой-нибудь один, который больше приглянется:
Кроме того, есть еще пара старых добрых учебников для ньюфагов. Часть информации в них устарела, но многие считают, что это компенсируется их большей, по сравнению с современными учебниками, понятностью:
Best practices
Книги про основные подводные камни для тех, кто осилил предыдущий пункт. Следует пролистать все:
Проектирование
Следует пролистать все перед переходом от лаб к написанию настоящего софта.
Последний пункт есть квинтэссенция ГИБКОСТИ, поэтому стоит прочитать его в любом случае, чтобы охуеть от того, как можно делать:
Ахтунг!
Предыдущие два раздела дополняют, а не заменяют классические книги о лучших практиках разработки без привязки к конкретному языку (Макконнелл, Uncle Bob, GoF).
Справочники
Наиболее детальные описания языка. Удобно использовать как референс, читать от корки до корки не обязательно:
Кроме того, на ангельском доступны стандарты C++11, C++14, а также последняя версия черновика стандарта C++17.
Тонкости языка
Книги для тех, кто возлюбил кресты всей душой и желает углубиться в детали:
Отдельные аспекты
Читать по необходимости:
и других фич последних стандартов
для разработки многопоточных приложений
остальным частям стандартной библиотеки
язык программирования, чтобы ты мог
программировать, пока программируешь"
в ужас даже исходники boost::MPL
на C++. Для его чтения не нужно знать
мертвые языки, в отличие от этого вашего Кнута
https://goo.gl/yDuQgG (часть 5)
Другие обучающие материалы
Q: Я не умею читать.
A: Можешь посмотреть какой-нибудь онлайн-курс: раз, два, три
Q: Не люблю, когда льют воду. Хочу коротких материалов по существу.
A: Вот тебе блоги, факи, референсы и всякое такое:
Софт и библиотеки
Q: Я готов начать погроммировать! Куда мне писать код?
A: На этапе написания хэллоуворлдов можно не ебаться с установкой софта, а использовать онлайн-компиляторы: раз, два, три, четыре. Для работы над более серьезными вещами удобнее всего установить какую-нибудь IDE. Ниже приведены несколько хороших вариантов:
https://goo.gl/WIPW9L (ангельская версия)
"sudo aptitude install codelite codelite-plugins"
для установки под *nix
Здесь ты можешь найти все остальные существующие IDE, если ни одна из вышеперечисленных тебе не приглянулась.
Разумеется, установка IDE вовсе не обязательна. Ты можешь использовать текстовый редактор в связке с каким-нибудь компилятором, выбросить мышку, отрастить бороду и примкнуть к Церкви Святого Столлмана. Но лучше тогда сразу отправляйся в тред сишников, если не хочешь быть обоссанным другими сектантами за использование б-гомерзкого C++.
Q: Не буду я все делать сам! Подавайте сюда софт, который все сделает за меня и подотрет мне жопу!
A: Без проблем:
Также не стоит забывать о том, что правильные посоны экономят свое время и нервы, используя мегагодные git и cmake во всех проектах.
Q: Мне надоело писать велосипеды, какие у вас тут популярные либы?
Q: Нужно зделать %монструозная_хуйня_нейм, но я обосрался от одной мысли о написании ее с нуля, что же делать?
A: Гляди сюда:
boost
Бесспорно, это самый популярный набор C++-библиотек. Не будет лукавством сказать, что C++ во многом обязан популярностью именно ему. Воистину всеобъемлющий, boost способен удовлетворить твои самые скотские фантазии. В нем есть практически все - от математических функций до сетевых компонент, от инструментов тестирования до динамических типов. Функции для работы с твоей мамашей там тоже есть. Разумеется, все это швабодное и работает на любых платформах. И да, boost является своеобразным инкубатором хороших библиотек, поэтому наиболее удачные из них с большой вероятностью можно будет увидеть после принятия очередного стандарта уже как часть стандартной библиотеки.
Недостатком boost можно считать его размер - более 300 мегабайт. Большинство компонент boost не являются независимыми, и попытка использовать один единственный контейнер обернется фактическим подключением 2/3 всего присутствующего в комплекте. Таким образом, если boost не будет использоваться на полную, лучше юзать другие, более специализированные библиотеки.
Литература:
Qt
Существует швабодный кроссплатформенный фреймворк-надмножество C++ под названием Qt. Он содержит довольно большое количество компонент (для работы с сетью, базами данных, для юнит-тестирования и др.), но киллер-фичей и основным полем его применения являются возможности по разработке графических интерфейсов. Qt сам по себе, как расширение языка, предоставляет для этого более удобные средства, чем обычные библиотеки, а использование специализированных IDE наподобие Qt Creator позволяет в буквальном смысле собирать интерфейсы мышкой, а код писать только по существу.
Тем не менее, использование Qt нельзя однозначно назвать хорошей практикой. Во многом это уже не C++, а другой язык, со своими концепциями и паттернами. Qt-код требует дополнительного препроцессинга при помощи встроенных в Qt утилит (т.н. метаобъектная компиляция), поэтому не получится просто подключить Qt как обычную библиотеку и использовать свой любимый компилятор без дополнительного софта. Нельзя сказать, что это существенное препятствие, но есть мнение, что использование Qt нарушает дух C++, раздувает машинный код и порождает макак-любителей кодогенерации.
В настоящее время основные версии Qt - 4.8 и 5.х, полной обратной совместимости между ними нет как в пистоне, ага.
Литература:
https://goo.gl/toUDWc (исходники примеров)
https://goo.gl/qpkZFm (книга) +
https://goo.gl/LIIECh (исходники примеров)
Другие хорошие библиотеки
Несколько специализированных библиотек для часто встречающихся задач. Все — маленькие, быстрые и простые в освоении:
И еще куча библиотек на любой вкус.
Q: Я прочитал все вышеперечисленное, теперь я гуру! Что дальше?
A: Дальше переходишь по ссылке, пробуешь отвечать на вопросы и понимаешь, что ты пока в самом начале пути. Кроличья нора крестов практически бездонна, поэтому продолжать постигать тонкости и детали можно очень и очень долго. В то же время, на этом этапе у тебя должно быть достаточно знаний, чтобы уверенно писать неплохой код. Поэтому читай исходники открытого софта и библиотек, отправляй пулл-реквесты в них, читай книжки по предметным областям и общим методикам разработки, а дальше уже сможешь запилить свой проект или вкатиться в существующий.
Предыдущие треды на архиваче
Старые ненумерованные треды
Отдельные Qt-треды