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:
Дальше переходишь по ссылке, пробуешь отвечать на вопросы и понимаешь, что ты пока в самом начале пути. Кроличья нора крестов практически бездонна, поэтому продолжать постигать тонкости и детали можно очень и очень долго. В то же время, на этом этапе у тебя должно быть достаточно знаний, чтобы уверенно писать неплохой код. Поэтому читай исходники открытого софта и библиотек, отправляй пулл-реквесты в них, читай книжки по предметным областям и общим методикам разработки, а дальше уже сможешь запилить свой проект или вкатиться в существующий.
Вкатился с задачей. Есть один фак http://pastebin.com/1f7ZVx4V , здесь исходники http://skse.silverlock.org/ . Теперь помогите нубу, который дальше не может в Visual Studio. Я скачал портабл версию VS, теперь думаю как мне выполнить "Expand steam_loader project".
Короче, писал себе приложение, если сильно упрощать, то оно открывает картинку и запихивает её в pictureBox. У pictureBox стоит StretchImage, то есть картинка запихивается в ящик. Ящик квадратный, 120 на 120 пикселей, поэтому, когда картинка не квадратная она там отображается сплюснотой. Решение - поменять высоту ящика, сделав его не квадратным. Почему вот эта параша не работает? Должна ведь. pictureBox1->Size.Height = 100;
>>749176 Blend для Visual Studio — это набор инструментов для разработки, входящий в Visual Studio 2013, который позволяет создавать приложения для Магазина Windows в визуальной среде с использованием языков JavaScript, VB, C# и C++
>>749154 да ты заебал пиарить это говно. Ньюфагу нужно начинать с минимума абстракций, а ты ему предлагаешь сперва настроить IDE. Пусть юзает VS или QtCreator для начала.
>>749415 Пусть сразу на коллайдер идет работать ученым, хуле. В самом начале, нужно просто открыть проект и писать код. Лучше всего подходят QtCreator и VS, где все из коробки.
Посаны, препод сказал запилить курсач, требования простые, С++ и ООП, тема произвольная. Пиздец, что делать? Подкиньте идей, у меня по нулям. Кому чего не хватает? З.Ы. ловко обращаюсь с Qt
>>749490 А ведь можно зделоть. Нафигачить классов, так чтобы все операции возвращали не результат, а дерево выражений. Наверняка есть уже такое где-то. Потом переводить выражения в код для куды, дифференцировать, все так же как и в теано.
>>749483 Интерфейсное говноприложение для тестов. Простенькая бд, редактор тестов, режим преподавателя, режим студента. У нас такое дипломники делают, но можешь как крусач взять, там дел на пару дней.
Как отлаживать работу с кучей? Допустим я насоздавал всяких массивов в куче, а потом начал с ними делать операции. В итоге у меня постоянные corruption of the heap. Помогите!
>>749446 у тебя проект с precompiled headers. для нее его обязателен stdafx.h создай пустой проект, в нем cpp файл. и в него напиши main функцию. и все будет работать без студийных прибамбасов
>>749831 Добра, вот бы еще страуструпа осилить. Начал его книгу читать, но этот мудак впихнул файл #include"std_lib_facilities.h"
Понятно, что даже в любом онлайн компиляторе работать не будет, как и в студии. Я конечно, могу хелло ворлд написать и на иостриме там, но хотелось по книге идти.
Он там предлагает скачать файл, я вроде по инструкции делаю, копирую в блокнот, вставляю в студию в хедер, переименовываю, но шаги 13 и 14 непонятны и поэтому ничего не работает.
https://ideone.com/JCmTwO Посоны, сократил по максимуму. Почему у меня происходит heap corruption в момент вызова HeapFree()? Тоже самое у меня происходило при использовании new [], delete []. Расскажите что это за ебаная куча и почему она корраптится.
>>750001 Потому что ты не шаришьАноним22/05/16 Вск 02:32:45#68№750005
>>750001 Потому что ты не шаришь в указателях. Ты не копируешь строку в вновь выделенную память. Ты просто меняешь значения указателя и передаешь указатель на память не из кучи в heapfree. А теперь пошел нахуй, неуч злоебучий. Книги надо читать сначала, а не с горящей жопой пытаться осваивать по верхам.
>>749918 страуструп - очень плохая книга для начала. читай шилда или еще какие для начинающих.Аноним22/05/16 Вск 02:33:41#69№750006
>>749918 страуструп - очень плохая книга для начала. читай шилда или еще какие для начинающих.
>>750088 По работе с когом он лучше вообще всего, кроме студии. Где-то за ними плетётся кутякреатор, а дальше блокнотики с подсветкой кода вроде гном/кдебилдеров и кодблоксов.
>>750111 >По работе с когом он лучше вообще всего, кроме студии. Поехавший? По код ассисту студия не всасывает разве что у блокнота. Большие-проекты-кун гарантирует это.
>Где-то за ними плетётся кутякреатор, а дальше блокнотики с подсветкой кода вроде гном/кдебилдеров и кодблоксов. Поехавший чтоле? У Eclipse CDT навигация по коду уровня CLion, а то и лучше. В рефакторинге немного проигрывает. Плюс, это единственная ide такого уровня, которая просто открывает makefile проекты.
>>750150 >Поехавший? У меня только с бустом были проблемы. Те же исходники шланга с ллвмом вполне себе быстро открывается и студия с ним вполне себе работает (если не считать получасовой+ индексации). >навигация по коду уровня Заодно шрифты и гуй из шиндовс 98.
>>749082 (OP) http://ideone.com/tcUulk Вот есть код из книги. Выполняю я упражнение, там написано напишете прогу для сумирования чисел от 50 до 100. И это я сделал, но вот что не понятно.
если мы задаем val = 1, то по логике выходит что 1 операция = 2, ибо val = 1+1=2.,
Причем если значения val = 0, то все збс (по логике, проверял в тетради)
Я то думал что val это просто значение переменной, но нет, это означает реальное стартовое число. Погромач обоссы.
>>750227 >если мы задаем val = 1, то по логике выходит что 1 операция = 2, ибо val = 1+1=2., >sum += val sum = 0 val = 1 sum = sum + val то есть sum = 0 + 1 >>750243 Будет.
>>750256 Блять. При val = 0 при первом проходе: sum = sum(0) + val(0); //0 = 0 + 0 ++val; /1 при втором проходе sum = sum(0) + val(1); //1 = 0 + 1 ++val; /2
При val = 1 sum = sum(0) + val(1); //1 = 0 + 1 ++val; /2
>>750272 Код выполняется последовательно. Сначала ты суммируешь sum = sum + val; //0 + 0 потом инкрементируешь val на 1, проверяешь условие цикла val <= 50 //1 <= 50, поэтому снова попадаешь в тело цикла. В цикле вторая итерация опять суммирует sum = sum + val; //0 + 1 = 1 ++val; //2 Опять проверка условия цикла и опять в тело попадаешь sum = sum + val; //1 + 2 = 3 и так до выхода из него.
>>750006 Шилд, блядь, это такой экран чугунный, который образовался между твоим котелком и окружающим миром и мешает тебе расширять словарный запас. А фамилия автора - Шилдт. Как содержимое твоей репки на английском, только буква 'д' добавлена.
>>750434 Кстати может быть случай когда нет решений. Нужно прогу допилить на этот случай. Что в условии про это? Давай линк сам зарегаюсь, почитаю и отправлю.
Нужна помощь: Есть форма и две переменные double x и double y. Как этим переменным присвоить координаты курсора, относительно формы? Например, при нажатии на кнопку, или просто при загрузке окна формы _Load.
>>750467 > Известно, что как минимум одно слово из этого набора было набрано без ошибок, а все остальные слова отличаются от него не более чем в одной букве. Важную часть пропустил. Нужно функция сравнения. Щас поем и сделаю.
>>750458 Итак, теперь я могу отслеживать мышь, но есть проблема. Я создал евент для ФОРМЫ чтобы при движении мыши ее координаты писались в лейбл. Проблема: мышь залезает на территорию какого-нибудь объекта, на котором ее координаты не считываются. Как исправить? Вот код: private: System::Void Get_MPos_Move(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) { double x1, y1; x1 = this->Location.X - Cursor->Position.X; y1 = this->Location.Y - Cursor->Position.Y; label1->Text = System::Convert::ToString(x1) + " " + System::Convert::ToString(y1); }
>>750600 В твоем случае будет просто идти отчет от 10 до 0. А в том коде будет примерно 1)10= 10-1 = 9 2)9= 9-2 = 7 3)7 =7-3=4 и вот на экран нужно каждую итерацию вывести. и тд.
>>750027 >>749894 valgrind - ненужная и страшно тормозная параша по сравнению с AddressSantizer. Его плюс не в самом valgrind а в его профайлерах/kcachegrind.
>>751028 >>751028 на, сам почитай https://msdn.microsoft.com/ru-ru/library/e1e3921c.aspx >Операция инкремента или декремента выполняется после вычисления операнда. Эта особенность возникает, только когда постфиксная операция инкремента или декремента выполняется в контексте выражения.
Теперь объясни мне серому, или лучше пример приведи, где инкремент отдельной строкой будет лучше префиксным
Годный сайт чтобы эффективно учить крестыАноним23/05/16 Пнд 01:59:21#181№751041
Дайте пожалуйста годных сайтов, чтобы Learn и Reference на простейшем английском, максимум дружелюбно, эффективно и просто. Что-то вроде HTMLAcademy, W3Schools, вот такого. Чтобы в одном окошке "учиться", читать и, может быть, даже тестить там же, а в другом, если что, без походов в гугл, вбивать неизвестные операторы, чтобы читать про их параметры, либо вбивать запрос вроде "regular expressions in c++" и находить решение сразу же, без сотни васяновских говносайтов с говнокодом из нулевых.
>>751045 Не гони. По любой хуйне такое уже есть. Мне просто нужно написать несколько хуевин, но я не готов ради них читать 5к страниц по чистым плюсам, бутстрапу, кьюту/гтк, etc...
но там только основы и иногда не очевидно, отчего тамошний компилятор не принимает, вроде бы, парвильное решение (ах да, фигурные скобочки не стоят, где не обязательно; и подобное ) хотя всё не так плохо для начала
>>751051 Это все бесплатно? Вот мне что-то такое, можно даже без интерактива, >Хотя бы что-то вроде http://www.w3schools.com/tags/ref_byfunc.asp и htmlbook но по более серьезным вещам. Контейнеры всякие типа МАП, ЛИСТ, регекспы, высокоуровневая работа с ФС, Win32_API, создание гуя, работа с DOM...
>>751059 Мне кажется, только перечисленная хуйня потребует книг 5, нет? А онлайн референсы? Какие-то сайты хотя бы по отдельным темам? Чому у всех есть, а у плюсов нет? Алсо, >>749082 (OP) Почему первая ссылка ведет на Липмана, а не Страуструпа или Прату? И есть ли смысл чтения последнего, если страус вышел на 4 года позже? Там ведь новые стандарты вышли...
>>751068 Чего сложного, чего там старого и чем липман конкретнее новее (выйдя еще даже до 2015) и проще? Вот чем он реально проще, чем так сложен страус? Уж проще праты только шилдт наверное. Почему его нет кстати?
>>751075 Страуструп в первом же примере с хелло ворлд пишет: #include"std_lib_facilities.h"
И, понятно, что такого хедера нет. Попробуй пропиши в онлайн редакторе или студии.
Он конешно предлагает закинут этот файл в студию, но я пробовал, но шаги 13 и 14 не понятны и вообщем забил пока что на него, вернусь попозже. Хочется, по книге идти, где можно использовать примеры и разбирать их без танцов с бубном.
>>751089 Ну так о том и речь, что иострим и стдлиб отлично зайдут. Это единственная "сложность" страуструпа или назовете еще? >>751080 >>751085 А с чего вы взяли, что липпман не старее страуструпа, но проще, а вот прата значительно старее страуструпа? Кроме года издания, который нихуя не значит?
>>751102 Но прата интуитивнее, а его подача способствует изучению, практике его примеров, а не тупо сидению с учебником ридонли. В свое время, когда я выбирал между липпманом и шилдтом, мне посоветовали прату, и не зря.
>>751102 Но прата интуитивнее, а его подача способствует изучению, практике его примеров, а не тупо сидению с учебником ридонли. В свое время, когда я выбирал между липпманом и шилдтом, мне посоветовали прату, и не зря.
И дело не в первоте в списке, а вот этой самой первой ссылкой создается впечатление, что липман какая-то особая годнота.
Кто-нибудь использовал std::enable_if для конструкторов? В VC++ проблем нет, в GCC похоже не срабатывает трейт, хотя условия выполняются точно и инстанцируются все конструкторы. http://pastebin.com/WBrRhmCS
>>751155 > в книге всё как в остальных только читать дольше т.к. сложно написано > неосилил уёбывай Ну и зачем жрать говно? С непривычки не переваришь. Когда выучишь кресты тогда читай страуструпа
Как же это удручает быть тупым, и так все тлен так еще и тупой.
Годный сайт чтобы эффективно учить крестыАноним23/05/16 Пнд 17:12:28#233№751611
Дайте пожалуйста годных сайтов, чтобы Learn и Reference на простейшем английском, максимум дружелюбно, эффективно и просто. Что-то вроде HTMLAcademy, W3Schools, вот такого. Чтобы в одном окошке "учиться", читать и, может быть, даже тестить там же, а в другом, если что, без походов в гугл, вбивать неизвестные операторы, чтобы читать про их параметры, либо вбивать запрос вроде "regular expressions in c++" и находить решение сразу же, без сотни васяновских говносайтов с говнокодом из нулевых.
Вот мне что-то типа вашей этой академи, да, можно даже без интерактива, >Хотя бы что-то вроде http://www.w3schools.com/tags/ref_byfunc.asp и htmlbook но по более серьезным вещам. Контейнеры всякие типа МАП, ЛИСТ, регекспы, высокоуровневая работа с ФС, Win32_API, создание гуя, работа с DOM...
>>751644 Ньюфаг, я понимаю, что ты еще мало знаешь и все такое, но ты реально срешь в тред своим нытьем.
Вот тебе совет, как нужно учиться: - Составляешь список литературы и ресурсов, где брать информацию - Читаешь материал, пробуешь примерчики, разбираешься во ВСЕХ моментах, которые тебе не ясны - Придумываешь себе задачку, экспериментируешь.
Все это можно выполнить без этого треда, я гарантирую это! Этот тред - илитный и предназначен для сложных и неочевидных вопросов, а также высококвалифицированных срачей.
А теперь съеби в ньюфаг-тред и не заходи сюда до тех пор, пока не напишешь свой простенький компилятор.
Давайте решим усложнённую версию задачки из этого треда https://2ch.hk/pr/res/739345.html 1. Размер массива не 368, а 18 446 744 073 709 551 616. 2. В скобках пишется строка, а не число. 3. Сделать нужно на чистом С.
>>751673 Компилятор задолбал ругаться когда я писал без std::, потом я добавил пространство имен, а вверху ввод забыл поправить. >>751680 Я сам не знаю где брать такие задачи. Данная из книги C++ Primer, 5th Edition.pdf >>751683 Благодарю за развернутый ответ, илитарий. В этот тред я написал, т.к подумал что хрен решу задачу, однако все же решил. Я не сру в тред, первый раз написал. А в ньюфаг-треде одни такие же раки как я, кто мне там поможет?
>>751717 Памяти не хватит в любом случае, даже если предположить, что на каждую функцию в массиве уйдет один байт. Мастерство в умении избежать необходимости делать говно.
аноны такой вопрос. Допустим у меня есть платформозависимый код. Ну пусть класс Window. Очевидно, что мне нужно иметь два класса WinWindow и LinuxWindow. Сейчас я делаю так: #ifdef WIN typedef WinWindow Window #else typedef LinuxWindow Window
>>752168 Qt заворачивает весь платформозависимый код условно в один класс: платформонезависимый интерфейс находится в хедере, а платформозависимый - в cpp файле для каждой платформы.
Т.е. есть Window.h и есть WindowWin.cpp, WindowMac.cpp и т.д. Затем в системе сборки в зависимости от target-платформы определяется, какой cpp'шник будет компилироваться.
>>752187 идею понял. Правда я не про qt говорил. А вот допустим у нас есть отдельные дескрипторы для win и mac окна. Как мне их тогда объявлять в хедере?
Всё. Разобрался. Вариант с наследованием для меня не очень. Не хочу тянуть лишние вирт. методы. Сделаю как в cocos2d-x. Завтра ещё посмотрю как в qt. А то сегодня уже спать хочу. Спасибо всем, аноны!
есть темплейтобоги в треде? видел какую ебалу можно на них творить... параметризация алгоритмов и структур данных, например, параметризованный сортер для дерева, или параметризованная underlying structure для кучи, кастомные аллокаторы и прочая мета. ну, или вот, например, https://github.com/lukasmartinelli/py14 оно все, конечно, круто, но вот вопрос: выходит ли это за рамки игр с фичами языка, и используется ли это кем-то, кроме александреску и разрабов boost, в реальных проектах? просветите, а то не могу ничего годного найти
>>752452 Используются ли на столько замудренные способы - не знаю, но я использую, особенно когда приходится иметь дело с параметрами разных типов, чтобы не было копипасты и трудноподдерживаемого кода.
>>752452 >параметризация алгоритмов и структур данных, например, параметризованный сортер для дерева, или параметризованная underlying structure для кучи, кастомные аллокаторы и прочая мета Это все называется паттерном "Стратегия". Ничего сверхестественного здесь нет. Да и вообще в шаблонах тоже нет. Всего есть до пяти приемов, которые формируют полноту по Тьюрингу. Но даже зная их, нормальные люди не страдают хуйней по типу написания парсеров на шаблонах, потому что эта ебота получится write-only, без возможности отладки и будет компилиться часами. Короче говоря, нормальные люди в таких ситуациях использую решения, написанные на полноценных языках.
>>752525 >а можешь написать, что это за приемы В целом, для реализации всего на свете нужны только условия, циклы(или рекурсия) и память. Условия в шаблонах - by design, рекурсия - через числовой параметр шаблона, память - через константные статические переменные. Все остальное - уже надстройки над этими тремя средствами.
Есть данные, хранящиеся в векторе. В один момент нужно изменить размер вектора и отсортировать данные в нем. Можно ли это сделать без создания дополнительного вектора?
>>752740 Суть в том, что нужна не простая сортировка, а что-то вроде распределение ключей в хеш-таблице, которые (ключи) зависят от ее размера. Соответственно изменяя размер необходимо полностью поменять положение элементов
>>752745 >>752761 бля, я ебаный ньюфаг и не могу объяснить задачу, гоните меня ссаными тряпками нахуй.
У меня есть что-то вроде хеш-функции: Каждую позицию вектора занимают данные, а позицию я высчитываю с помощью функции, которая зависит от размера таблицы. Возникает ситуация, когда надо изменить размер таблицы, соответственно просто сделать ресайз не получится, нужно по новому прогнать все элементы, так как их позиции уже изментся в связи с изменением размера таблицы.
Я делаю так: помещаю исходные элементы в новый вектор, изменяю размер исходного, очищаю его и потом последовательно переношу из временного вектора данные в новый уже с новыми ключами. Можно ли это сделать как-то без создания доп. вектора?
>>752838 >просто сделать ресайз не получится, нужно по новому прогнать все элементы, так как их позиции уже изментся в связи с изменением размера таблицы. Обычно именно так и делают. Твой способ годится только для RT систем, где проще выделить память, чем проебаться с рехэшом.
>>752838 В векторе есть пустые ячейки и занятые? Не проще мап взять? Проблема возникает только если тебе 1 элемент надо положить в уже занятую ячейку? Тогда можно рекурсивно искать элемент который можно переложить в пустую ячейку. Типа поиск в глубину. Тогда проблема может быть только с зацикливание. Что делать если наткнулся на цикл понятно. Тупо переложить все элементы по очереди. Сложнее его задетектить. Наверно надо множество создавать в котором будут номера элементов которые уже переложены на свои места и их нельзя трогать. Или только те элементы что посещались в момент рекурсии. Тогда с каждой выходом из рекурсии его можно очищать. Ну и осталось по очереди все элементы перебирать и заново функцией хэш считать. Должно быстрее работать. Правильно условие понял?
>>752907 бля, ты условие понял правильно, мап не покатит, т.к. каждая ячейка имеет много полей (структура). Исходя из твоих слов я понимаю, что будет проще все таки с вторым вектором
Анончики, кто-нибудь пользовался бустовским any_iterator? Как организовать цикл по any_iterator'ам, если их даже нельзя сравнивать? В доке найти пример не могу.
>>753119 это не лаба >>753120 Почему в vs на этом этапе ошибок нет вообще? Да и сообщение о исключении появляется только под конец выполнения. Там вообще эти строчки не используются.
>>753158 Или как вариант держишь два вектора. В одном сами элементы в произвольном порядке, во втором твоя хэш-таблица с индексами элементов. При ресайзе очищаешь вектор с индексами и перестраиваешь заново.
>>753078 Бля, судя по всему, только бустовским for_each. Бля, пиздец. Вроде бы ещё Майерс в одной из старых книжек писал, что не нужно пытаться писать контейнеронезависимый код.
>>753128 Если у тебя не цель показать использование выделение памяти (без ее освобождения), то используй вместо char[] std::string (как уже подсказали выше), а вместо char test; std:vector<std::string> test; Возложи заботу по управлению памяти на плечи разработчиков замечательного STL. И падения скорее всего прекратятся.
>>753166 ВНЕЗАПНО new и delete – это и есть простая обёртка над маллоком. Использовать "голый" маллок (или системный апи для этого) нужно только в совсем гурманских целях игрищ с байтами.
Я раньше был за, а сейчас время компиляции раздражает, поэтому я сейчас делаю пакет нугета и всё удобно и быстро:)
third-party либа, в публичном struct'е поле спрятано за #ifdef. Внезапно разошлись дефайны при сборке самой либы и использующего ее кода
Выше всё цитаты. Это к вопросу о реальной, а не выдуманной жизни плюсовиков. Убогая система модулей, отсутствие кросс-платформенных пекеджей. А не ололо-шаблоны и ололо-утечки.
>>753281 есть массив объектов допустимто. как написать структуру бинарного дерева, элементами которого являются эти объекты. например взять и вывести потом инфу этих объектов последовательно. Типо пишем struct A {class-type o[100]; class-type left; class-type right;} Или что? как это вообще работает?
>>753284 Ну да, именно так это и делается. Ты создаешь структуру, в структуре у тебя находится указатель на левого потомка, указатель на правого потомка и сами данные. Примерно так: struct BinTree { Data data; BinTree [pointer] left; BinTree [pointer] right; };
BinTree* tree = new BinTree; tree->left = new BinTree; tree->right = new BinTree;
и так далее.
Как вывести -- да как хочешь, обходи дерево хоть в глубину, хоть в ширину, как тебе нужно и удобнее.
Господи, ну вот нахуя Страуструп придумал всю эту поебень. Тонны какой-то бессмысленной синтаксической обертки, чтобы в итоге выполнить все тоже самое, что и в си.
Покажите хоть один юзкейс, где кресты помогают решить задачу быстее и легче, чем в голом си?
>>753334 >Покажите хоть один юзкейс, где кресты помогают решить задачу быстее и легче, чем в C Как там твои обобщенные типы на макросах? Или, например, не заебался еще структуры из одной иерархии друг к другу кастить, чтобы сделать ООП? И все это без вменяемой навигации в IDE. Или, к примеру, нравится выводить размеры для маллока? А потом инициализатор вручную вызывать? А ручками RAII хуячить не остоебенило?
>>753447 Этот чувак, кстати, разрабатывает настоящую (а не как сейчас) анонимную имиджборду: https://www.youtube.com/watch?v=hL3AnIOfu4Y Профессор Стэнфорда потому что, а не любитель паралимпиадного программирования из ИТМО.
>>753266 У него не так сортировать надо. Скорее переупорядочить. Ему нужно переложить элемент из одной ячейки в другую, а номер другой ячейки говорит функция.
>>753527 Видимо не совсем понятно, что такое указатель. Из-за статической типизации при обращении через указатель компилятор будет ограничивать считываемую память размером типа (в твоем случае int, причем он может быть разного размера на разных целевых платформах).
>>753334 Все на Си можно, что на плюсах. Но нахрена лепить велосипеды в Сях, когда есть более удобные инструменты. Особено когда лепят костыли из препроцессора и массивов указателей на функции.
>>753527 У тебя есть участок памяти на которые указывает указатель. У тебя там куча байтов. А указатель указывает на 1 байт. Если ты не скажешь ему тип, то компьютер не поймёт что с таким указателем делать. А так ты говоришь что это int и тогда очевидно что следующие 4 байта будут принадлежать тому участку памяти куда указывает указатель. И компьютер понимает что 2 этими 4 байтами надо обращаться как с intом. Будь указатель на unsigned int, а байты в памяти лежали те же самые, то программа обращалась бы с ними по другому. Понятнее?
Тезисы на сегодня: 1. Долгая компиляция это зло. Отсутствие модулей это плохо. Мы все страдаем от этой проблемы, но попытка быстро-быстро перепилить что-либо обернется куда большей головной болью. Медленная компиляция лучше, чем развалившаяся совместимость. Кресты не идеальны, но, тем не менее, хороши. Лодку пытаются раскачать ньюфаги, которые сели в нее без багажа. 2. На сях можно сделать все, что можно в крестах. На асме тоже можно. Вопрос всегда в количестве альтернатив, ибо выбор между malloc/new/аллокаторами/велосипедами/еще чем-то, вообще говоря, зависит от ситуации и предпочтений погроммиста. Пока в крестах есть malloc, а в сях нет new, кресты лучше сей как универсальный язык (но не обязательно это так в какой-либо конкретной ситуации).
Господа, уверенно ебашу хеллоу ворлды, в поисках прогресса наткнулся на stackoverflow на совет перейти на QtCreator. Прошу разъяснений что это за хуйня, и как сильно придется забыть любимый nano и такие простые include <stdio.h>
>>753646 > code::blocks Где ты ещё кроме вима можешь свой код на весь экран развернуть? Везде постоянно что-то лишнее попадает., а тут легко и быстро можно мелкие изменение делать
>>753732 >сраного code::blocks >А чем он плох то? Тем, что cmake без танцев не умеет? Тем что не поставляется упакованным из коробки в отличии от VS и QtCreator? А так лично мне похуй на него, бесит только анон, который его вечно пиарит.
>>753743 > code::blocks >Где ты ещё кроме вима можешь свой код на весь экран развернуть? Везде постоянно что-то лишнее попадает., а тут легко и быстро можно мелкие изменение делать Во всех современных IDE есть фуллскрин
>>753646 Это пропаганда CodeLite. Не, ну серьезно, посоны. Любой вменяемый человек понимает, что это такое дело... Очень индивидуальное. Есть тысячи мельчайших факторов, которые формируют наши предпочтения, и невозможно сделать какое-то полномасштабное сравнение и окончательно решить вопрос выбора IDE. Опять же, задачи у всех разные, для написания хэллоуворлда вполне достаточно консоли, тогда зачем человеку ебаться с установкой чего-то? Все что мы можем - сделать частичное сравнение по каким-то важным пунктам вроде обилия возможностей, скорости работы или качества отдельных фич. Оно энивей будет предвзятым, потому что все используют разные подмножества фич и имеют разные требования к их качеству. Кому-то лучше много сырых фич, кому-то - меньше, но отточенных, кто-то запускает IDE на калькуляторе, кому-то вообще важен внешний вид, или кроссплатформенность, или еще чего-то. Тут не угадаешь. Ты спрашиваешь анона - он дает тебе свое имхо, говоря за свой рабочий процесс и свои хорошие практики. Если тебя чем-то оно не устраивает - ну поставь себе на виртуалку десять IDE и сравнивай их, никто ж тебе не запрещает! Либо ты получаешь быстрый рецепт от анона, либо кулинаришь сам, третьего варианта просто не.
>>753846 Это древний судя по разрешению 4:3 монитор. Хотя они и сейчас продаются – для пейсания в хорошо кастомизируемой IDE (камень в сторону культяп креатора) оч кошерно.
>>753854 Это окно, работающее в presentation mode. Можно его и в fullscreen развернуть >>753850 ШINDOШS + рюсская локаль, признак пидарана-говноеда
(Автор этого поста был забанен. Помянем.)
>>753861 Я еще могу понять использование Windows+Visual Studio, которые имеют свою область применения, но рюсская локаль в комплекте с этим уже за гранью добра и зла.
По оси Х - запуски одной и той же программы с одним и тем же входом, по Y - время выполнения. Но как видите иногда бывают скачки, Синий график - Wall clock time процесса, красный - cpu clock time. Почему одна и та же программа имеет разный cpu clock time на одинаковом инпуте? Рандом в программе не используется.
>>753959 SHED_RR,SHED_FIFO - как добиться на линуксе гранулярности выполнения ПО хотя бы 200-300мс - софт активно гоняет по сети данные и обрабатывает поток примерно в 16 Гб/c?
>>753956 Хорошие олимпиадные задачи подбираются таким образом что решение с неэффективным алгоритмом заведомо не способно влезть в ограничения, а задача с эффективным имеет достаточный запас по времени и задержка (если возникнет) не повлияет на прохождение тестов.
Почему cpu time (Красный график) возвращённый функцией clock кореллирует с wall clock time (Синий график), если все точки на этом графике - выполнение одной и той же программы на одном входе данных. Рандома внутри программы тоже нет. Почему время выполнения разнится?
>>753952 >>753934 Я потому второй график с cpu clock time и нарисовал, по идее количество тиков использованных на выполнение программы то должно быть одинаковым, даже если оно прерывалось.
>>753983 Кэш миссы, так же зависящие от фазы луны учитываешь?
Как я уже говорил – один раз проверять смысла мало, нужно как минимум брать среднее. Ну или просто смотри на сколько алгоритм влезает по времени и памяти как антоша выше говорил.
Работаю в компании, которая занимается полным циклом изготовления приборов для автоматизации. Устроился недавно, после ВУЗа. Сам инженегр. Всегда тяготел к программированию, умею малость в жаваскрипт. У нас висит вакансия уже давно, о том, что им требуется инженер-программист С++ с опытом много чего. Недавно повесили вакансию, что возьмут выпускника программиста и от него требуется только знать С++ (видимо HR совсем отчаялись). Думаю попробовать вкатиться. Литературой уже помаленьку обмазываюсь.
Вопрос такой - где можно попробовать порешать реальные задачи по нашей отрасли? Предположительно работа будет с написанием ПО для всяческих контроллеров и разработка и поддержка своей SCADA-системы.
Подскажите, можно ли сортировать std::multimap через std::sort? К примеру так: std::unordered_multimap<int, int> mm; std::sort(mm.begin(), mm.end(), std::greater<int>());
>>754479 Оно там нахуй не нужно. Я ключ просто для удобства поиска отдельно хранил. И сейчас решил сортировку добавить и чет тупанул. std::vector<std::tuple<>> и std::find, std::sort заглаза.
>>754401 Разного рода мапы, деревья, хеш-таблицы нельзя сортировать. Элементы в них расположены в строго определенном порядке (зависит от реализации) для ускорения их поиска, и менять этот порядок нельзя иначе потом в них нихуя не найдешь.
struct DlinaMassivaForProverki { int Verh, Pravo, Niz, Levo; };
struct PointPosition { GLint x,y; };
Создаю
DMFP_PP CurrentLehtKorPoForProverki; CurrentLehtKorPoForProverki = new DMFP_PP; CurrentLehtKorPoForProverki->DMFP = new DlinaMassivaForProverki;
CurrentLehtKorPoForProverki->PP = new PointPosition* [ 4 ]; CurrentLehtKorPoForProverki->PP[ 0 ] = new PointPosition[ CurrentLehtKorPoForProverki->DMFP->Verh += 1 ]; CurrentLehtKorPoForProverki->PP[ 1 ] = new PointPosition[ CurrentLehtKorPoForProverki->DMFP->Pravo += 1 ]; CurrentLehtKorPoForProverki->PP[ 2 ] = new PointPosition[ CurrentLehtKorPoForProverki->DMFP->Niz += 1 ]; CurrentLehtKorPoForProverki->PP[ 3 ] = new PointPosition[ CurrentLehtKorPoForProverki->DMFP->Levo += 1 ];
Естественно присваиваю значения( ноль ), но по какой-то неясной причине не присваиваются значения, синтаксис проверял всё норм. На разных форумах смотрел, но там проще или не то. Просьба пояснить, почему не присваиваются значения или не видит ничего по адресу?
>>754547 >>754561 >>754564 Блять, а хули вы хотели? Я то, наивный, думал, что умные люди здесь сидят, а нет. По делу есть, что сказать?
Лучше бы привели пример вложенных структур. В моём случае две в одной, на основе одной из них динамический массив, причём длинна каждого разная. Проблем в общем-то нет, но меня интересует иной вариант их объявления, разименовывания.
Котаны, нужна ваша помощь... Пишу свой pacman с блэкджеком и консольным выводом, но постоянное обновление всей карты приводит к мерцанию, которое жутко бесит. Как сделать так, чтобы только изменяемые клетки рисовало, а старые так висели?
>>754635 Не, не так Нарисовал карту - раз Затем по координатам пэкмена отрисовываешь лишь кусок 1х1 карты, то есть только он отрисовывается, а карта висит
>>754637 Чёто типа for бла бла бла cout то, что являестя картой } Затем снова массив карты[ коорлината х пэкмена ][ координата y пэкмена ] = пекмен это постоянно обновляешь, предидущую чистишь, там пробел пишешь
>>754640 точка, ввода символа. У меня так и сделано как вы сказали, но из-за низкой тактовой частоты ЦП, у меня при нажатии кнопки (т.е. движения) карта пропадает на мгновение.
Насчёт пэкмена, один раз рисуешь карту, затем, там где указываешь движение, прописываешь: При нажатии клавиши, бла бла в массив по такому то адресу, там i и j рисуется пэкмен, в предидущую клетку рисуется пробел, ниче вроде не должно моргать
>>754671 Консоль - поток символов, у него есть текущая позиция, куда идет вывод. Если ты, например, выведешь \r, вывод пейдет на начало текущей строки, \b - сдвинется на символ влево, и т.д.
>>754676 Наверно к тому, что все, кто хоть когда-то работал с консолью знают этот термин. Ныне даже в большей часте линуксов это вообще нахуй не нужно.
>>754693 Ну ты делаешь, например, архиватор. Пока файл архивируется, в консоль выводишь прогресс. Но чтобы не выводить новую строчку каждый раз, затираешь старые символы, и выводишь поверх новые.
пацаны не работает код . Передаю в функцию файлы, но при комлийле выкидывает ошибку ios_base(const ios_base&); код функции void File (fstream fin, fstream fout) { fin.seekg (0, fin.end); int length = fin.tellg();
fin.seekg (0, fin.beg); char c; for (int i =1 ;i<length;i++) { fin.seekg (-i-1, fin.end); fin.get(c); fout.put(c); } }
> 2016 год > Майкрософт все еще не в состоянии написать деинталлятор, который бы не ломал систему > Заводим проект на гитхабе https://github.com/Microsoft/VisualStudioUninstaller Эта хуета когда-нибудь закончится?
Вопрос: Почему в дочернем классе можно переопределить функцию родительского класса, при этом не указывая virtual в род. классе? Чем эти 2 случая отличаются?
>>755636 Процесс вызова функции состоит из нескольких этапов. Например, ты пишешь f (42); Тогда последовательно произвойдут: 1. Name lookup (компилятор отбирает из всех имен f, встретившихся в текущей единице трансляции, только те, которые видимы в данной точке программы) 2. Разрешение перегрузки (компилятор отбирает из всех функций, отобранных на предыдущем этапе, ту, у которой типы параметров лучше всего соответствуют типам аргументов - f (int) в твоем случае выберется вместо f (char), даже если видимы обе) 3. Разрешение доступа (компилятор проверяет, что ты имеешь право вызвать выбранный метод - например, что он не является private, если ты вызываешь его не из друзей/других методов) 4. Разрешение виртуальности (уже в рантайме для виртуальной функции выберется, вообще говоря, не она сама, а аналогичная из наиболее глубокого потомка)
Соответственно, случаи отличаются как пункты 1 и 4 - в первом случае это будет вообще другая функция, даже до перегрузки дело не дойдет. Во втором случае, наоборот, она заменится в самый последний момент, для заменяющей не будет ни проверки доступности, ни поиска лучшего соответствия, все они будут проведены для заменяемой - виртуальной в родителе.
>>755636 Если функция обычная, не помеченная как виртуальная, то идет просто вызов обычной функции, в которую передастся this в качестве неявного параметра. Когда ты вызываешь мембер-функцию по указателю на базовый класс, то поиск функции происходит в базовом классе, а когда по указателю на наследник, то поиск происходит сначала в классе-наследнике.
Когда функция виртуальная, то все происходит сложнее. Тогда для этого класса и всех его наследников заводится таблица виртуальных функций, в каждой из которых сопоставляется имя функции её фактическому адресу. Например, у тебя в базовом классе есть виртуальный метод foo, который переопределен в наследнике. Тогда в таблице виртуальных функций базового класса будет строчка вида foo -> <адрес Base::foo>, а в таблице вирт. функций наследника строчка вида foo -> <адрес Derived::foo>. И в каждом созданном объекте хранится указатель на соответствующую таблицу вирт. функций. Вызов виртуальной функции преобразуется компилятором в цепочку действий: 1. Пойти в таблицу вирт. функций по указателю внутри объекта 2. Найти там соответствующую функцию 3. Вызвать её
Ну вот, теперь что происходит в случае, когда функция перекрывается и когда она виртуальная. Первый случай: есть базовый класс Base, у него есть невиртуальная функция foo, от него наследуется класс Derived, который функцию foo перекрывает. Теперь такой код: Base[звездочка] b = new Derived(); b->foo(); Здесь компилятор разрешает вызов мембер-функции foo. Он видит, что объект, у которого она вызывается, является экземплятором класса Base, про то, какой фактически объект находится по этому указателю, компилятор не может знать, поэтому он просто вызывает функцию Base::foo. Теперь представим, что функция foo объявлена с модификатором virtual. Тогда вызов функции b->foo() компилятором будет преобразован в поход в таблицу вирт. функций, в поиск там соответствующей функции, взятие её адреса и вызов. По указателю b фактически лежит объект класса Derived, у которого в таблице вирт. функций есть строчка foo -> <адрес_Derived::foo>, будет взят адрес Derived::foo, после чего она и будет вызвана.
>>749082 (OP) Чем code::blocks хуже clion или codelite, почему его нет в шапке? На чем трушнее разрабатывать гуй в 2016? Juce/wxvidgets/gtk/qt и почему? Какие плюсы-минусы?
>>755812 Да, конечно иди. После подобных курсов меня сразу взяли на должность мидл-девелопера, хотя я вообще языка практически не знал до них. Стоит своих денег!
>>755945 1. Деньги уплочены. 2. Чисто психологически не так легко соскочить, когда занимаешься с другими людьми. 3. Препод должен популярно объяснять непонятные моменты.
>>756197 окей. это не столь важно, список или матрицу. главное реализовать поиск. считать строку и определить что это за класс и откуда наследует (если наследует вообще).
>>756214 Все классы в разнабой? Родитель может после ребёнка быть? Тогда нёжен мап. Ключ имя класс, а значение это множество унаследованных от него классов. Читаешь файл по строкам. Если встретил класс базовый, то добавляешь в мап и множество детей пустое. Если встретил унаследованный класс, то класс ребёнка добавляешь в множество детей класс родителя, и создаешь пустой класс ребёнка если он ещё не создан. ЗА 1 проход должен справиться. Можно не мапом, а вектром. Так сложнее, но в конце в список смежностей не придётся конвертировать.
>>756199 Какие ограничения? Могут ли в классе быть объявления методов, функций и т.п., или это форвард-декларации без тела класса? Могут ли быть комментарии в этом файле? Однострочные, многострочные? Может ли быть что-то кроме классов в файле? Строки, например?
В общем случае тебе надо брать с++ парсер и вытягивать оттуда классы, потому что ручками распарсить это будет очень тажело.
Если же условия облегченные, т.е. просто декларации классов, без тела, комментариев и других элементов языка нет, онли классы и зависимости, тогда напиши легкий парсер, можешь сам ручками, можешь использовать bison++ генератор парсеров, вообще ручками тут будет достаточно просто это сделать.
Ну и потом сохраняешь это как-нибудь. Если нужна матрица смежности, ну так создай массив массивов булов, лучше всего юзай std::array, и заполняй.
>>756227 Двачую, в общем случае без полноценной компиляции до конца хуй распарсишь. Например, можно без проблем нахуярить такой код, чтобы родители были разные в зависимости от содержимого какого-то из строчных литералов, и все развалится от малейшего дуновения нестандартного парсера.
>>756227 >>756222 Спасибо за помощь, но не могу вытащить из строки "нужное". Есть ли вариант с помощью регулярных выражений получить из строки: class Child1: virtual public Parent, virtual public Child0 {}; строку: Child1 Parent Child 0
>>756413 Я не смог понять КАК это сделать. Мне ничего не мешает, есть текстовик, там все эти наследования, как я и говорил, их может и не быть, а может быть 2-3, к примеру. Суть не в этом. Мне надо получить то, что я написал выше, с учетом того, что если будет больше наследований, то соответственно больше имен
>>756451 Каждый вложенный массив может появится в новом месте. Чтобы это избежать костыль по превращению двумерного массива в одномерный нужен. И не эффективно т.к. лучше фрагментация памяти чем её перерасход.
Но я не уверен, можно ли сделать произвольное количество матчинг-групп, как в твоем случае, в онлайн-регэкс чеккере у меня захватывается только имя последнего класса.
А можешь ручками распарсить, просто читаешь последовательно слово за словом из потока, и проверяешь прочитанные слова, типа того:
Это пример и он топорный, тут не разобраны случаи с пробелами перед и после запятых или точки с запятой, тебе надо над этим подумать.
Последний вариант -- погугли, что такое лексеры, генераторы парсеров и парсер-комбинаторы, на хабре есть статьи и в других местах тоже, можешь использовать их, они сложнее в освоении, нужно иметь знания в области формальных языков и грамматик а также требуют времени на освоение, но они позволяют решать эти задачи более элегантно и просто.
>>756537 наши звездочки пожрал долгоносик, милорд Надеюсь, понятно, где они должны стоять везде, где разыменовывается итератор rbegin() и сравнивается с символом
>>756538 >Надеюсь, понятно, где они должны стоять везде, где разыменовывается итератор rbegin() и сравнивается с символом Охуел, бля? Еще мы тут будем вчитываться в твой высер. Заливай на ideon свое говно.
>>756540 Иди нахуй, я ответил человеку. Если ему это нужно -- разберется или хотя бы вежливо попросить залить куда-нибудь. Если твои глазки болят и вытекают глядя на мое говно, можешь идти, сесть в уголочек и тихонечко их себе выколоть.
4.6/1 говорит, что сохраняет значение только float->double promotion, а double->long double может терять точность. 3.9.1/8 говорит, что long double имеет достаточную точность, чтобы хранить любое значение из double. Тебе не кажется, анон, что тут какая-то нестыковка?
>>756924 Я имею в виду как раз, что ее нет среди promotions. Получается, безопасность не гарантируется, но 3.9.1/8 утверждает обратное. Если она всегда безопасная, то зачем ее отнесли к conversions, разве основная суть promotions не отделение гарантированно безопасных преобразований?
>>756970 В 8.5.4/7 вроде указаны все сужающие преобразования, видимо, все остальные являются нормальными. Хотя действительно странно, что напрямую нигде не сказано про double -> long double.
Подскажите пожалуйста, я недавно читаю книгу, но медленно иду, и тут я застопорился в задачке из книги с шапки: http://ideone.com/iGGnvN Как сделать так, чтобы если я ввёл unit не из списка (m, cm, in, ft), то мне писалось бы что он неверный и предлагалось заново ввести его, а не закрывалась программа? На 18-22 строках у меня бам break; стоит.
Сап плюсач. Есть одна функция. А вернее целый класс с этой ф-цией. http://pastebin.com/YJDR9eTL Вот сам код. При попытке его скомпилить(это кусок библиотеки) все получается и никаких проблем нет. Но вот при подключении этой самой библиотеки к тестовому проекту, последний выдает ошибку линковщика, жалуясь на DelegateProc. К слову если убрать присвоение DelegateProc = _DelegateProc; То код вполне себе компилится. Казалось бы дело именно в нем, но как, черт возьми, тогда его правильно сделать?
>>757794 Ты имеешь ввиду его нужно было в самом начале еще присваивать? То есть указать сначала тип, потом этот объект, и потом какую-нибудь начальную ф-цию. Но как указать тип? ???? Win32WindowWrapper::DelegateProc = DefWindowProc; Что писать в начале?
Есть QQuickWindow, можно в него опенгл рендерить отдельно? Пошарил по гуглу, говорят цеплять рендерер к beforeRendering/afterRendering, но это хуйня какая-то, мне нужно больше 60фпс.
>>758702 не используй тут std_lib_facilities.h внутри нечто избыточное для "драститя,мирок" пиши вместо #include <iostream> using namespace std;
+ функция int должна возвращать int, т.е. перед "}" вкрячь
return (2016); // 2016 - ничего не означающее
или вообще просто замени "int main~" на "void main~"
Так оно должно запуститься, но результата ты, скорее всего не заметишьпрограмка быстро выполнится и кокошечко сразу цакроица, так что перед return~ пропиши, к примеру, int xui; // объявляешь переменную хui, типа int cin >> xui; // тут программка будет ждать ввода хуя, - ничего не будет происходить, пока не введешь число - полюбуешься на свой Hell~
QT и OpenMP ПРОБЛЕМЫ У меня есть два вопроса: 1) Есть Window. На нём есть пара элементов. Как можно поменять параметры одного элемента из кода другого? Обычно это делается сигналами/слотами, но что делать, если я хочу, например, изменить значения на сразу двух лейблах по нажатию кнопки? Мне нужно биндить слот на кнопке сразу к двум сигналам на лейблах?
2) Есть кнопка. Когда нажимаю кнопку, начинается в цикле выполнение некоторого кода. Цикл распараллеленн с помощью OpenMP. После завершения нужно вывести результат в лейбл на форме. Как сделать так, чтобы во время этих вычислений, само приложение не подвисало? Такое возможно с OpenMP вообще? Ну то-есть, я хочу, чтобы приложение просто висело и не крашилось от того, что пользователь по нему кликнет пару раз наугад куда-нибудь.
завтра курсак сдавать, а у меня=> Недопустимый путь: "F:\Курсач 0.2.accdb". Убедитесь, что путь указан правильно и имеется подключение к серверу, на котором находятся файлы. как обновить путь автоматом к базе сразу ко всему?
>>759260 1. Да, либо отдельный слот создавать, чтобы он выводил сразу на обе подписи. 2. QtConcurrent может такое, напихаешь задач и запустишь их. Создашь QEventLoop и стартанешь его, после выполнения всех задач скажешь QEventLoop'у идти нахуй со своими ивентами.
Добрый вечер. Есть программа, где на исходном изображении мышкой выделяю некоторый контур и этот контур, как новое изображение загружается в новое окно. Сделал так:
private: System::Void pictureBox1_MouseUp(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) { if (isDrag) { isDrag = false; pictureBox1->Image = bmp1; Pen^ p = gcnew Pen(Color::White); Point endPoint = Point(e->X, e->Y); int width = endPoint.X - startPoint.X; int height = endPoint.Y - startPoint.Y; theRectangle = Rectangle(startPoint.X, startPoint.Y, width, height); g->DrawRectangle(p, theRectangle); endP = endPoint; } } private: System::Void button11_Click_1(System::Object^ sender, System::EventArgs^ e) { int W =bmp1->Width, H = bmp1->Height;
bmpF = gcnew Bitmap(W, H); for (int i = startPoint.X; i <= endP.X; i++) { for (int j = startPoint.Y; j <= endP.Y; j++) bmpF->SetPixel(i-startPoint.X, j-startPoint.Y, bmp1->GetPixel(i, j)); } pictureBox16->Image = bmpF; }
Как сделать, что бы этот контур можно было поворачивать? Что-то никак не могу разобраться.
Скиньте книг по multithreading, которые пояснят за устройство, концепции, что происходит на уровне ОС. Ну и картиночек бы еще, но эт необязательно. Пасиба.
Перекат пилить забота
Стала делом крестоёбов.
Только где взять стихоплётов?
Старший брат:
Предыдущий:
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-треды