24 декабря Архивач восстановлен после серьёзной аварии. К сожалению, значительная часть сохранённых изображений и видео была потеряна. Подробности случившегося. Мы призываем всех неравнодушных помочь нам с восстановлением утраченного контента!
Над тредом вновь алеют яркие
Пердаков огни.
Баттхёрты сочные, сладкие
От студентов, которые дни
Проводят в смятенье, клепая всё свой говнокод
От ярости сотрясая
Самый небесный свод
Ругая Страусов трупы
И комитетский сброд
Но знай - их ошибки не вечны
Декреты сменяют устав
И код, считавшийся вечным
Забудется, легаси став
Не верь разработчику юному
Он глуп, как и нужно скоту
Ведь опытный комитетчик
Чует его за версту
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:
Дальше переходишь по ссылке, пробуешь отвечать на вопросы и понимаешь, что ты пока в самом начале пути. Кроличья нора крестов практически бездонна, поэтому продолжать постигать тонкости и детали можно очень и очень долго. В то же время, на этом этапе у тебя должно быть достаточно знаний, чтобы уверенно писать неплохой код. Поэтому читай исходники открытого софта и библиотек, отправляй пулл-реквесты в них, читай книжки по предметным областям и общим методикам разработки, а дальше уже сможешь запилить свой проект или вкатиться в существующий.
Есть один йоба проект, изначально был реализован на сишечке, был шустр прост и охуенен, потом его переписали на плюсы, стало огромадное неповоротливое и непонятное уебище. Вопрос, нахуя?
Над тредом вновь алеют яркие Пердаков огни. Баттхёрты сочные, сладкие От студентов, которые дни Проводят в смятенье, клепая всё свой говнокод От ярости сотрясая Самый небесный свод Ругая Страусов трупы И комитетский сброд
Но знай - их ошибки не вечны Декреты сменяют устав И код, считавшийся вечным Забудется, легаси став Не верь разработчику юному Он глуп, как и нужно скоту Ведь опытный комитетчик Чует его за версту
У тебя имя функции конфликтует с std::plus, ибо нехуй делать using namespace std;
prog.cpp:3:5: note: candidates are: template<class T> int plus(T&, T&) int plus(T &a,T &b); ^ In file included from /usr/include/c++/5/string:48:0, from /usr/include/c++/5/bits/locale_classes.h:40, from /usr/include/c++/5/bits/ios_base.h:41, from /usr/include/c++/5/ios:42, from /usr/include/c++/5/ostream:38, from /usr/include/c++/5/iostream:39, from prog.cpp:1: /usr/include/c++/5/bits/stl_function.h:147:12: note: template<class _Tp> struct std::plus struct plus;
Вопрос скорее по си, но не хочу в тот тред идти. Нужен массив структур размер которого не известен на этапе компиляции. В этой структуре будет 1 char и 1 int. Массив до 10к элементов. Как лучше сделать? 1 массив структур или 2 массива 1 char'ов и 1 int'ов? Если делать структуру, то наверно поля выравнивать надо будет. А если делать 2 массива, то 2 раза маллок вызывать надо. Надо чтобы работало как можно быстрее. И не тратиться на лишнюю память.
main.o: In function `main': main.cpp:(.text.startup+0x41): undefined reference to `Progress::Progress(QWidget*)' main.cpp:(.text.startup+0x55): undefined reference to `vtable for Progress' main.cpp:(.text.startup+0xa8): undefined reference to `vtable for Progress'
Там в прошлом вроде треде один анончик писал, что нашел новые годные книги по крестам и попытается впилить их в шапку. Только ради них зашел, а тут нихуя.
Откуда появилось это число 158208768 в выводе? У меня под виндой таких чисел вообще много вываливается. Причем для массива размером до 40 сортировка работает правильно, но потом где-то портится память.
>>822047 >У беззнаковых — за максимальным значением должен идти нуль. А почему у остальных не так? >Переполнение вектора, что ли? Ага. Или строки. Что будет если их сделать слишком большими?
Допустим, муж был великан высотой 35м, а жена обычный женщина ростом метр писяд. Вопрос возник, как совокупить супругов, чтобы родились дети, великанончики или обычные пиздюки. Так значит великан раздевает жену, и смотря на ее обнаженную благоухающую вагину через увеличительный прибор, усердно дрочит и кончает в великаний стакан емкостью пять кубов чистейшей великаней спермы. Так потом жена просто нвряет с раздвинутой пиздой в этот наполненный стакан и усердно втягивает пиздой живительную сперму в простонаричии просто малофея. Через 9 месяцев родятся здоровые дети. Ну а сто делать если жена великанша, а родитель прост Иван Кузькин обыкновенный? Раньше делалось так, муж строгал спермы в бочонок, пока он не наполнится и великанша сливала этот бочонок спермы себе в вагину, загоняя потом все это дело великанским дилдо, зрелище то еще. Но сегодня технологии пошли далеко вперед, мужик облачается в водолазный костюм с кислородной маской и ныяряет жене в пизду, где достигает почти матки и кончает там тугой горячей струей живительной спермы. Дело на этом зделоно, родятся дети. Тут ничего не обычного нет, днк великанов и людей совпадает на 99%, это природой так задумано.
>>822068 >А почему у остальных не так? Фактически оно так, но на некоторых платформах аппаратно контролируется знак, поэтому какие-то требования бы вызвали костыли и неоптимальность в реализациях. >Ага. Или строки. Что будет если их сделать слишком большими? Если считать "большим" заполнение всей доступной кучи, то со стандартным аллокатором гарантируется исключение std::bad_alloc (как и для обычного new), а с пользовательским - зависит от того, как он реализован. Другого переполнения тут быть не может по определению - тип индекса (обычно size_t) гарантируется таким, что в него влезет любое количество потенциально влезающих в память объектов. Скажем, если у тебя на x86 4ГБ памяти, то даже если ты всю память потратишь на единственный вектор байтов, то в 32-битный unsigned int индекс все равно влезет, и нехватка памяти наступит раньше переполнения.
>>821402 (OP) Здравствуйте уважаемые сеньоры разработчики! Очень нужен ваш совет по плюсам. Есть ли в них что-то похожие на динамическую типизацию, вернее даже не типизацию а какой-то костыль, который бы позволял создавать определенные коллекции с определенным типом.
>>822206 > какой-то костыль, который бы позволял создавать определенные коллекции с определенным типом К чему тут вообще динамическая типизация? Любой стандартный контейнер для такого подойдёт
Или тебе надо нечто на подобии ArrayList из java или с#? Из твоего кода нихера не понял
>>822206 Через шаблоны как раз можно, но этот тип надо явно указывать аргументом шаблона. Типа template <typename T> T getRandom (int size) ... и потом auto my_vector = help.getRandom <vector <int>> (50).
Если хочешь, чтобы тип передавался именно параметром, в рантайме, то можно юзать std::any в качестве возвращаемого типа, а параметром передавать строку/enum/еще какой-нибудь идентификатор. Но тогда энивей внутри придется вручную писать switch по каждому из возможных типов.
>>822284 >явно указывать тип аргументом шаблона >...help.getRandom <vector <int>> (50) > не получается «Лучезарному колесу в золотых мехах, носителю грозной стрелы, слуге под самым седалищем Великого и могучего Утеса, сверкающего боя, с ногой на небе, живущего, пока не исчезнут машины, к ступне повергает это донесение ничтожный стражник из рода вихрей, носитель отличного меча. Доношу первое: большая машина «воин-купол» пришла в движение от пальца в отверстии пятом и от пальца в отверстии сорок седьмом, и движение было неодолимое, быстрое и прямое. Доношу второе: явились на небывалой машине трое, не знающие речи, не носящие оружия, не понимающие установления и желающие странного. Не зная их сущности, пребываю в ожидании высоких приказаний. Доношу третье: уголь кончается, а топить мертвецами по вашему милостивому слову мы за невежеством и недоумием не умеем. При сем прилагаю: первое – чертеж большой машины «воин-купол» и второе – образцы материи, приклеенные неизвестными людьми к ранам преступников».
>>822284 Что это вообще за дичь? Твой метод возвращает std::vector<int>, а не T. Даже если ты сделаешь как предлагает >>822308, то у тебя код даже не скомпилируется.
Решил попробовать себя в программировании. Выбрал c++. Почему он считается одним из самых сложный языков программирования? Если мне не хватает мозгов я его не смогу осилить?
>>822470 > Почему он считается одним из самых сложный языков программирования? Потому что иногда сам язык пытается тебя запутать. inb4: как пример, который любят всем пихать — static имеет три совершенно разных смысла в разных местах проги.
Объясните нубу, почему я должен начать изучать данный язык, когда напоявлялись всякие питоны, которые вроде как намного удобнее и красивее? В чем будет профит? Тот факт, что куча народу уже кодит на с++ - для меня не аргумент.
>>822673 > почему я должен начать изучать данный язык Для меня, после паскаля и VB6 это была красота. (Нет, я смотрел питончик — он не красивый, у него [{};] нет) Потом уже понял, что я статикоскоростьфаг. Хочу статическую линковку и охуенную скорость. (И преждевременные оптимизации, тысячи их!)
>>822724 Нет. С другими языками есть огромная толпа спецов которыми тебя заменят. На крестах спецы дороже стоят. Ещё дороже только лисп или другие полумёртвые и некому неизвестные
>>821402 (OP) Что происходит, при передаче указателя на массив по значению? Он указывает на новый локальный массив? Откуда тогда функции известна его длинна?
Я си только учу, но вроде указатель передается только by reference, в этом и смысл. А массив вообще by default передается by reference, но может в плюсах не так.
>>822790 >передаче указателя на массив по значению Ты не за что не догадаешься. Массив остаётся на месте, а указатель передаётся в функция и там используется.
>>822839 Если глобальная переменная, загрузчиком виндовым вроде декларирована инициализация нулями, в никсах не знаю. Если переменная локальная, то прочитается рандомный мусор со стека, который там остался от вызова других функций, компайлерских прологов или подобной хуйни. На самом деле, в "ячейках" не всегда что-то записано. Попробуй привести к указателю рандомное число и прочитать и прочитать значение, разыменовав его. Скорее всего, подходящей страницы виртуальной памяти не окажется, и вылетит исключение.
>>822839 > Как работает оперативка компа что всегда в ячейках что-то записано? Для этого есть специальные механизмы в материнской плате. Если бы не они, то чипы с оперативкой исчезали бы из системного блока при освобождении и памяти и появлялись по мере её заполнения. Это очень сложная магия. Зачем она тебе?
Упражнене из книги Прата (код из книги) - https://ideone.com/zIMtHP Ругается на >char fab[20]; >Frabjous(const char •s = "C++") : fab(s) {}
Два вопроса: 1. Как это исправить-то, чтобы через initialization list, а не strcpy в теле? Ну и не fab{s[0], s[1], s[2], s[3]}, разумеется. 2. А почему оно вообще не работет-то? >char x[10]("string") Нормально, а вот >const char • s = "string" >char x[10](s) не хочет. Но ведь это практически одно и тоже, разве нет?
>>822992 погодите, так это говно ещё и в одном треде работает? больше 100 строк на однотредовый блокирующийся сервер? лооол представляю какой там будет срачельничек с локами, мьютексами или колбеками с стиле говняшная + pthreads, если надо будет сделать мультитредовый сервак
>>823019 Нет конечно, даже самые высокоуровенные библиотеки вроде CAF пародирующие эрланг заставляют писать те же сто строчек на то, что в эрланге делается буквально в 5.
>>823019 Очевидный asio, его вроде даже собирались в 17 включать, но под конец прокинули через хуй, может в 23 завезут нет. Впрочем, он давно умеет в standalone без сотен мегабайт буста и элементарно подключается в проект.
>>822952 >1. Как это исправить-то, чтобы через initialization list, а не strcpy в теле? Ну и не fab{s[0], s[1], s[2], s[3]}, разумеется. Сделать string >2. А почему оно вообще не работет-то? Размер массива ограничен, а в s может хранится слишком большая строка.
Вечер в хату. Возникла такая вот проблема: необходимо написать кучу бесполезного и однообразного кода(типа самопальной либы для матриц, векторов итп) и все бы ничего(обошелся бы просто встроенными в vc/clion средствами для генерации заголовков методов), но есть такая хрень что необхожимо даже для функций короче пиструна хомяка писать ~4 стоки комментариев до и 1 после. В общем, реквестирую способов не втыкать вручную тысячи говн.
>>823456 Ну так Энтони уже все сказал, с тех пор добавились разве что параллельные версии алгоритмов из серьезного, но это тема на пару страниц, не на книгу. Дальше только читать исходники либ, или какие-нибудь книжки по обобщенной параллельности. Материалы с Highload++ попробуй, например.
Двач, где мне прочитать о вызовах функции в C++ с точки зрения машины? Т.е. я хочу узнать, как работает память, и т. д., чтобы прояснить для себя некоторые моменты, в частности, move-semantics, и т. д. Хочу узнать как и где работает память в пеке, как функции в С++ реализуются с точки зрения памяти, передача аргументов, возврат, и т. д.
>>823749 >я хочу узнать, как работает память, и т. д., чтобы прояснить для себя некоторые моменты, в частности, move-semantics Никакого отношения к тому, как работает память, move-semantics не имеет. Т.е. я имею в виду, что вызов move constructor-а ничем не выделяется.
>>823749 >где мне прочитать о вызовах функции в C++ с точки зрения машины https://en.wikipedia.org/wiki/X86_calling_conventions >move-semantics Move-semantics к работе памяти не имеет отношения. Это чисто фишка системы типов: в каком контексте вызывается &&, а в каком &.
>>823768 Да я понял, спасибо. Я это к тому написал, что начал читать 4th edition, и тупил вообще. Вроде сейчас разобрался, что и как, т.е. если я определяю функцию например:
MyType Sup2ch(MyType);
то в main, где я вызову эту функцию отработает два конструктора копирования для передачи переменной в функцию, и при передаче результата обратно.
>>823769 Спасибо, я потихоньку начну читать вики на эту тему, а вообще, где нормально и четко можно глянуть инфу о памяти? А то везде в книжках пишут типо этого: "Ну есть стек в main, есть область глобальной памяти, есть куча." Мне кажется, что эта инфа подходит только для очень поверхностного ознакомления.
>>823781 Спасибо, я, еблан, даже слов для поисковика бы не подобрал. По-русски писал чет, там блядь одно говно за динамические массивы в стиле лабы первокурсника.
>>823788 Шланг - это clang, компилятор. Делаешь что-то типа clang -S test_file.cpp и на выходе волучешь .s файл с ассемблерным листингом. Хотя я начинаю сомневаться что ты в нём хоть что-то разберёшь.
>>823793 спасибоу меня gcc стоит, ну поставлю, разберусь,
>In practical words, when we run any C-program, its executable image is loaded into RAM of computer in an organized manner
Поправьте меня, пожалуйста, если не прав, если не трудно поясните:
Запуская программу, начинает как-то работать машинный код (как?) (ну или код более низкоуровнего яп типо ассеблера?), в ходе исполнения инструкций программа имеет доступ к памяти (которая оперативка, RAM), и в статьях рисуночки сверху вниз идет стек, куча, бсс и прочее - сверху это означает лево по оси адрессов, т.е. возле нулевого (или первого доступного реализацией) лежит стек, потом начиная например с 0xAA лежит куча, и так далее.
Есть ли что о новых фичах языка начиная с 10 года? На работе лютый легаси, и как-то не используем ничего свежего. Ну и в итоге я не следя за новостями уже и не ориентируюсь в том что там надобавляли/собираются добавить.
Есть что почитать об этом сжато? Я не прошу Страуструппа всего читать.
Как получить указатель на объект ofstream? Хочу читать из файла, который открываю как std::ofstream file("text_file.txt", std::ios_base::in); и вот как бы мне получить указатель, чтобы скормить его feof()?
>>821402 (OP) Всегда проигрывал с крестоманек, понавыдумавыли себе ненужных и тормозных абстракций и ебут друг друга в жопы. Разве на плюсах удастся написать этот код: https://github.com/DmitryHetman/ttytanks лаконичнее для человека или для машины? Бред же, плюсы придумали для манек неспособных осилить статическую типизацию, хацкель придумали совсем для аутистов. А Сишечка для людей. Prove me wrong.
>>824335 >Кококок А что ты предлагаешь вместо этого говнокода писать? Оно работает, пока этого достаточно. Говнокод в render.c, core.c. Если есть советы то советуй, а говнокодом можно любой код прозвать. Windows - легаси-говнопараша; Xorg - легаси-говнопараша. >>824352 Ослиливай clang уже.
>>824314 Куда-то уехала индентация. Переменные прямо в хедерах - автор не понимает, что это такое. >#define ME_TANK 0 Даже в сишечке нужно использовать константы вместо препроцессора. Все назначение этой переменной - это быть вместо указателя tank* me, потому что автор в указатели не может. >lightsources sources Автор не понимает, зачем нужна система контроля версий.
In this particular case, if you forgot to delete a copy or move operation, no harm is done. A move operation is not implicitly generated for a class where the user has explicitly declared a destructor. Furthermore, the generation of copy operations is deprecated in this case (§44.2.3). This can be a good reason to explicitly define a destructor even where the compiler would have implicitly provided one (§17.2.3).
>Furthermore, the generation of copy operations is deprecated in this case (§44.2.3).
Получается, если я явно опишу деструктор в классе, неявно не будут генерировать ни конструктор копирования, ни конструктор перемещения (copy & move constructors)?
>>824658 я не могу, перевод я посмотрел, но я вручную создал класс, не объявляя из методов ничего, кроме деструктора, и все же я смог использовать неявно сгенерированный копи-конструктор. Так почему страуструп говорит о том, что написано здесь >>824518 ? Объясни, пожалуйста.
>>824307 Так иногда делают, чтобы запретить создавать объекты этого типа на стеке. Аналогично, operator new удаляют, чтобы запретить создание в куче. Но вообще это костыль, тому що при размещении в куче тоже, вообще говоря, нужен деструктор. Более православное решение - сделать его приватным, тогда operator delete не обосрется, а удалять напрямую не получится.
>>824726 Насколько я понимаю, его юзают только когда под суперкомпьютеры пишут код для параллельных вычислений. В обычных задачах можно прикрутить OpenCL/CUDA и получить гораздо больший относительный прирост, плюс останутся модерновые фичи, которых пока нет у Intel.
Допустим, итераторы first и last задают диапазон элементов. Как проще всего присвоить первым k элементам в этом диапазоне некоторое значение, а оставшимся size - k элементам - другое значение, если k - целое число?
>>824708 deprecated значит, что поведение или функция объявлены устаревшими Они ещё есть, но в следующей мажорной версии стандарта функция будет удалена, а поведение — изменено.
Я к вам с глупым вопрос. А в чём такая проблема сделать чтение исходников в два прохода, собирая все объявления в первом (выдёргивая только сигнатуры из definition'ов (какой термин по-русски, кстати, правильный?)), и избавиться от необходимости иметь декларации выше использования и прочий геморрой, возникающий при перекрёстном использовании каких-либо функций/методов, необходимости forward declaration'оа класса и т.д. Неужели это настолько ресурсоёмко?
>>825051 >Неужели это настолько ресурсоёмко? Это ебанутое наследие сишки. Причем оставлено только на глобальном уровне. Внутри класса, например, методы можно в произвольном порядке объявлять. Так же как и делать вложенные функции, объявляя локальный класс внутри функции.
У меня есть класс(A) в нем указатель на абстрактный класс(B), в котором могут храниться объекты разных типов, как написать конструктор копирования(для А), если я не знаю, какого типа объект мне нужно выделить?
>>825101 >как написать конструктор копирования(для А) Добавь virtual A clone() = 0 в интерфейс абстрактного класса, пусть наследники сами разруливают, как им копироваться.
>>825051 Дело не в однопроходности же, это тебе не паскаль. Грамматика все равно неразрешима, и в общем случае, с шаблонами шаблонов там такая дрочильня, что даже с ручкой и бумагой без поллитры не разберешься. Если убрать декларации, скорость компиляции нихуя не увеличится, но появятся новые проблемы. Например, неочевидно, что делать с вызовами перегруженных функций, когда нельзя предсказать декларацию по вызову, и все зависит только от порядка опережающих деклараций. >>825092 Даже без легаси пришлось бы делать что-то подобное, я думаю. Класс это нечто целостное, там без такого можно обойтись. А единица трансляции может состоять из хэдеров от разных авторов, и не всегда можно выбрать "единственный правильный для всего файла" набор перегрузок. Жизненный пример: ты хочешь специализировать шаблонную функцию из STL (это разрешено и применяется, например, для std::hash с нестандартными типами), но в самом хэдере она уже используется. Если поместить обе декларации (твою и шаблонную) в начало файла, то код хэдера может заюзать твою версию, чего никто не ждал. А так - пока идет хэдер, юзается стандартная, а дальше уже ты делаешь что хочешь.
Какая сложность у вычисления разности итераторов? Я использую разность вместо вызова std::distance, который в общем случае работает за O(n), но для вектора, вроде бы, за O(1). Можно ли тут уменьшить констату в сложности сортировки?
>>825160 Для BidirectionalIterator гарантируется линейная сложность, как для distance, так и для разности. distance вообще нужно только для однородности кода, из-за того, что для однонаправленных разность недоступна.
За оптимизации сложно сказать. Формально было бы быстрее пихать единицы через emplace_back прямо в том же цикле, но фактически fill_n может использовать memset, который существенно быстрее. Можно параллелизовать fill_n, начиная с нового стандарта. Ну и возможности по байтоебству тут неисчерпаемые, от битовых полей вместр вектора до SIMD-инструкций, которые за пару тактов весь твой вектор свернут в бараний рог.
У меня есть одна идея, приложение для морфа звука: 1. Идет постоянное считывание звука с одного из аудиоустойств 2. Этот звукобрабатывается морфером по определенному принципу 3. Создается новое аудиоустройство, которое воспроизводит полученный звук. 4. Само устройство ”подключается” только при запуске приложения. Если кто-то подсказал бы что почитать по какому-либо пункту, я был бы крайне признателен, спасибо. Проблемными кажутся только последние 2.
>>825149 >Если поместить обе декларации (твою и шаблонную) в начало файла, то код хэдера может заюзать твою версию, чего никто не ждал. А так - пока идет хэдер, юзается стандартная, а дальше уже ты делаешь что хочешь. Так если при одновременном объявлении твоего и стандартного появляется неясность, то почему эта неясность не появляется уже в твоём коде? То есть, допустим, в хедере выполнилась стандартная, потом ты заспециализировал свой темплейт и использовать функцию. Откуда сейчас компилятору знать, что использовать? В чём разница-то? То есть, если твоя функция вызывает неясность, то не так важно уже, когда она появится, компилятор всё равно должен ругаться, разве нет? Я, вероятно, не до конца понял описываемую ситуацию.
>>825248 >Ну и возможности по байтоебству тут неисчерпаемые, от битовых полей вместр вектора до SIMD-инструкций, которые за пару тактов весь твой вектор свернут в бараний рог. Можешь привести пример, как здесь применить SIMD-инструкции? Я ньюфаг в SIMD.
В use_factory создается shared_ptr на число, при этом счетчик ссылок на это число увеличивается. Указатель возвращается из функции, счетчик увеличивается еще раз, но уменьшается на 1 после выхода из функции use_factory. Указатель на число не сохраняется в функции main. Сколько будет ссылок на число и почему? В каком разделе стандарта об этом читать?
Привет, я Кирилл, делаю 3д игру на плюсах для себя и из-за недостатка умений чувствую себя крайне неуютно. Я разбираюсь понемногу, вроде горячих вопросов у меня нет. Но я хотел бы увидеть какие-нибудь примеры или коммьюнити тех, кто пишет подобное. Туториалы, гайды и лекции обычно или слишком общие расчитано на разработчиков другого софта с большим опытом или слишком специфичные одна фича, которую не очень понятно как аккуратно соединить с остальными. Так вот, может у вас завалялись ссылки на исходники проектов 3d игр, созданных новичками. Лучше небольшие, грубые, недоделанные, незапускающиеся, третий год в разработке и так далее, если вы понимаете о чем я. Хотя бы просто чтобы посмотреть как другие делают. Я пытался вникнуть в коды квейк/дум, но там во-первых си, во-вторых столько оптимизации и макросов, что без гида не разобраться как это все вообще работает.
Кто шарит, скажите, имеет ли смысл задавать выравнивание функторам? т.е если у нас такой функтор struct Fun { void operator()(...) { ... } };
По-умолчанию у него размер 1 байт. Если добавить __attribute__((__aligned__(8))) то у него получается размер уже 8 байт. Имеет ли это вообще смысл по части увеличения производительности и улучшения кеширования?
Антуаны, решил начать изучать С++ (будем считать, что с нуля), но есть небольшая проблема: - я на вахту уезжаю на месяц, тырнетов там нет и есть только некронетбук. Есть ли какие-нибудь IDE, которые смогут поставиться на хрюшку 32 разрядную? В гугле забанен.
>>826246 Тебе не приходило в голову, что я параллельно читаю несколько книг, но на код все равно хочется посмотреть? >>826286 Пробовал сам коду ид разобраться? К тому же у них не плюсы, а чисто си.
>>826430 Я к тому, что человек вроде с языком хочет ознакомиться, а не с анальными методами прыщесборки. И авто дополнение с дебагером тут в тему будут, а нотепад можешь в жопу запихать.
например я ее вызываю с аргументами по умолчанию: my_function(v.begin(), v.end(), arr.begin());
все хорошо, но когда я хочу специлизировать параметр шаблона Foo, возникают проблемы - я не могу написать так: my_function<MyFoo>(v.begin(), v.end(), arr.begin()); потому что первыми в шаблоне идет итераторы, но я не хочу писать специализацию к итераторам для того чтобы зада Foo и я не могу поставить типа итераторов после Foo потому что дефолтная спецификация зависит от них.
>>826728 Насколько я понял, тебе надо, чтобы одни аргументы шаблона выводились, а другие - нет? Напрямую так не сделать - если уж ты пишешь в вызове <...>, то вывод полностью отключается, и рассчитывать можно только на дефолтные параметры.
Для решения твоей задачи можно сделать так: template<typename InputIterator, typename OutputIterator typename Foo> void my_function(InputIterator first, ..., OutputIterator out, Foo fun = Foo()) { ... } template <typename Foo> struct MyFunctionManager { template <...> void operator () (...) {return ::my_function <...> (...);}; //инлайновая обертка с идентичной сигнатурой, которая вызывает основную глобальную функцию }; my_function(v.begin(), v.end(), arr.begin()); //в таких вызовах аргументы шаблона выводятся, поэтому дефолтные параметры вообще не нужны MyGunctionManager <MyFoo> () (v.begin(), v.end(), arr.begin()); //а здесь получается "шаблон в шаблоне" ценой всего лишь в две лишние скобки - по производительности деградации не будет
>>826785 Если бы у тебя был шаблон класса, а не функции, то все бы решалось еще проще - просто через alias template, вложенный в шаблон с единственным параметром. Писалось бы TvoyaMamka <MyFoo>::my_function (...) без всяких дополнительных оберток. Поэтому если есть выбор, лучше всегда сделать шаблон класса и работать уже с его методами. Тогда можно делать частичную специализацию, синонимы и много другой полезной хуеты, которую нельзя с функциями.
Ананасы. У меня вопрос не касательно языка, но всё же около него. Мне нравится Qt creator (исключительно как IDE, то есть фреймворком Qt я не занимаюсь), но мне не ясна их политика лицензий. Я так понимаю их лицензии касаются ПО в котором есть какие-то компоненты фреймворка Qt?
>>827296 Вроде да, у Qt Creator, по идее, должна быть отдельная лицензия. Если в ней не говорится о "только некоммерческом использовании", то можешь писать код без использования фреймворка, и все будет легально.
Делаю N-Body симулятор под ЦПУ и ГПУ AMP не могу найти литературу по этой части, интересует как можно упростить расчеты, разбиение на ячейки и пр. Как N-body вообще переводится на русский язык? http://pastebin.com/kgAdLp1p
Почему, когда я хочу передать этот массив в функцию, не важна первая размерность 5?
void VoidFunc(int arr[][10]);
Я понимаю, что запись int x[5][10] означает, что x - массив, состоящий из 510 элементов и занимающий 510sizeof(int) места. Но я никак не могу этого понять, не могу провести аналогию с простым массивом y[20] - например, мы передаем вообще указатель int, без указания вообще размеров этого массива. Но как это работает это с многомерными массивами?
>>827975 Это просто разная форма описания куска памяти. Доступ y[6] превращается в y + 6, в другом случае y[6][3] превращается в y + 6*x + 3 где x одна из размерностей массива. Если x неизвестно, то хуй пойми как выполнять доступ к элементам этого массива по двум индексам. Поэтому в данном случае одну размерность при передаче в метод и надо указывать. По моему, как-то так. Для трехмерного массива наверняка надо две размерности указывать. Хотя я могу и наврать.
>>827988 Немного не понял вот здесь: >y[6][3] превращается в y + 6x + 3 x - это размерность вторая, типо например y есть y[10][15], тогда y[6][3] y + 615 + 3. Так. Тогда, если мы не передадим 15, действительно, неизвестно куда стукаться? Спасибо, анон, ты действительно мне помог, спасибо большое!
>>827961 >Но как это работает это с многомерными массивами? Никакого отличия от одномерных. Когда у тебя массив T[D], то он передаётся как указатель на T. Т.е. int[10] передаётся как указатель на int. В случае с т.н. многомерным массивом тип T это массив размерностью на единицу меньше. Т.е. для int[5][10] тип T это int[10]. Вот он и передаётся как указатель на int[10]
>>828058 >тогда твой ответ неверный Он верный, просто ты нихуя не понимаешь, как распадается многомерный массив до указателя. До указателя на ЧТО он распадается. См. мой следущий мессадж.
>>828058 Если тебе так трудно выучить правила чтения определения типа в C/C++, возьми и посмотри, во что std::decay превратит твой int[5][2]
И потом хорошо подумай, почему это верно. Почему это согласуется и с layout-ом массивов в памяти, и с арифметикой указателей, и с правилом array-to-pointer decay. И как правильно читать определение типа многомерного массива.
>>828042 Ты можешь сказать, КАК распадается массив до указателя. Ты написал вот что: >Потому что массивы decay до указателей при передаче в функцию.
Я же в посте, указал, что с одномерными все понятно, но как быть с многомерными? Ты оставил это без ответа.
Я же припизднул что твой ответ неверный, просто это вообще не ответ. По существу будет что-то а, именно, про многомерные массивы? Никоим образом не хотел тебя оскорблять.
>>828105 >Все работает как сказал чувак в >>828045 посте? Кагбэ "чувак" это и есть я. Я же написал, читай мой следующий мессадж. Следующий за тем, на который ты ответил.
>>828110 Еще раз хочу акцентировать внимание, если тебе показалось что я хочу тебя задеть - это не так. Спасибо, реально спасибо, что тратишь на меня время.
Блядь, пиздец, ало че за хуйня вот тут в первой ссылке? >>828116
Это каким хуем там 5? И вообще это законно? Как это работает? Почему темплейт схавал [5][2] как просто [5]? Это как вообще? Что почитать, чтобы перестать быть такой необразованной мразью?
>>828202 Сори, бля я тупой пиздец. Получается, если x[5][2] - это array 5 of array 2 of int, то в аналогии, что array N of int преобразуется при передаче в функцию как int, то x[5][2] преобразуется как int x[2] ? Это правильно? Можно еще вопрос? Где это говно, прочитать из нормальных источников?
Расскажи еще о себе? Как стал таким пиздатым?в плюсах
>>828219 Получается, преобразуется в массив указателей на 2 aka int (x)[2] а не указатель на массив из двух int x[2]? Почему так? Где почитать мануал об этом?
>>825912 Слоуответ. Ну, самое простое это прямо с вектором байтов (без битовых полей, чтобы на каждое число было по байту). Вот тут https://software.intel.com/sites/landingpage/IntrinsicsGuide/, например, референсы для Intel, при помощи функций с ...add... в имени можно сделать, чтобы, скажем, 16 байтов сложились в один при помощи единственной векторной инструкции. Соответственно, производительность может вырасти на порядок.
>>828227 >Получается, преобразуется в Наоборот. Но для надёжности напиши на past ebin-t >>828230 > как преобразуются типы при передачу в функции? ARRAY TO POINTER DECAY, сколько раз можно писать.
Хотелось бы обратить ваше внимание, что макаба написана на C++. Впрочем, не только макаба, но и вообще все сервисы, такие как капча, мобильное апи и т.д. Любите C++, ребятки. И когда php блядь кодер вылезет кукарекнуть сказать что-нибудь про свой любимый язык, просто напомните ему его место.
(Автор этого поста был предупрежден.)
>>828297 > Хотелось бы обратить ваше внимание, что макаба написана на C++ Может быть стоит как-то помочь родной макабе если есть какие-то интересные задумки, м?
>>828297 Вот так детки, выглядит эталонная вниманиеблядь, вахтер и утенок в одном флаконе. Сути поста 0, зато плашечкой посветил. Можешь банить, лолка, мне похуй
>>828297 >Хотелось бы обратить ваше внимание, что макаба написана на C++ Оно и видно, кек. Твой пост звучит как "Иван Залупин окончил только колледж и создал Одноклассники.ру". perl-monk
>>828349 >9 лет с нуль.чика кун Представь ситуацию. Господа в смокингах и цилиндрах сидят в обедне и пьют чай, обсуждая катаморфизмы, анаморфизмы, параморфизмы наконец. Тут к ним вползает пьяный вдрызг кучер Ванька. Отплевывая лошадиный навоз, он ссыт под себя, одновременно блюя на пол прокисшим борщом. Затем достает задроченный томик Александреску, найденный на помойке. "Modern C++ Design - вот где мыслЯ, блеать, вот где красота и свежесть!". Смеясь, господа растегивают ширинки и мочатся быдлу в рот. Зовут дворника Ваську - местного лисп-задрота, он спускает крестохолопа с лестницы. Он делает это с удовольствием - хоть зачем-то сгодился элите. Поднимаясь за похвалой, он начинает зациклено бормотать про жидов. Господа для острастки ссут на него, после чего возвращаются к своим светским беседам.
Пусть у меня в классе описаны деструктор, конструктор по умолчанию MyClassInt(int x=0), конструктор копирования, operator= копирующий, конструктор перемещения, operator= перемещения. Пусть еще описан метод friend MyClassInt operator+(const MyClassInt&, const MyClassInt&). Рассмотрим следующий код
MyClassInt x{5}; MyClassInt y{1}; MyClassInt z = (x+y);
Я во всех описаниях сделал принты, соответственно я увидел, что тут сработают три дефолтных коструктора, хотя я ожидал увидеть: два вызова дефолтных, + еще один вызов дефолтного (для результата оп+) и мув коструктор. Что за хуйня? Почему так? Где прочитать как и когда вызываются конструкторы, четкие правила, когда и как вызываются конструкторы?
>>828612 Это что, платиновый пост? Уже в каждом втором треде всплывает вопрос про copy elision. Неужели так сложно открыть стандарт и прочитать пункт 12.8/31?
>>828634 В рамках описанной стандартом C++-машины каждый собственный (не являющийся объектом базового класса) объект занимает не менее одного байта в memory storage. Таким образом, у твоего функтора внутри цикла будет выделена память (и он будет иметь адрес).
Стандарт не оперирует для автоматических (стековых) объектов понятием "выделение памяти", можно говорить только о времени жизни объекта. С точки зрения времени жизни, в каждой итерации цикла объект будет новым (т.е., например, использовать объект предыдущей итерации по указателю - undefined behavior). С точки зрения конструкторов/деструкторов - при их наличии они обязаны вызваться заново в каждой итерации, но у тебя они дефолтные, без какого-либо эффекта, поэтому это несущественно.
Но это в рамках формальной модели. Для реализаций же стандарт имеет as if rule. Оно разрешает реализации делать все что угодно, если наблюдаемое поведение (грубо говоря, ввод и вывод программы) соответствует формализованному. Поэтому, например, в твоем случае все эти функторы могут находиться в одной области памяти, или вообще не иметь выделенной памяти, пока ты явно не начнешь использовать в них члены-данные, или даже весь код может удалиться, раз программа ничего не выводит. Фактически большинство компиляторов сделает ту или иную оптимизацию, в зависимости от настроек компиляции.
>>828664 Спасибо за развернутый ответ. Я смотрел диссассемблер и действительно >эти функторы могут находиться в одной области памяти, или вообще не иметь выделенной памяти, пока ты явно не начнешь использовать в них члены-данные
Пустой функтор не вызывает конструктора по умолчанию и ничего не делает а просто вызывается функция по статическому адрессу, а как только я добавил в структуру переменные, то конструктор функтора стал вызываться и все сопутствующие ему выделения памяти.
Так у меня вопрос. Читаю concurrency in action и там говорится что std::async может сама решать выполнять тред параллельно или нет, т.е библиотека поидее должна создавать ровно столько потоков сколько доступно на железе, например на моем i7 доступно аппаратных потоков, но когда я рекурсивно запускаю std::async(f) то у меня создается дохуяища потоков (2к+) которые просто висят. При этом если я юзаю Intel TBB parallel_invoke в той же рекурсии то все работает нормально и создается ровно 8 потоков, независимо от глубины рукурсии.
Вот и вопрос как сделать с std::async, std::future тоже самое?
Тезис: есть лабы, которые нужно сделать (а-ля имплементить бинарное дерево или что-то подобное, не суть). На сях, разумеется. Код для проверки будем отправлять своему ТА (Teacher Assistant) c указанием где и как его компилить и запускать, что он, в последствие, и будет делать (компиляция предполагается через g++). В общем, я хочу немного похакерствовать. Что-нибудь достаточно простое, например просто встроить в код доп. функцию, которая соберёт некоторое количество инфы о его системе (какая у него система, линь, винда или макось - я не знаю) и отправит мне на сервер. Ничего серьёзного и сильно подлого. Так вот, какую инфу о системе можно собрать силами С++ (без режима рута, разумеется). Или скажите, хотя бы, как в плюсах выполнить произвольный код в консоли из программы (а-ля shell_exec в php)?
>>828790 Если учитель продвинутый, то он, конечно использует песочницу, как говорит >>828818-кун. Так сделано в том же ejudge, например. Но часто препод бывает алтимейт совком, который вообще ничего не слышал про ИБ, и запустит он твой код на какой-нибудь хрюше из-под DevCpp. Так что попробовать можно.
За никсы не скажу, но на венде все предельно просто. Весь подозрительный код пихаешь в дллку, которую называешь наподобие msvc311.dll, гришь, что это рантайм от твоего компилятора. В коде дергаешь функцию оттуда с каким-нибудь неподозрительным названием, которая будет делать всю работу. Гуглишь доки к winapi, через его вызовы реализуешь скачивание (со своего или официального сервера) nir commander в какую-нибудь глубокую папку внутри appdata. Записываешь в строку прямо внутри dll текст батника с нужными командами nircmd (там их дохуя - можно грабить пароли, узнать полную инфу о системе, выдвинуть дисковод etc), который потом выводишь в .bat внутри той же папки. Запускаешь батник на исполнение в новом процессе, все. Отправить результаты назад можно прямо из батника, в nircmd есть для этого команды.
Интересно. Удалось снизить детект антивирусов с 11 до 2. Кспермский не кукарекнул, зато мой кодес задетектили два каких-то ноунейм бича Инвинсиа и Киху.
И странно то, что несмотря на расшифровку эйкар-последовательности без применения антиэмуляции, на мою расшифровывающую программу среагировали не все антивирусы. Но на текстовик с эйкар среагировали все. С антиэмуляцией почти никто не среагировал.
Господа, как лучше писать криптор: по принципу упаковщика, который криптует секцию кода, дописывает декриптор в конец и передает ему управление при запуске, или по принципу джойнера, к которому прицепляется зашифрованный экзешник, а в лоадере джойнера используется антиэмуляция?
Думаю над второй реализацией. Лоадер расшифровывает прицепленный экзешник и запускает. Как реагирует антивирус на этот запуск? Сначала запускает экзешник на своей виртуальной машине и проверяет сигнатуры?
>>828883 Препод не сказать, что не продвинутый, но по поводу ИБ париться не будет почти точно (молодой парень преподаёт). Вообще я как-то забыл посмотреть на паре какой у него ноут, но есть не маленькая вероятность, что МакОС ибо у нас вообще у многих преподов маки. Ну и у него точно не древняя винда. Энивей, спасибо за ответ.
>>829007 Древняя венда отличается от недревней только тем, что в новой ты сможешь работать только в рамках прав запущенного процесса, без рута, даже если он работает под рутом. Но считать, скажем, содержимое пользовательской папки ты сможешь в любом случае, а все самое интересное как раз там.
Для других осей все примерно так же, даже еще проще из-за практически гарантированного отсутствия антивируса, который может сагриться на подобное поведение. Легче всего сделать отдельные функции для каждой системы (Windows и POSIX-совместимых), и автоматически выбирать между ними при компиляции через #ifdef и макрос OS_WINDOWS (который есть только в венде).
>>829049 >Легче всего сделать отдельные функции для каждой системы (Windows и POSIX-совместимых), и автоматически выбирать между ними при компиляции через #ifdef и макрос OS_WINDOWS
С какими флагами надо компилировать на clang чтоб была максимальная совместимость с gnu gcc? То есть чтоб не было отсутвующих хедеров, разных type castov и т.п, чтоб можно было писать под clang и не заморачиваясь прям из коробочки билдить на gcc? А то я столкнулся с такой проблемой написав проект на цланге, который не компилируется без костылей на гцц...
>>829505 Я думаю, если не использовать блоки, то они полностью совместимы.
Недавно столкнулся с тем, что то, что компилируется шлангом не компилировалось g++. Оказалось, это известный language issue и шланг с g++ ведут себя по-разному, т.к. стандарт невнятно оговаривает поведение. Пришлось чуть переписать одну строку (с инициализации с помощью = на brace initialization) чтобы стало компилироваться и там, и там.
>>829593 Не планируй, пиши браузер прямо сейчас - потом не напишешь, останешься макакой на всю жизнь. Если напишешь наскоряк хрень с асинхронной тред-базед продгрузкой страниц и поддержкой расширений, тебя возьмут куда угодно, даже если рендерятся нормально только половина страниц. Дерзай.
Есть куча классов, все находятся в одном .h-файле. Имя каждого класса начинается с нижнего подчеркивания.(например: _classname). После импелментации каждого класса идет тайпдеф: "typedef _classname classname;". В заголовочного файла идет подключение .inl-файла, в нем реализация этих классов. В чем фейл: Несмотря на тайпдефы, юзание classname в последующих классах не дается. intellisense тупо не распознает тип(classname). Раз тип начинается с нижнего_подчеркивания, а последующий симол в нижнем регистре, значит, класс по-умолчаню будет находится в глобальном неймспейсе? Только влияет ли оно? Пробовал переименовать classname в рандомный набор букв, ну и подставить где надо соответственно. И ошибок небыло. Что за хуйня!
>>829737 > Раз тип начинается с нижнего_подчеркивания, а последующий симол в нижнем регистре, значит, класс по-умолчаню будет находится в глобальном неймспейсе? Слышал звон, да нихуя не понял.
>>829869 Потому что rule of five. Считается, что если ты кастомизируешь хотя бы одну из пяти операций (копирование, перемещение, конструктор копирования, конструктор перемещения, деструктор), то с классом нельзя работать дефолтно (например, из-за членов-дескрипторов или еще чего-то), поэтому оставшиеся операции удаляются, чтобы ты не мог выстрелить себе в ногу.
>>830085 >говноподелия Причём здесь Windows? Ещё Code::Blocks кстати неплох, но в первых автодополнение и организация проектов лучше. Студия зашквар, под MSVC нужно переделывать все исходники и в нормальные проекты такое не пропустят.
>>830102 Нахуя тебе переделывать исходники, лол? Нормальные проекты пишутся нормальными командами, с пачкой студий и TFS в комплекте. Швадобные нищепроекты пишутся на гнутых тулчейнах. Пересечения у этих экосистем практически нет, просто не нужно подменять понятия.
>>830559 Ахуеть, на сколько же надо боятся легасиговна (причем такого, которое рефакторится за 10 минут в очень большом проекте 1 грепом) чтобы не зарезервировать ключевое слово языка...
Я подобные хуйню до этого видел только на хабре в срамах про добавление вывода типов в жяву: там разработчики реально трясутся что если добавить кейворд var в язык это доху всего сломает.
>>830697 Я придумал эту хуйню, когда прочитал в стандарте про идентификаторы со специальным значением. >>830823 Помеченная меткой final локальная переменная класса final с именем final, инициализированная сама собой. using final = final нужен для большего устрашения, чтобы показать, что в контексте инициализатора имя инициализируемой переменной перекрывает имя класса, если явно не делать elaborated объявление.
>>830859 http://ideone.com/fsq6MA Полная дрянь, яннп. Я одиннадцатый стандарт то не докурил, а тут ещё этот пиздец. Можно на собеседованиях показывать, лол. Понимаешь, нахуя такой вывод происходит?
>>830862 Ну очевидно же. В деструкторе создается локальная переменная типа, который удаляется, вызывается ее деструктор, в котором создается локальная переменная... Получается банальное переполнение стека. Самый внешний файл ты создаешь своим конструктором, с i==0, выводится 0. Для всех остальных (которые создаются в деструкторах) юзается конструктор копирования из неинициализированного создаваемого объекта, поэтому в i мусор.
Сап крестоносцы, гутен морган, кун 32 лвл, холост, слегка бородат. Имею вопрос по геолокации а преыстория вот в чем: уже полгода как вкатываюсь в кресты, собрал уже библиотеку всяких Мейерсов, Страуструпов, Сидхартхи, Павловских итд. подписался и просмотрел кучу лекций на ютубе по плюсам и алгоритмам как от доморощеных хацкеров так и от лекториума. прошел пару курсов на степике и получил сертификаты. теперь суть вопроса- где в сети можно попрактиковаться в сабже? где какие курсы есть или проекы для участия начинающих имеющих цель прокачать скилы? В сторону детородных органов прошу не посылать - сам с них пишу, другие яп прошу не предлагать - не интересуют
В указателях хранятся какие-то циферки. Что они значат? Если я выведу указатель на функцию на экран, а потом введу его ручками в другую программу, то я смогу запустить эту функцию из другой программы? Проверил. Ошибка сегментации. Почему?
>>831679 Читай про виртуализацию памяти. Если вкратце - каждый процесс думает, что у него есть вся доступная память (и даже больше), а других процессов в системе нет. Поэтому указатель в новом процессе значит совсем другое, чем в старом (с большой вероятностью, это быдет просто нераспределенная память, поэтому ошибка сегментации).
>>831752 > Читай про виртуализацию памяти Чёт сложно. А где список всех этих страниц хранится? понял что в таблице страниц но что этоКак ос узнаёт какая память занята и кем? Куда она это пишет? Кстати если процессору якобы доступна вся память, то почему числа в указателях идут не от нуля и так сильно отличаются друг от друга?википедии наверно недостоточно. Что ещё почитать?
>>821402 (OP) Ньюфаня вкатывается в тред. Изучаю кресты, хотя до этого ни один язык не изучал. Мне нравится язык, но для меня он очень громоздкий совсем чуть-чуть. Планирую написать какую-нибудь серьёзную вещь, может что-то типа большого алгебраического калькулятора. Язык начал изучать месяц назад, плачу за курсы 2к рублей в месяц, их ведёт тетка, которая окончила тульский мехмат. На занятиях нам дают простенькие, на первый взгляд, задачки. Компилятор называется "Bloodshed Dev-C++". Как думаешь, анон, стоит ли писать на этом компиляторе? В данный момент только скачал изучаю книги из шапки. Может бородатые опытные дяденьки чего-нибудь посоветуют? И вообще жду от тебя советов в стиле: "вот так делай!" или "подучись немного!".
>>831757 Таненбаум, "Операционные системы". Вообще, это в любом курсе по операционным системам есть. >но что это В современных процессорах есть аппаратно реализованная таблица, и процессор, опять же автоматически, при встрече команды с адресом 0x111222 ищет 111 (которое общее у всех адресов в пределах страницы) в левом столбце этой таблицы и заменяет на 333, которое находится в соответствующей ячейке правого столбца. Получается уже физический адрес 0x333222, который есть номер ячейки на плате, например. Это все делается специальной частью процессора одновременно с остальными вычислениями, поэтому дополнительные такты не требуются. На самом деле это очень упрощенная схема, там еще есть нюансы по поводу того, как наполняется и изменяется эта таблица, но в целом все так вот просто. >Как ос узнаёт какая память занята и кем? Никак, вообще говоря. Вот смотри, в однопроцессорной системе, если запущено несколько программ, они выполняются попеременно, кусочками. Например, программа TvoyaMamka.exe выполнялась 100мс. Каждые 10мс процессор автоматически получал прерывание от системного таймера и передавал управление ОС. ОС смотрела счетчики и говорила "не, еще рано". А спустя 100мс планировщик ОС решает (в соответствии с выбранным алгоритмом): "так, чота TvoyaMamka.exe долго выполняется, тут батя тоже хочет". Схороняет мамкину таблицу страниц в памяти, а назад загружает таблицу, которая принадлежит процессу TvoyBatya.exe. Эти таблицы хранятся вместе с process id, дескрипторами открытых процессом файлов и другой инфой, которая своя у каждого процесса. Вот, таблица перезагрузилась, и теперь те же адреса в командах (если даже они были одинаковыми у бати и мамки) будут отображаться на совсем другую область памяти, где лежат данные и код бати. После этого планировщик опять засекает время, управление передается коду бати, и все повторяется. Нюансов планирования и хранения много, а суть простая, опять же. > почему числа в указателях идут не от нуля и так сильно отличаются друг от друга? Даже виртуальные адреса (0x111222), которые имеются в программе, не задаются программистом, а определяются, фактически, ОС (диспетчером кучи либо загрузчиком). Соответственно, это уже вопрос логики ОС, однозначный ответ тут я дать не могу, ибо не профессиональный байтоеб. Может, она стремится по возможности делать соответствие виртуальных и физических адресов один к одному, чтобы не засорять таблицу. Программе-то все равно, с нуля адреса или нет.
>>831956 >какую-нибудь серьёзную вещь >что-то типа большого алгебраического калькулятора Это примерно уровень laba2.cpp. laba1.cpp это класс матриц, laba3.cpp - интерпретатор паскаля.
>>831967 Матрица это прямоугольная таблица с числами, как шахматная доска типа. Интерпретатор паскаля - программа, в которую загоняешь текст программы на паскале, и она ее выполняет. Как PascalABC, только самописный.
Я вот этот кун >>831956 Прочитал сегодня пару глав первой книги из шапки. И знаете? Мне захотелось стать программистом! Спасибо разработчикам этого раздела, спасибо Страуструпу за книгу и за язык, спасибо добрым анонам и отдельная благодарность пауку Аркадию.
Сап, программач. У меня встал вопрос: как составить план обучения? Под конец лета начал читать книгу Страуступа по c++ (Принципы и практика использования C++). Прочитал ее до 7 главы. Очень понравился с++ и хотелось бы учиться и работать в этом направлении. Учусь я на 3 курсе колледжа, который находит под управлением гос. университета (город 200 тыс. человек). Сейчас с началом обучения, нам сказали, что будут преподавать c++, ооп в нем же, бд и много чего еще. Хотелось бы знать о тонкостях языка и прочих мелких важных деталях, но я не уверен, что в колледже нам его дадут в том объеме, в котором я хочу его изучать. В добавок из-за большого количества студентов мою группу поставили во 2-ую смену, а это учеба с двух до восьми. Собственно, что делать? Стоит ли бросать читать книгу и учить только то, что дают или продолжить читать и книгу, но как тогда это совмещать?
Хотеть с++32. Как же я буду угарать над толщиной священого писания крестоебов и попрекать их ересью за незнание рандомных UB в их параше. А там и до религии недалеко.
>>833192 Посоны, а давайте запилим в этом итт треде секту? Можно привлекать ньюфагов, охуенно же.
В начале была декларация. И была декларация в программе. И была декларация программой... ... И сказал Он: "Да будут байтоебы исторгнуты из обители мономорфных вычислений". И создал Он шаблоны, и создали шаблоны шаблоны шаблонов. И были перечислены Его создания, и создания их, и создания тех созданий в Священном писании. И имя ему было Стандарт. ... И сказал Его пророк: "Покайтесь, братья, ибо грядет Борщ, и грядут чистые нечестивцы. И с приходом нечестивцев неосиляторы будут лишены Его библиотеки, и оставит Он одни только S-выражения, и будут у несчастных не векторы, а в каждой паре по Карри".
Дорогая редакция, я сейчас ёбнусь нахуй. В обеих IDE которые я использую (code::blocks и codelite) перестали работать функции. Смотрю в дебаггер, он их просто проезжает без перехода в тело фунции. Всё правильно задекларировано. Старые функции и классы с функциями которые раньше работали тоже перестали работать. Что за хуйня? Компилятор сломался? Линукс поехал? Я ньюфаг, но вроде ничего не ломал.
>>833389 Нахуя тебе эта ШВАБОДНАЯ параша? Используй _НОРМАЛЬНУЮ_ IDE. В никсах это QtCreator или CLion. И вообще нахуй никсы, если ты ньюфаг, накати божественную студию и не еби носорога
Господа, помогите мне разобраться, почему вот этот код https://ideone.com/9cwhHP вычисляет правильные чек-суммы для строк, а код на пикче выводит оно и то же число MessageBox'ом?
Почему после выполнения процедуры генерации ключа в массиве xtea_key содержится просто ноль, если во время ее выполнения выводятся элементы этого массива?
>>834176 Первые два пункта - хуйня на постном масле. Ресурсов и памяти сейчас как жопой жуй, заплатить пару гигабайт за удобство никто не против. Про компилятор отчасти согласен. Но сейчас уже встроенный clang практически прикручен, так что очень скоро аргументов против не останется.
>>834213 >Ресурсов и памяти сейчас как жопой жуй На десктопе. 11'' планшетик с клавой и 32Гб винтом или хромогобук сейчас обычная вещь. Студию туда не поставишь, а криэйтор встает замечательно.
>>834306 А, ну так-то да. Но у них и задачи разные. Студия это охуенный комбайн, который ставится на рабочий десктоп и херачит гигантские проекты своим мотовилом. А на планшетах/телефонах/ультрабуках, которые все время таскаешь с собой, все равно особо не поработаешь, банально собираться будет весь день. Поэтому там ставят что-нибудь легкое, чисто чтобы проверять короткие куски кода, типа Code::Blocks, или вообще пишут в текстовом редакторе с плагинами.
>>834366 >это охуенный комбайн кухонный. даже на небольших проектах твоя студия отсасывает у эклипса, тормознутое гиканское уебище нинужно если конечно ты не хипстер или пидор.
>>834392 >отсасывает у эклипса >отсасывает >у эклипса >который ломается на исходниках буста Ну это вообще пушка. >>834400 Так с cmake и используют. Автодополнение тебе святой дух сделает без IDE?
>>834413 !~x - быстрое сравнение с нулем. Сдвиги для умножения/деления на степени двойки. Вообще, читай Уоррена-мл., "Алгоритмические трюки до программистов", там дохуя такого.
>>834415 >>который ломается на исходниках буста Давай кейс, педрила. Ломается у него там, блядь. Даже если ты и нашел баг в парсере, это никак не сказывается на повседневном использовании - я уже 3 год на эклипсе сижу и все там заебись, так что не пизди.
Алсо, твоя говностудия может спокойно закрешится во время установки брейкпоинта в каком-нибудь хедере. Про охуенный встроенный дебагер, который в 2016 не умеет в function call, я вообще молчу. Про необходимость в платных помидорах или решарперах, когда в еклипсе все идет из коробки, я тоже промолчу.
Про анальный формат проектов студии, закрытость дебажных символов и вообще всю сопутствующую инфраструктуру (начиная от безумно "логичных" обратных слешей в пути и заканчивая отсутствием валгринда) я даже не буду заикаться - ведь ты уже обосрался пару предложений назад.
>>834416 >В новых студиях (после 2010) из коробки есть почти все его фичи. Контактирую с 2013 студией по работе. Такое же говно, как и 2010. Можешь начинать свои маневры про 15 студию.
>>834213 >так что очень скоро аргументов против не останется А можно начать с аргументов "за"? В 2010 студии был один единственный аргумент - более стабильный дебагер, чем gdb. Но мало того, что на линуксах завезли lldb, так и gdb сейчас постабильнее. Не говоря о том, что на OS X платформе все и так работало так же стабильно, как и в VS, так еще вагон плюшек в комплекте шел.
>>834441 Тредов десять назад было, посмотри там в архивах. >ведь ты уже обосрался пару предложений назад Ну ты меня просто растоптал, лол. Придется теперь ставить Eclipse, или еще какое гнутое дерьмо, чтобы все было как у людей.
>>834445 >Можешь начинать свои маневры про 15 студию Не начну, 15 не сильно отличается, по большому счету. >А можно начать с аргументов "за"? Работающие из коробки автодополнение и визуальный дебаггер. IntelliTrace. Море плагинов, многие из которых не имеют аналогов. Удобная интеграция с мелкомягкими сервисами хотя это не всем надо. Стабильность ни одного краша за последние несколько лет.
>>834451 > Контора оплачивает софт а, я знаю такие эффективные конторы, макаке заплатить лишние 500 рублей премии хуй, а вот какой нибудь ненужной хуиты накупить всегда пожалуйста. лол
>>834450 >Работающие из коробки автодополнение и визуальный дебаггер. IntelliTrace IntelliTrace - хипсторское говно, смысла не имеет. Все остальное есть в любой ide промышленного уровня.
>Море плагинов, многие из которых не имеют аналогов Море плагинов везде есть, про неимеющие аналогов - примеры в студию.
>Стабильность ни одного краша за последние несколько лет Словил 3 разных краша за 7 дней работы.
А вообще давай-ка начнем с размера проекта, на котором ты работаешь. А то понабежит мудаков с проектами на 2МБ, которые рассказывают как у них стабильно и быстро работает студия.
>>834456 все просто - макака уволится и лицензия останется у конторы, а вот премию платить - она и так будет, как цена этой лицензии, так и потом макака почувствует вкус денег и в следующем месяце тоже премию попросит.
>>834453 Блядь, сука, ты и сюда из сишного треда протек? Я ебал твои теории заговора, мне от рабочего софта требуется удобство, а в остальном пусть он хоть в жопу залезает - никакой личной информации все равно нет на устройстве.
>>834456 Ну хуй знает. Такой эффект, конечно, тоже есть, но и эффективность работы должна быть же. Я бы нахуй съебал, если бы мне предложили прийти со своим ноутом и кодить в швабодных иде.
>>834465 >Я бы нахуй съебал а как такой вариант, остаешься после работы говнокодишь, переработку не оплачивают - нету денех, потом ряяя внедрили новый корпоративный почтовый сервер за $10000, с нагрузкой аж 100 писем в день. а? лол
>>834457 >смысла не имеет В большинстве случаев да, но меня пару раз оно здорово выручало, когда были хитрожопые баги с синхронизацией тредов. Так что я бы не назвал его критичной фичей, но иметь как дополнительный инструмент - очень неплохо. >примеры в студию Скажем, https://visualstudiogallery.msdn.microsoft.com/2fde2c3c-5b83-4d2a-a71e-5fdd83ce6b96 . Хотя насчет этого пункта я не настаиваю - я не особо много ковырялся с Eclipse, возможно, я просто не нашел аналог. >Словил 3 разных краша за 7 дней работы. Попробуй на чистую сперму ставить, с последними апдейтами. От этого сильно зависит, как показывает опыт. Кококок вот еще, ради одной IDE... >А вообще давай-ка начнем с размера проекта, на котором ты работаешь. Приблизительно 2кк строк, насколько я помню.
>>834463 Хорошо у тебя горит, всем есть что скрывать, Я этих опрпвданий уже насмотрелся. Виндовс - прошивка для слежки, ботнетов, игр, вирусов, для остального просто ненужно.
>>834474 > Попробуй на чистую сперму ставить, с последними апдейтами. От этого сильно зависит, как показывает опыт. Я только сменил работу, у меня новая тачка с чистой виндой сейчас.
>ArrayPlotter Видел для gdb скриптик, который запускает gnuplot. Нормальное решение, тащемта. Если хочется прям уж интегрированности, то у еклипса точно есть такой плагин для джавы, скорее всего есть и для c++.
>>834480 >у меня новая тачка с чистой виндой сейчас Ну хуй знает тогда. Если такое происходит, то, конечно, лучше использовать какую-то другую IDE. Я бы и сам не стал кушать кактус, если бы у меня не работало идеально все.
Возможно, платина, но я внятного ответа так и не нашёл на SO. Как в C++11 организовать такую блокировку, чтобы читать из очереди могли сколько угодно потоков, а писать — только один? Тянуть буст ради одной фичи не хочу, 17-й стандарт тоже не могу использовать.
>>821402 (OP) Че все утверждают, что это дохуя сложный язык? Все основы по языку, которые спрашивают на собеседованиях можно выучить за день. Еще день на основные алгоритмы и еще день на основные библиотеки и фреймворки 3 дня вполне достаточно, чтобы пройти собеседование в яндекс/гугл
>>835565 А чтобы научится писать код не стреляя по себе - нужно еще как минимум пара-тройка лет, в этом-то и все проблема. А потом чтобы начать писать быстрый, безопасный и тем более распределенный код - нужно еще десяток лет, потому что язык - сборище костылей.
>>835569 А в чем смысл вышки по программированию, когда всю базу можно пройти за месяц после школьного выпускного и обкатать изученное, а писать нормальный код в любом случае научишься по ходу работы?
>>835678 ссу матаноблядям в ротешники, заебали форсить свое говно. кудкудах интыгралы, кудкудах логарифмы, вся эта хуита не нужна.
(Автор этого поста был предупрежден.)
>>835335 Вот тебе "читатели-писатели" из прошлого проекта. Тут есть нестандартный перехват ошибок ErrorMaster, но ты сам выпили его, мне лень править эту копипасту.
>>836001 Твой шаред мьютекс только на чтение работает медленнее, чем обычный мьютекс by design (потому что там 3 мьютекса внутри). Зачем использовать shared_mutex тогда?
Суть shared_mutex в том, что на чтение он работает быстрее обычного мьютекса, когда операция записи происходит редко. Атомик надо юзать.
>>836009 Емнип там было надо специфичное поведение (блокировка поступления читателей при наличии висящих писателей), не совсем как в shared, ну и запилили наивную реализацию, оно все равно 3.5 раза использовалось, при сериализации запросов к апи или типа того. Там ответы по полсекунды и скорость вообще не важна поэтому. А так ты прав, конечно.
Суть такая, анананс. Мне нужна софтина (или некий редактор) для просмотра кода и навигация по нему. Вимы и прочее предлагать не стоит. При навигации в проекте с десяток файлов ещё может и сойдет, но что-то большее это не учитывая виртуальные функции, автоматический вывод типов и прочая шаблонная магия нужна иде или около. Использовал студию так-то мне больше криэйтор нравится да и работает он быстрее, но для просто навигации слишком она громоздка и тормознута.
Посоны, есть ли большая разница между Visual Studio Community и допустим Professional? Через вузик вроде последний можно получить, но я не ебу как, куда-то надо писать преподу или еще чего конечно спрошу потом, но все же. А тут скачал и вроде норм. Мне пока чисто лабы делать. Хватит для моего уровня? С торрентов кстати зашквар качать?
Сап ананасы. В общем, устроился я крестоджуном три месяца назад. Разбирался себе потихоньку с работой с видео, кодированном в h264. Вроде, набросал код, который реализует нужный конторе функционал. И мне дают проект, который пилился до этого несколько лет намного более прошаренным челом. Чтобы, значит, этот функционал туда прикрутить. Глянул я код, а там ехал template через typename, этим всем погоняют typedef'ы и все это внутри typeFactory. Миллион .h и еще больше #define'ов и еще какие-то кастомные статические библиотеки. Короче, ООП и сложный для нуба код во все поля и хуй пойми, как оно все работает. Спросить не у кого, т.к. чел, который это писал, взял и помер. Второй шаристый кодер больше по чистому C и ассемблеру, ему вся эта объектная магия тоже не шибко понятна.
Я это все к чему, мне сильно не хватает практического понимания всей этой объектной поеботы, может кто посоветовать адекватные курсы по C++ в ДС2?
>>836407 Конкретно мне -- трудно. Первое задание было написать некий клиент, который ищет в сетке устройства конторы, позволяет коннектится к определенной модели и смотреть, что на этом устройстве происходит и настраивать его.
Это было легко, т.к., как оказалось, свой говнокод намного проще высирать, чем разбираться в чужом.
Потом работа с IP-камерами. Типа сервер забирает поток h264 с камер, крутит кусок в памяти (секунд 20) и по запросу начинает писать его. Ну и плеер, чтобы полученное видео просматривать.
>>836470 Зряплаты хватает на еду-проезд-аренду однушки. Планирую полгода-год поработать, а там уже смотреть на перспективы переката в более хлебное место. Я так-то вроде понимаю в общих чертах, например фреймворк Qt, который весь из себя объектный, использую без проблем. Но вот именно тот код, который мне дали, это какое-то ебунячье нагромождение абстракций. Про проектирование попробую читануть, спасибо. Может там как раз такой подход объяснят.
>>836260 Среди всех прекрасных умений прыщей есть одно самое важное. Оно работает хорошо, стабильно, не зависит от погоды, инвестиционного климата и дружественных усилий, предпринимаемых всякими космонавтами. Так сложилось исторически, что именно это умение, технология, легли в основу нового порядка, нового мироощущения, прыщемирка. Суть вот в чём. Попробуйте представить себе прыщемирок. У него нет границ, которые спермачи могут увидеть, зато есть границы которые они никогда не смогут преодолеть. И вот почему. Допустим, решила какая-нибудь типичная спермоблядь проникнуть в прыщемирок — не важно, будь то пубертатный школьник с истовой жаждой самоутверждения, или завхоз с экономией на бесплатном, или просто пресытившийся анальным гнётом и интересующийся не в меру хомячок; таки или иначе всех ждёт один и тот же печальный итог. Когда типичная спермоблядь пытается, прельстившись радостями прышемирка, проникнуть в прыщемирок через «парадный вход», гордо задрав нос, её ожидает строгий досмотр, на котором моментально выявляется уровень знаний и умений убогого. В частности, выясняется во всех продробностях та самая противоестественная поза, в которую традиционно привыкла вставать спермоблядина, чтобы её начинал использовать хозяин, выясняется, что за душой у спермоблядины никаких знаний нет, кроме этих самых привычек, связанных с облегчением анального гнёта спермогосподина. И тут, поскольку вход-то «парадный», прямо на глазах тысяч обитателей прыщемирка наступает расправа. Древний и тщательно смазанный для анахронизма карательных механизм запускает свои циклопические манипуляторы прямо в анус спермоблядины и стремительно с треском и искрами разрывает его в клочья. Это одна из самых потешных вещей для всех прыщеблядков. Это то, что делает бессмысленными все прочие развлечения, то, что не сравнится по накалу страстей и силе впечатлений ни с чем. На спермоблядские крики слетается множество зевак. Жалкий опущенец кричит, обвиняет в случившимся кого угодно, но не себя, сетует и стенает о том, что прыщемирок не пригоден для жизни, что прыщеблядям, видимо, нравится перманентный разрыв ануса; всё, что угодно будет выкрикивать — лишь бы не признать собственную убогость и надёжность её определения и её очевидность в прыщемирке. Но прыщеблядям известна истина. Она проста. Тот самый надёжнейший анахронизм вычислил хроническую спермоблядь и точно поразил её. Это делает крики спермоблядыша ещё более смехотворными. Так бы всё и продолжалось: изредка спермобляди подбираются к границам прыщемирка, получают свой заслуженный разрыв ануса, и пройдя сквозь боль и унижение, уходят не солоно хлебавши. Но для экстенсивного увеличения количества лулзов, а, стало быть, расширения круга жертв, были открыты другие входы в прыщемирок. Например, на одном из них выдают красочную табличку с надписью «инвалид» и инвалидную самодвижущуюся коляску с обещанием доставить прямо через ограду в прыщемирок, где всё будет хорошо, бесплатно и легко. Не забывают, впрочем, предупредить, что вставать с коляски нельзя ни в коем случае. Что удивительно, коляска действительно начинает своё уверенное движение со спермоблядком на борту, однако сам спермоблядок уже очень скоро начинает смутно догадываться, что его обманули, поскольку, положение, в котором он сидит в коляске не такое уж и удобное, и до боли в анусе напоминает ему то самое положение, в которое его так часто ставил спермогосподин, а сама коляска движется с ощутимыми рывками, меняя направление, да и радостей прыщемирка не особо заметно, а окружающие прыщебляди посмеиваются и указывают на спермоблядка пальцами. И тут, спермоблядок понимает, что его разоблачили, поднимается со своей коляски и начинает грозить прыщеблядкам и кричать им, что он тоже прыщеблядь, поскольку уже проник в прыщемирок, преодолев границу. Это вызывает в прыщеблядях только смех, поскольку никакую границу спермач не преодолел — он просто катается в инвалидной коляске. А когда же спермач понимает и это, то он от досады делает неловкое движение и попадает в цепкие манипуляторы, устремившиеся к его заднице. И тут происходит разрыв на потеху всем окружающим прыщеблядям. Пожалуй, вид такой спермобляди, ещё более униженной, забавит куда больше. А собравшиеся вокруг прыщебляди тыкают палочками в агонизирующую спермоблядь, пока та изрыгает проклятья, обильно поливая собственную инвалидную коляску и землю вокруг анальной кровью. Вот в этом-то и состоит мрачная суть древней кровавой традиции прыщемирка, который не прощает и не ошибается. Так и будет: спермоблядство неизбежно должно караться в прыщемирке разрывом пердака. Вот в чём самая большая потеха: дразнить спермоблядка «бесплатным сыром», твёрдо зная, что его ждёт только бесплатный разрыв жопы.
>>836470 >Александреску Когда мне в очередной раз припекло во время ахуевания от проекта я зашел на лурочку. В статью "умение разбираться в чужом коде". А там картинка в статье с кодом, который как раз напоминающая код проекта (правда, в более упрощенном виде). Лезу я смотреть на подпись под картинкой и точно, Александреску блять.
Кинулся в инет, качать книжку. Приступил к чтению. И тут мысль, блять, а раз проект написан по его книжке, дай-ка я гляну в шкафчик в метре у меня за спиной. Вот она, книжка бля. Забрал домой.
Правда, из этого следует немного грустный вывод. Раз мне никто про эту книжку и методику ничего не сказал, наверное, канторе особо и не нужно, чтобы я справился с задачей. Видимо, моя задача -- изображать программиста, а не приносить некую пользу. Мысленно сделал отметку "съебаться из конторы сразу же, как будет возможность".
>>821402 (OP) Вкатываюсь в геймдев, думал на дроиде ява, заебца. Таксс, движки-мейкеры, платное говно, говно, так, што тут у нас, порт с сишки. Ууу хуево. Ладно, буду свое двигло делать. Лист двиглов на яве: говно, ..., ... ээээ, а где ява?
Эхх, походу не отвертется от крестов, это судьба.
Есть особые подводные камни? Просто скачал вижуал студио и вперед?
>>840748 То что я могу где-то сделать глупую ошибку. Или криво написать. А мне нужно только динамическая матрица и метод для её транспонирования. Проще найти какой-нибудь велосипед и удалить из него всё лишнее.
>>840758 Ну для этого просто пишешь один единственный шаблонный класс матрицы и метод транспозе возвращающий новую матрицу. Для проверки накидай какой-нибудь изи тест.
>>840763 Такая проблема возникала у многих и кто-то написал дохуя продуманный класс матриц где за каждую строчку пояснить может. Я хочу его, а не свой говнокод за 5 минут.
>>840758 Было бы понятно из-за чего ты искал проблему если бы тебе надо было написать всю матричную алгебру. А так если что то можно взять интеловскую либу(я есличо хз где её можно спиздить).
Пердаков огни.
Баттхёрты сочные, сладкие
От студентов, которые дни
Проводят в смятенье, клепая всё свой говнокод
От ярости сотрясая
Самый небесный свод
Ругая Страусов трупы
И комитетский сброд
Но знай - их ошибки не вечны
Декреты сменяют устав
И код, считавшийся вечным
Забудется, легаси став
Не верь разработчику юному
Он глуп, как и нужно скоту
Ведь опытный комитетчик
Чует его за версту
Старший брат:
Предыдущий:
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-треды