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:
Дальше переходишь по ссылке, пробуешь отвечать на вопросы и понимаешь, что ты пока в самом начале пути. Кроличья нора крестов практически бездонна, поэтому продолжать постигать тонкости и детали можно очень и очень долго. В то же время, на этом этапе у тебя должно быть достаточно знаний, чтобы уверенно писать неплохой код. Поэтому читай исходники открытого софта и библиотек, отправляй пулл-реквесты в них, читай книжки по предметным областям и общим методикам разработки, а дальше уже сможешь запилить свой проект или вкатиться в существующий.
>>736878 >блять проебали юбилейный тред а оп наверно к нему особый стишок готовил или оп-пик рисовал Ути-пути какие мы нежные. Стишочек не завезли, картиночка не радует глаз - все, буду сидеть в бамплимите и кушать говно.
const string s = "Sap /pr"; for (auto &c : s){ /... / }
Написано, что для c выводится тип const char&. Почему? Разве auto не отбрасывает const? Или при амперсанде в деклараторе это будет low-level const?
И еще: тут s типа const string. В объектах типа string символы наверное хранятся как char массив или что-то типа того, а если это const string объект, то по идее как const char. Вопрос: каким образом при создании const string объекта внутри него char преобразуется в const char?
>>737146 >каким образом при создании const string объекта внутри него char преобразуется в const char? Никаким не преобразуется. У строки есть char begin() и const char begin() const. Компилятор видит, что строка константная, и выбирает последний вариант для итератора.
>>737146 1) С какого хуя auto что-то там должен отбрасывать? На его место просто подставляется таргетный тип. Отбрасывать const можно и нужно с помощью const_cast, а так же всегда можно сделать это через c-style или reinterpret_cast и выстрелить себе в ногу из жопы; 2) Открываешь реализацию итератора, смотришь что, как и с каким типом там возвращается; 3) Сука, если тебе не нужно менять символы - не передавай их по ссылке, на x64 это будет медленнее варианта с копированием лол.
>>737259 В стринге есть два переопределенных оператора [], один из них возвращает char&, другой просто char. В случае, если стринг не константный, то будет вызван первый оператор и вернется char&, во втором случае будет вызван второй оператор.
>>737380 Ну хорошо. У меня есть клиент-серверное приложение (чатик). У клиента есть сокет QTcpSocket Сервер унаследован от QTcpServer, содержит массив объектов клиентов, в каждом объекте - свой сокет QTcpSocket. Проблема в том, что если очень быстро отправлять сообщения с клиента - то они "зажевываются" на стороне клиента. Например, отправил 10 сообщений быстро - прошли хорошо, 11е - зажевалось. То есть оно застряло где-то в очереди к обработке сокета (signal readyRead) на стороне клиента. Самое интересное - при отправке 12го сообщения, обрабатывается 11е, а 12е - зажевывается, соответственно. И так далее. Вот, могу еще подробнее расписать, если кто-то с таким сталкивался
>>737383 110% проблема в твоём коде. Кури свою логику при обработке данных. Вероятно, она делает что-то не то, когда получено сразу несколько сообщений. Учитывая упоминание QThreadPool: внимательно кури порядок операций. Не может ли сложиться ситуация, что данные придут в тот момент, когда ты уже убедился, что их нет, но ещё не попросил систему уведомить тебя о поступлении новых.
Господа, есть одно поле в классе, double типа, и оно не инициализируется в конструкторе, т.е может быть инициализировано а может и нет (Об этом говорит ещё один dirty-flag)
Прикол весь в том что в случае когда оно не инициализировано - я не могу вызвать дефолтный оператор присваивания этого класса , вылетает Floating Point Exception (Underflow error), именно присваивания, я не пытаюсь с этим мусором проводить арифметическую операцию. И что ещё характерно - это только в x86 билде вылетает, в x64 всё нормально.
Т.е в операторе присваивания крешится на месте this->doubleField = that.doubleField
Сталкивались с таким? Природа явления не ясна для меня.
>>737425 Ну я так не могу делать по определённым причинам. Легаси код, всё такое.
Короче мне больше интересно почему ошибка возникает при присваивании, в моём понимании она должна произойти при попытке произвести какую-то арифметическую операцию.
начал изучать с++, сильно не пинать Есть длинный список названий: ООО Пики и Хуи ОАО Пики точены АОА Хуи дрочены и тд.
Этот список можно запихать в массив из текстового файла - не подходит так как файл всегда открыт для правки. Можно сразу в коде запихнуть в массив - тоже не удобно так как списков много разных больших и маленьких. Так вот вопрос: можно ли этот список добавить к коду как дополнительный ресурс и уже из него брать необходимое? Может криво объяснил, поправьте.
>>737446 Я вообще нихуя не понял ни твоей проблемы, ни что ты хочешь сделать, но попробую выстрелить в небо: в чём проблема использовать вектор или любой другой динамический контейнер?
>>737446 Тебе в Qt - там есть ресурсы. Будешь открывать свой файл как "qrc://zalupa.txt", а на деле он будет вкомпилен в твою прогу и никто его не отредактирует.
>>737446 Если С++11, то можно его тупо заинклудить. Добавь в начале файла const char @str = R"(, а в конце )"; Если нет - то xxd и objcopy тебе в помощь.
>>737479 Текст будет в отдельном файле, который вкомпилится в экзешник, обращение к нему через строковую константу. После запуска ты читаешь эту константу, разбиваешь на строки, пихаешь в массив. Думаю, тебе проще скриптик написать, который читает текстовый файл и генерирует massiv.cpp, и запускать его через твою систему сборки.
>>737393 Капитан, вначале срабатывает сигнал о новом сообщении, только после этого я запихиваю его в тред. >>737438 Ничего такого, делаю для себя. Держи, приложил скомпилированные экзешники, если кьют не стоит. p.s. Я уверен, я много что сделал неправильно. Алсо, я нашел интересный баг, что если сокет создать в тред пуле, то он отказывается работать напрочь. Поэтому пришлось коннектить клиенты в основном потоке. http://rgho.st/88KXVZj6C
33 и 34ая строка - уже сделал отдельную переменную, один хуй не понимаю в чем проблема.
Есть два вектора, которые держат две технически идентичные (но разные для восприятия) структуры. Забиты в одном файле, если важно.
Выделяю под них место, получая инфу с базы. Для первого - все проходит нормально - приходит значение "4", на "4" и расширяется.
Со вторым все идет через хуй пойми как. Он выбирает даты. Даты выбираются как обычно для qDate (daysTo) - значение "1" - все ок, capacity == 1 Но если значение больше 2 - начинается пиздец.
В функции и в конструкторе выводится "2" - он генерит "4" В функции и в конструкторе выводится "32" - он генерит "41"
В чем беда - вообще хуй знает. Объявлены глобально в хедере, без указателей и переобъявлений - проверил.
Помимо resize пробовал еще reserve - та же ситуация
>>737642 Ёбаная сука! Говномесный пидорас! Сдохни тварь! Сдохни и не пиши больше! Мои глаза, мои бедные глаза, зачем они видели ЭТО?!
Да, блядь, да. Ебай в assistant, сука, читай, блядь, что там пишут!
reserve - резервирует место, но не создаёт элементы. rеsize - изменяет размер, т.е. и резервирует и создаёт. Может зарезервировать дохуя больше, чем ты просил. Потому что он, сука, умнее тебя и знает как выделяется память. size - размер, т.е. количество созданных элементов capacity - ёмкость, т.е. сколько памяти зарезервировано. capacity >= size всегда!
>>737517 В твоём коде говна больше чем кода. Я открыл один только сервер.цпп и уже в шоке.
Вот пара примеров: ты делаешь waitForReadyRead с ТАЙМАУТОМ БЛЯДЬ! НО НЕ ПРОВЕРЯЕШЬ РЕЗУЛЬТАТ. А что если ничего не придёт и таймаут случится? ты используешь QDataStream для чтения из сокета. А с чего ты взял, что там достаточно данных для того, чтобы эта операция не вызывала блокировок и читалала то что надо?
>>737677 Шпокойней-шпокойней. Помимо таких профессионалов как ты есть и те, кому просто интересно поколупаться. И они таки могут совершать ошибки, особенно на первых порах. Вспомни себя, к примеру.
Хотя о чем это я, ты же родился с клавиатурой в зубах, конпелятор у тебя в голове встроенный, с первого раза все делаешь без ошибок и вообще - не тупишь никогда по определению
>>737821 Потому, что мне в очередной раз придется объяснять шефу, что наша новая стажерка-программистка(!) с КРАСНЫМ, блядь, диплом технического ВУЗа не знает "как установить STL в IDE" и что надо было ее принимать на должность кассира или секретаря (только зачем нам третья секретутка в одном офисе).
>>737710 Я был: последовательней (куда браться за многопоточку, если в тривиальных вещах ошибки) читал учебники и доки
Да-да доки. Там ангельским текстом для простых смертных заветы по использованию API написаны.
ПыСы. Поколупаться - профанация, что есть грешно и караться должно без жалости. Профаны вылезают на рынок и сбивают цену. Затрудняют работу. И подбирать людей и самому работу из-за них менять сложнее.
К тебе пришел после гугла, с его советов использую такую конструкцию: #include <sstream> float hp; ostringstream hpOS; for() { hpOS << hp; //использую hpOS hpOst.str(""); }
Терпимо стакается с utf8, с помощью такой мерзости как >File.imbue(locale(locale(), new codecvt_utf8<wchar_t>())); киррилица вперемешку с нужными данными исправно отправляется в файл (по крайней мере под виндой).
Вопросы: 1.многовато действий для преобразования, есть варианты проще? 2.как вывести один знак после запятой?
Может кто пояснить, про указатели в ассемблере? Допустим есть строка Mas, состоящая из пяти однобайтовых символов. Нужно заменить все символы, кроме латиницы на какой-то другой символ, допустим / Вот просто для примера набросал код через указатель И не совсем понимаю, почему он не работает без указателя, с обычным Mas[cx] я уже решил http://pastebin.com/PfAzVFdf
Во-первых, если количество итераций и количество знаков без учёта служебного $ совпадает, он внезапно выдаёт мне на один знак больше, а потом ещё и пихает мусор, т.е. явно стирается последний служебний символ, хз по какой причине, ведь итерации всего 2. Во-вторых, если хоть раз встретится не латиница, он будет заменять любые следующие символы на /.
>>737872 >последовательней Каким бы ты последовательным не был, прочти тот спойлер, особенно строчку про "никогда не тупишь".
Учебники и доки читаю по мере необходимости использования того или иного функционала, но этот момент пропустил - не отрицаю этого. Объяснил - и на том спасибо.
>Вылезают на рынок
За всех не говори - лично я не вылезаю. У меня и так есть работа, не связанная с погромированием, пишу "в стол" (а точнее для того чтобы помочь себе самому, а не СТАРТАП ЛАЙФХАК МАНИ ХИПСТЕР АЙФОН
Шапку читал, вопрос имею. Для практически полного нюфани кресты подходят как первый серьезный язык программирования? Какая лучшая книга есть на русском с задачами в конце каждой главы?
>>738068 Как это не имеет значения? Ты двигаешь указатель на один байт, а читаешь/пишешь слово. А еще эти слова пересекаются. А еще при записи слова в позицию последнего символа затирается ноль (ограничитель строки).
Короче, просто поправь на >byte ptr и не доказывай, что и "так должно работать".
>>738158 Бля, затупил, мне показалось, что массив однобайтный, потом посмотрел, показалось, что двухбайтный, написал решение для двухбайтного и в итоге он всё-таки был однобайтным.
int main(){ int array[10]; cout << array1[9] << '\n'; cout << array[9]; }
Почему в array1 все элементы равны нулю, а в array они рандомны? Понимаю, что array1 глобальный. Но в книге написано, что элементы массивов инициализируются по умолчанию (а для int это 0) вне зависимости от нахождения массива. Поясните за это плокс
>>738287 Глобальные элементы и статики инициализируются в нули, а локальные нестатики содержат мусор, так и есть по стандарту. Сам об этом узнал только недавно, благодаря тесту из шапки, хотя считал, что всегда должен быть мусор.
>>738205 И много знать из области математики и геометрии нужно? >>738287 Судя по всему, внутри функции массив только объявляется, то есть под него выделяется память, а вот вне идёт ещё и инициализация. Скорее всего какие-нибудь ебанутые технческие ограничения.
>>738293 >И много знать из области математики и геометрии нужно? Для графики - линейка в объеме первого курса, но ее нужно очень хорошо понимать. Теормех-гидродинамика для физона.
>>738454 >Для графики - линейка в объеме первого курса Полистал уже книжку, вижу, правду говоришь. >но ее нужно очень хорошо понимать С пониманием у меня проблем почти никогда не возникает. Понимать-то я её понимал, весьма простая штука, но вот если бы в институте оценки за понимание ставили. >Теормех-гидродинамика для физона. А вот это может стать серьёзным препятствием.
Поясните кто нибудь за именование методов классов.
Чому во всех нотациях их называют начиная с m_ или заканчиваю подчёркиванием? Чому нельзя в конструкторе через this как в яве инициализировать и не издеваться над глазами?
>>738473 m_ - member >Чому нельзя в конструкторе через this как в яве инициализировать и не издеваться над глазами? Тебе кто-то запрещает и пиздит тебя палкой, если ты это сделаешь?
>>738478 >Тебе кто-то запрещает и пиздит тебя палкой, если ты это сделаешь? Именно это и сделают если закоммичу куда нибудь или в команде с устоявшимся кодстайлом буду писать "отсебятину".
>>738462 >А вот это может стать серьёзным препятствием Да не станет, не парься. Там все просто. Когда конкретные вещи делать начнешь - сразу станет ясно какие знание нужны, нагуглишь и выучишь.
>>738473 >Чому нельзя в конструкторе через this как в яве инициализировать и не издеваться над глазами? Можно, но тогда тебе придется геттеры называть getHuita, как в джаве, что гораздо заебнее.
Почаны. Я ньюфаг (иду нахуй). Я хочу чтобы мое приложение дебаг мессаджи показывало в отдельной консоли (в нескольких отдельных для разных вещей). Я понимаю, что мне нужно из родительского приложения запускать процессы консолей, но ума не приложу как организовать между ними обмен данных. Хочется чтобы в родительском приложении был интерфейс типа void OpenConsole( enum target ); void MakeEntry( enum target, char* message ); то есть никаких наворотов. Таргет это целевая консоль, их ограниченный список. Как мне в процессе с таргет консолью принимать эти мессаджи из родительского? Напоминаю: я ньюфаг и хуй.
>>739639 Расскажи, что реально вы хотите увидеть в кандидате. Я уже не раз сталкивался, что по описанию я 100% подхожу, а когда дело доходит до приглашения на интервью, то "ой, а у вас еще <то, чего не было в вакансии> нет" или "ой а у вас слишком специфический опыт".
Еще мне интересен требуемый уровень английского. У меня он не fluent, но говорить могу.
>>739639 1.5+ года в С++, оверолл 6+ в айти(суровый саппорт). Жил\работал в Швеции пару месяцев, теперь хочу в Европку на ПМЖ, английский свободный разговорный. По уровню сказал бы, что между джуном и мидлом, не долбоеб. Есть шансы?
>>739649 знание плюсов: от низкоуровнего кода до метапрограммирования. gtest/gmock. Linux environment. English upper mediate и выше. придется много общаться с голландцами и немцами.
Почему begin() и end(), также как и range for использовать с array можно, а с array1 нет? Ведь array это же тоже int. И где прочитать про то, почему именно так продизайнили, не как, а именно почему, с какой целью. В стандарте это есть?
>>739662 Потому что array это массив, для него известна длина и компилятор может сгенерировать end() для него. array1 это просто указатель. Неизвестно даже указывает он вообще именно на буфер или просто на одно значение. И не известен размер буфера - следовательно невозможно сгенерировть end().
>>739678 Спасибо за ответ. Но array ведь тоже преобразовывается в "просто указатель". Или компилятор помечает этот указатель каким-то образом , видя [10] (я чую опять неочевидную хуйню)?
>>739694 рефервл бонус дают тому, кто привел нового сотрудника. просто вполне возможно что я буду тех собеседование проводить. и мое решение будет влиять на результат.
>>739710 у меня нет опыта с железом. Это статический анализ железнячих проектов. Там был отдельная команда hardware-разработчиков, которые объясняли software-dev'ам, что какие фичи нужно пилить.
Ну может вы мне тогда скажите, какого хуя VS15 не видит WNDCLASS? VS10 видит, а эта сука нет. Выебывается еще, в WinUser.h кидает объявление в неактивный блок неактивный блок препроцессора!
Привет илитарии, нужена ваша помощь. Сам ниразу не программист, просто интересно программирование и пилю прогу для себя.
По делу. Есть словарь примерного вида - 2 байта - номер параметра, 2 байта - длина байт значения этого параметра в бд, 1 байт - тип данных в бд(параметр может быть записан как long, float, int, char[n]), 20 байт - название. Всего 200 параметров.
Теперь по базе данных. Первые 15 байт одинаковая информация для каждой строки (длина этой строки в байтах, ключевой параметр и пр.), далее следует анал-карнавал - 1 байт номер параметра в справочнике, потом длина байт для значения по справочнику и так идет до конца строки, затем опять новая строка, где первые 15 байт практически идентичны 15 байтам предидущей строки, дальше снова идут параметры в таком же виде. Всего в строке может быть от 1 до 200 параметров. Количество строк с параметрами не ограничено. Проблема возникла со считыванием данных. Конечно, можно создать структуру со всеми 200 параметрами и просто заполнять в нее каждую строку и закидывать эти структуры в массив, но жалко тратить память на неиспользуемые параметры. Массив ассоциативных массивов создавать тоже не вариант, параметры в строках разного типа.
>>739766 > Массив ассоциативных массивов создавать тоже не вариант, параметры в строках разного типа Это самый норм вариант, если я правильно тебя понял. Тебе нужно создать класс Параметр и хранить в ассоциативном массиве его. А от этого класса уже отнаследовать все возможные типы.
>>739802 Это плохая архитектура, потому что когда ты пытаешься делать доступ по интерфейсу к разнотипным объектам, остается только пересечение. Лучше сделать, чтобы метод ему возвращал что-то типа maybe, ну или бросал исключение, если элементы отсутствуют совсем редко.
Вроде 3 действия, но char buf можно оставить в глобале и забыть.
Попытался впилить тоже самое через to_string: float hp = 289.6965416518; int precision = 10; float dhp = floor(huita * precision + .5) / precision; string sHp = to_string(hp); life_bar_tooltip.setString("hp:" + sHp);
Минимум 3 действия. Ибо в sHp сохраняются на конце нули, тянущиеся после округления. Не найду как избавиться без костылей. Даже если получится, возможно что это будет проще, чем вариант с массивом символов?
До чего же ваши кресты медленная пораша. Посмотрите только сколько ассемблерных действий происходит во время выделения памяти под указатель: x = new int; И вы еще при этом утверждаете, что оптимизирующие компиляторы все сами сделают, что кресты быстрый язык, пидоры.
>>736493 (OP) >Кроличья нора крестов практически бездонна, поэтому продолжать постигать тонкости и детали можно очень и очень долго. Действительно, кошмарный язык для пердоленья, а не программирования.
>>741082 >кроссплатформенности Поддерживает всё, под что работает (и будет работать) бэкэнд LLVM. Хотя учитывая что плюсы используют только на десктопе и серверах – всё что уже нужно. С остальным – ну в принципе да, хотя 2/3 плюсовых тулзов там вообще не нужно.
>>741094 >В микроконтроллерах – нет Давно уже да, особенно на 32-битных. В любом случае, с крестами пердолится надо в разы меньше, чтобы что-то собрать под нужную платформу.
>>741097 Когда я с ними сталкивался успел запомить разве что свежий запах самописных сишных компиляторов, с которыми половину приходилось писать на асме – пердолинга было меньше. Сейчас-то что нибудь изменилось? Прям где-то нормальная поддержка плюсов а не си с классами?
>>741099 >свежий запах самописных сишных компиляторов Gcc есть сейчас почти для всего. Для остального плюсы и не нужны. >нормальная поддержка плюсов Стандартной библиотеки часто нет.
>>739662 У них разные типы. У array тип int[10], а у array1 тип int*. Во второй строчке происходит неявное преобразование. Для первого типа begin() и end() определены, для второго -- нет. Почему -- тут >>739678 уже расписали.
Вопрос от нубаАноним13/05/16 Птн 09:36:27#212№742026
Почему наследник приводится к базовому классу неявно, а базовый класс к наследнику - явно? Ведь наследник как бы содержит в себе базовый класс и по идее приведение базового класса к наследнику должно быть неявным. И вообще дайте подробности про приведения. Спасибо.
>>742026 Ну смотри, есть у тебя два класса class A { public: -- }
class B: public A { public: -- protected: int lolka; }
Если ты приведешь A к B, то в A::lolka у тебя будет мусор, а если попытаешься чему-нибудь присвоить, то вообще можешь затереть чью-то память или что-то сломать. По-моему, приводить базовый к наследнику это вообще вандализм и неправильно, так не должно быть никогда. >И вообще дайте подробности про приведения. Что именно тебе о них хочется узнать? Неужели мало инфы?
>>742080 Размер size_t на каждой конкретной системе подобран таким образом что он заведомо больше размеров любого буфера памяти который возможно выделить на этой системе. Тоесть храня смещения в памяти с помощью size_t ты никогда не получишь переполнения, его всегда хватит. Что для других типов не гарантируется.
>>742071 > Если ты приведешь A к B, то в A::lolka у тебя будет мусор Т.е. при приведении память для А как-то перевыделится? Интересует как оно внутри устроено
>>742149 Нет, просто память по адресу А будет использоваться как для типа B, при том что выделена под А. Короче, это как напялить обувь другого размера. Вроде сидит, но либо болтается, либо жмёт.
>>742149 Нихуя не перевыделится. До каста будет считаться что объект лежит в 16 (к примеру) байтах. После каста будет считаться что объект лежит в 16 плюс следующие 32 (к примеру) байта. А так как те 32 байта от левой хуйни то ничего хорошего из этого не получится.
>>742149 Ничего не перевыделяется, просто указатель после преобразования смещается на некоторое количество байт. Например, если есть struct A : B, C {}, то в памяти будут расположены сначала поля B, потом C, потом то, что добавляет А. Если тебе нужно скастовать A в C, то указатель будет считаться как указатель на А плюс размер В.
>>742165 >>742173 Спасибо, теперь понятно, просто я немного идиот. >>742174 Получается неявно и A к В или С не приведется? Или неправильно приведется? P.S. от копма далеко не проверю.
>>742223 Хм, тогда как вообще адресация по членам класса происходит? Если с помощью смещения, то проблемы приведения базового к дочернему тоже нет. У дочернего сначала идут поля базового класса, потом свои. При обращении к полям базового они будут в начале все ок, а при обращении к не существующим - ошибка, такая же как и при обращении из базового к дочерним.
>>742271 1. Для чего нужен .NET Framework, и какую версию его лучше юзать? У меня по дефолту стоит 4.5.2, но там есть 4.6.0. 2. Я по вашему совету скачал Вижуал Студию, сделал в ней хеллоу ворлд, а он не запускается. Вернее, запускается какое-то окно на 0.1 секунды. Что я не так делаю?
>>742291 Я не знаю как в памяти хранится. Я бы хранил так сначал A, потом все что от B (без А), потом все что от С (без А). А в начале смещение не нужно все ок. Если приводить B к D, то опять все ок со смещением (AB все по порядку и в B и D), а вот с приведением С к D наверное были бы проблемы. Но я думаю так сделали не только из-за этого, наверное будут какие-то проблемы с вызовом методов, просто я тупой и не могу понять какие.
>>742308 Открываешь свою любимую IDE, подключаешь хэдер set/map/queue, создаешь переменную нужного типа, тыкаешь правой кнопкой мыши по ее типу и выбираешь что-то вроде "перейти к определению".
>>742273 >добавь system("PAUSE"); перед return 0 Вот за такое в любом приличном месте пиздят клавиатурой по еблу. Студия дала вам настройку подсистемы, установи SUBSYSTEM:Console! Не хочу, хочу писать костыли. Небось еще локаль выставляешь каждый раз изнутри кода?
>>742333 Слушай, для новичка дописать одну строчку явно проще, чем лазить в настройках IDE и чего-то там ковырять для того, чтобы консолька не закрывалась при завершении программы.
А клавиатурой по еблу пиздят чаще тех, кто в приличных местах выебывается вместо того, чтобы вежливо посоветовать более оптимальное решение.
>>742389 Давно не писал на сишко и крестопараше, но мой шиндовариант привлекал тем, что можно было PRESS ANY KEY TO CONTINUE, а в твоем обязательно жмякать ентер. Не знаю почему, меня это раздражало.
>>742467 >Если у тебя есть конкретные цели и задачи - забей вообще и пиши на самом подходящем инструменте Ну у меня есть цели: >>742458 >писать программы и игры А на счёт инструмента я не определился.
>>742471 Для тебя самый лучший путь - выбрать наиболее популярный инструмент для решения твоих задач, к которому полно документации, "живых" библиотек, активное сообщество. >писать программы и игры Какие программы и игры? Что-нибудь совсем незамысловатое можно и на том же пистоне наваять.
>>742490 >Степанова и Александерску Ну вот зачем ты его дезинформируешь-то? У Степанова вообще все книжки про теорию CS, всякие там преобразования орбит, а про STL у него только старые статьи, да и те написаны до фактической стандартизации шаблонов. У Александреску шаблоны - средство, а не цель, а книга про проектирование. >>742494 >>742488 Если тебе интересны непосредственно шаблоны как механизм, а не их приложения (обобщенность, метапрограммирование), то юзай Вандевурда-Джоссатиса из шапки.
>>742494 Не пробуй Александреску, ты либо сломаешь мозг и начнешь писать теплейтами как он, либо просто продолжишь пользоваться ими как все нормальные люди.
>>742520 Просто я не видел ниодного реального проекта или задачи, где нужно было извращаться с метапрограммированием. Как только я увижу что для какой-то задачи метапрограммированние на шаблонах лучше чем что-то еще, я изменю свое мнение. Но скорее всего для этой задачи я просто возьму какой-нибудь другой язык
>>742524 Самый такой элементарный пример. Процентов 50 кода, который ты пишешь каждый день - всякие конструкторы, инициализаторы, копирование, перегруженные операторы, проверки инвариантов, гарантии безопасности исключений, виртуальность деструктора, синглтоновость etc, можно написать один раз и вынести в стратегии. Сразу долой огромное количество ошибок и потенциальных выстрелов в ногу из-за того, что ты забыл что-то явно указать. Просто наследуешься от нужных стратегий и пишешь только код по существу.
>>742541 50% кода который я пишу каждый день это не конструкторы и т.д. что ты там написал. Я не создаю классы половину своего рабочего времени, максимум 2 раза в месяц для какой-то новой функциональности наследуюсь и переопределяю методы. Я честно не помню когда что-либо приходилось писать прям с нуля.
>>742544 На мой взгляд, единственной меркой качества языка является его успешность. Если D не выстрелил, значит, с ним что-то не так. Можно сколько угодно кукарекать про тонны крестового легаси и отсутствие пиара, но факт остается фактом - если язык не используется, то идиотизмом будет вкатываться в него всерьез. Мы тут не шутки шутим, надо работать, а не заниматься бета-тестированием для веселых румынов, обивая пороги на SO в поисках ответов на элементарные вопросы.
>>742550 >обивая пороги на SO в поисках ответов на элементарные вопросы. А в крестах не обиваешь, лол?
>будет вкатываться в него всерьез Это не кресты. В него "вкатиться всерьез" можно за неделю, бо не нужно заучивать поведение говна и выстрелов в ногу и механизмы костылей. Он просто работает.
>>742546 Понимаю, поэтому я и не говорю об универсальности. Зачастую ты берешь либы/фреймворки и пишешь просто логику, опираясь на их структуру. Но когда ты сам пишешь либу/фреймворк или занимаешься непосредственно проектированием кода, то полезность шаблонов трудно переоценить.
>>742549 Объясняю как обстоит дело на рынке. Ты либо приходишь в проект, либо начинаешь проект. Приходишь ты в проект на язык который знаешь, этот вариант рассматривать не будем. Начинаешь ты проект на любом языке и к тебе идут люди со знанием этого языка. А теперь ответь сколько людей знают Д? А яву? А кресты?
Здравствуй, Маленький Принц. Представим, что твоему барашку стало одиноко. И ты попросил нарисовать ему друзей. Ты выделил для барашков целую планету (точнее, астероид) по соседству. Эта планета — доступная память. Вся она уставлена коробочками, в которых будут жить барашки. Чтобы не запутаться, все коробочки пронумерованы. Коробочки — это ячейки памяти. Барашек в коробочке — это данные. Допустим, что попался какой-то особо упитанный барашек. Ему понадобится две коробочки. Или даже больше. Барашек — неделимая структура (для нас с тобой, Маленький Принц, это точно так), а коробочки идут подряд. Нет ничего проще. Мы вынимает стенки между двумя рядом стоящими коробочками и кладем туда барашка. Места в коробочке не очень много. И барашек не может свободно развернуться. Поэтому мы всегда знаем, где его голова, а где хвост. И если нам что-то нужно будет сказать барашку, мы обратимся к той коробочке, где у него голова.
>>742555 А сколько нужно людей, чтобы писать на яве или крестах? А читаемость кода?
А если смотреть, за сколько времени он учится - то тут он на пару порядков уделает кресты с жабой. Собсно это и есть помесь крестов и жабы минус стрельба по ногам.
Анончики, не могу справиться с элементарным алгортимом. Задача типа ХЕШИРОВАНИЯ: Есть эта самая таблица (вектор структур), которую я считываю из файла, имеющего размер size. Считывая из файла с помощью функции получаю ключ (номер элемента массива), моя задача забить этот массив линейно, с определенным шагом. Т.е. если ячейка массива уже занята - двигаюсь дальше на шаг и так до конца. Когда дохожу до конца - начинаю искать место сначала и до этой ячейки. Последовательность действий: Разбил ее на две функции. Первая 1. Проверяю вектор на заполненность, если пустых ячеек нет - делаю resize на step 2. Проверяю размер ключа, если он больше, либо равен размеру вектора - присваиваю ключу ноль 3. Вызываю основную функцию заполнения вектора, передавая в нее ключ, данные и размер вектора (потом станет понятно зачем)
Вторая функция 1. Начинаю искать место для ключа, проверяя свободна ли эта ячейка или нет, если занята - увеличиваю шаг и проверяю пока не дойду до конца (того самого размера массива). Помимо этого есть булевская переменная которая при нахождении места для ключа дает ТРУ. 2. Проверяю ТРУ ИЛИ НЕ ТРУ. Если не тру: вызываю функцию рекурсивно, передавая в качестве ключа 0 (ищем теперь не с ключа, а сначала), а в качестве размера поиска (в пред пункте размер массива) я передаю ключ, чтобы не повторять действия выполненные в пункте 1
Так вот, хуйня в том, что если мой массив будет размером и колвом элементов n, то с шагом равным 1 он забьет этот массив, все заебись. Даже если я увеличу кол-во элементов - он ресайзнется, норм работает в общем, НО, если я делаю шаг равным 2 - ломается нахуй. Проблемы с выделением памяти.
В чем мой алгоритм плох? С хуя он выходил за рамки, если по идее сделав шаг, который в сумме даст размер больший n - я просто начну искать место сначала, а проверка на забитость у меня еще до заполнения.
>>742550 Я тебе сейчас секрет открою: ди и без того используется в крупных проектах. Та же Remedy использует его не один год во всех своих ААА проектах.
>>742554 Ну возможно, спорить не буду. Просто даже в наших велосипедных самописных либах я не встречал шаблонов, кроме как для написания своих контейнеров. Просто от Александреску у меня сложилось впечатление что он все пишет только на шаблонах трудно читаемый код и никак иначе.
>>742553 >А в крестах не обиваешь, лол? В крестах накоплено огромное количество знаний, на поиск ответов уходят секунды. >В него "вкатиться всерьез" можно за неделю Я подразумеваю не освоение языка, а переход на него в реальной работе. Нужен софт, нужны хорошие практики, нужны набитые шишки, в конце концов. А их нет. Поэтому тот, кто начнет серьезный проект на D, будет как раз набивать шишки и нарабатывать опыт для себя и других. А можно потратить это время и силы по существу, если не сходить с проторенной дороги без необходимости.
>>742564 >В крестах накоплено огромное количество знаний, на поиск ответов уходят секунды. А в D эти знания тупо не нужны. Там просто есть стандартная библиотека, в которой есть все что нужно. И в средствах языка есть абсолютно все, что нужно. Там не нужно искать "как накостылить то или это". Там не нужен буст. Чтобы на нем кодить - не нужен SO вообще, и гуглить какие-то костыли. Достаточно просто прочитать доку к его библиотеке.
>Нужен софт, нужны хорошие практики Блин - это просто улучшенные жабокресты. Юзаешь те же самые практики, просто минус костыли. Там не нужно блин читать стопицот книжек по тонкостям шаблонов как в крестах - потому что там шаблоны пишутся нормально.
>>742559 Простота языка еще никогда не позволяла сажать макак на места сениоров. В любом случае макаки будут решать свои задачи, а специалисты - свои. Возможно, их жизнь будет легче, но кого это ебет, если ты банально не сможешь найти столько людей?
>>742559 Количество людей зависит от размера проекта. Я просто не могу поверить, что для написания какого-нибудь интерпрайза с одинаковым функционалом людей со знанием ди нужно в два (3, 4 и т.д) раз меньше, хотя бы потому что на ди не написано столько фреймворков на все случаи жизни
>>742581 Для ди просто не нужны фреймворки, лол. Там просто есть нормальная стандартная библиотека. 90% того, что пилят Qt или буст - там или встроено в язык, или в библиотеку.
Это в крестах - сколько там вариантов строк? std::string, char*, QString, cv::string, что-то из буста для питона? Кто больше вспомнит?
То же самое для массивов, умных указателей, неба и аллаха.
>>742588 Жди, может начнут пилить для ди свои фремворки, обертки над стандартной библиотекой и там все это появится. Ведь программисты любят писать свои велосипеды
аноны, есть тут такие же всратые как я, которые не могли понять списки и деревья? дайте какой-нибудь гайд понятный. курю джесса либерти "с++ за 21 день бесплатно без смс", но там пример охуевший. суть то ясна, все просто, но вот как создавать их, добавлять, как-либо упорядочивать их, етс?
>>742596 Ну они там есть. Vibe.d К примеру, что-то вроде RoR, для сайтиков.
Но в отличие от него, кресты в голом виде неюзабельны - нужно обязательно накатывать Qt или буст, чтобы их уже как то юзать. А они реализуют пересекающуюся функциональность.
>>742599 Чтобы понять деревья, нужно знать основы теории графов, это несложно на самом деле, больше учить новые термины. Списки ещё легче. Вообще берешь любую книгу по дискретке или алгоритмам, находишь главы про структуры данных, графы, и читаешь. Там всё это есть.
>>742577 Это что-то уровня аргумента хаскеллистов про "если собралось, то 99% работает правильно". Давай по пунктам:
1. Я использую VS с кучей плюшек, наподобие визуальной отладки. Что может предложить инфраструктура D, чтобы погроммист получил сравнимые удобства? Сколько всего IDE для D и какова вероятность, что каждый сможет перекатиться со своей IDE на новую, не прожигая стул от ее ущербности? 2. Я хочу сделать хитровыебанную хуйню, которой точно нет в стандартных библиотеках. Сортировать графы графов аудиокодеков, епту. В крестах я гуглю и нахожу стороннюю либу в 99% случаев. В скольки процентах случаев я найду таковую на D? Сколько денег понадобится на содержание дополнительных макак, ответственных за прикручивание библиотек из других языков к D? Что делать с принципиально непробрасываемыми вещами типа тестовых фреймворков?
>>742611 >Сколько всего IDE для D и какова вероятность, что каждый сможет перекатиться со своей IDE на новую, не прожигая стул от ее ущербности? Нормальных две - плагин для идеи, и плагин для xamarin studio - monodevelop (эта мне нравится больше). Есть еще плагин для визуалстудии, но его я не пробовал, потому как у меня линупс, а она не кроссплатформенная. Есть еще на эклипсе - мне не понравилась, вариант для KDevelop (только линупс + вечная альфаверсия, не рассматриваю), плюс велосипеды написаные на самом себе.
>Сортировать графы графов аудиокодеков, епту. Тут охрененная стандартная библиотека, в частности - охрененные шаблоны. Сортируй что хочешь, просто заинклудь std.algorythm и хоть обдрочись, там реально все на все случаи жизни. >В скольки процентах случаев я найду таковую на D? Что именно например?
И да - ди просто может юзать сишные и крестовые либы, они совместимы.
>Что делать с принципиально непробрасываемыми вещами типа тестовых фреймворков? Юниттесты уже встроены в язык и систему сборки. И еще какие-то контракты, их я не пробовал.
>>742611 > Сколько всего IDE для D и какова вероятность Как минимум 2 полноценные (1 из них плагин к студии), т.е. как и у плюсов - либо божественные и тормозящие одновременно цлион и студия, либо инвалиды вроде креатора, которые пидорасятся от любого более менее хитровыебаного кода. >ответственных за прикручивание библиотек из других языков к D Там всё что нужно прикручивается из тех же плюсов копипастой с минимальным рефакторингом и 1 лишней строчкой кода. >Что делать с принципиально непробрасываемыми вещами типа тестовых фреймворков? Непереносимые вещи лучше оставить там, где они были изначально. Если ты изначально брал чужую библиотеку - сомневаюсь, что горишь желанием её редактировать.
>>742619 Вот именно, что описал весь алгоритм. Какие могут быть проблемы с ресайзом? Проблема видимо в алгоритме, возможно где-то просчитался или что-то забыл
>>742622 >И да - ди просто может юзать сишные и крестовые либы, они совместимы. А про сишку - и вовсе считай надмножество сишки, там как часть стандартной библиотеки - запендюрена как import core.stdc. Плюс платформозависимые вещи для упарывания сисколлами, posix-хуесикс.
>>742630 Это вообще просто. Грубо говоря ты хранишь значение и указатель на следующий элемент, при добавлении элемента делаешь new, при удалении бегишь в конец и удаляешь, потом снова, пока так все не удалишь. Сортировать можешь хоть пузырьком, просто указатели устанавливаешь на другие элементы
>>742622 >>742623 Хорошо, все-таки неправильно будет на такое писать возражения с дивана. Я попробую заюзать анонсированное тобой, и потом сможем более аргументированно посраться, если захочешь.
>>742640 У крестогоспод ifstream сам открывает файл в нужном режиме, сам приводит прочитанные куски файла к нужному виду? нихуя себе йоба, а я в жопу пердолился с няшной чистой
>>742695 Количество проектов, обсуждение языка. На хипстерском го много кода, много статей, все о нем говорят, на том же хабре ни дня без статьи про го, а про Ди я вообще ничего не слышу
>>742702 Зачем тебе это, это сродни дрочки на количество подписчиков на ютабе?
>>742703 Но при этом ди гораздо лучше хипсторского го. Го пиарит гугл, го - типо "инновация". Дишка - же просто "кресты 2.0". Его никто не учит с нуля - не модно. На него только с крестов спрыгивают.
>>742706 Мне кажется не особо как-то спрыгивают. Никто не будет перписывать старый код, да и вообще народ как-то с опаской смотрит на Ди, как и на раст.
>>742640 AddInTable(0, name, number, key); Под конец у тебя key будет >= last, и если он не найдет элемент за один проход, а потом еще и за второй, то выйдет за пределы при проверке. Видимо, ты хотел сделать от 0 до изначального key, тогда тебе в начало функции надо вставить что-то вроде const int originalKey = key; и затем делать AddInTable(0, name, number, originalKey);
>>742710 Паскаль тоже преподают, по твоей логике все должны писать на нем тоже. Жабу и похапе не преподают, почему же они в топе? Хуевый аргумент, короче, не находишь?
>>742863 Херню несешь. Жабу преподают массово что в западных универах, что у нас. Да и насчет паскаля ты не ошибся - дельфи еще дохрена где остался. Но все так же - старый код.
>>742639 есть static library (.lib, содержащая бинарный код) есть dynamic library (dll) dll, в свою очередь можно линковать двумя способами - implicit (статически) и в рантайме explicit(на самом деле смособов больше, есть еще отложенная) для implicit linking тебе тоже потребуется .lib файл, но только с секцией экспорта, те она работает как библиотека импорта здесь, а не как хранилище оттранслированого бинарного кода
Все работает, вычисляет в несколько потоков. Но преподаватель хочет, чтобы считало другим методом, например, через другие ряды https://ru.wikipedia.org/wiki/Пи_(число). Как это реализовать?
>>742959 А в чем проблема? Берешь любой ряд и пусть каждый процессор вычисляет свой кусок этого ряда. Все члены ряда зависят только от своего индекса, от соседних членов не зависят, поэтому проблем с распараллеливанием здесь нет никаких.
Ты не можешь найти кусок в коде, где происходит вычисление кусочка ряда (он, между прочим, откомментирован и там это место обозначено) и подменить одну формулу на другую?
>>743047 Ну так почитай и разберись. Когда у тебя возникнут конкретные вопросы — тогда приходи, поможем.
Честное слово, я не против помочь человеку, который пытается разобраться, но на чем-то застрял, но мне дико бомбит от халявщиков, которые ничего читать и гуглить не хотят, а желают, чтобы им на блюдечке готовые решения давали. «Я раньше с Х не сталкивался и не работал» — это не оправдание. Все мы раньше не сталкивались и не работал ни с чем, но как-то разобрались, знаешь.
Ресурсы по плюсам есть в шапке, про mpi можешь почитать, например, тут https://habrahabr.ru/post/121925/ или про любой другой ссылке в гугле про запросу "c++ mpi". Удачи.
>>743624 Во-первых, отладчиком пройдись и посмотри, заходит он в эту функцию вообще или нет Во-вторых, ты правильно разыменовываешь ссылки? У тебя там навешана и шарповская ссылка и сишная, ты уверен, что это так нужно разыменовывать?
>>743670 С формами и классами я в первый раз. В функцию не заходит, т.к. неоткуда. Я ее вызвать не могу. Насколько я понимаю: Тип_результата имя_функции(тип_формального_параматра имя_формального_параметра) По другому разыменовать не могу - ругается.
>>743708 Спасибо, теперь компилятор не ругается! Но функция не работает, гугл говорит, что '^' - это побитовое исключение. Может, я ошибся с вызовом? showvec(textBox1->Text);
>>743716 Но ведь я не могу так вызвать(+ только что проверил) Класс схож со структурой. Если у меня структура: struct randomstruct { char c[10]; char d[10]; } и переменная randomstruct a; То чтобы что-то записать в 'а', я должен указать элемент структуры: a.b='g'
>>743708 ой фак, я тебе не то скопировал вот так у тебя функция должна быть объявлена: void showvec(System::Windows::Forms::TextBox^ textBox) вот так ты её доложен вызывать: showvec(textBox1);
>>743721 Тип System::Windows::Forms::TextBox^ -- это шарповская ссылка, что-то вроде shared_ptr, только со свистелками, считай что это просто умная обертка над указателем. Когда ты пишешь showvec(textBox1); ты передаешь внутрь функции указатель на своей текстБокс и используешь его внутри. Никаких присваиваний структур делать не надо.
Каким образом функция main(int argc, char *argv[]) при исполнении получает свои аргументы? Кто ей их передает в юниксах и в шиндовс? Где документация на это?
>>744464 Может компилятор выкинул нахуй. Ты там гарантировано за буфер вылазишь, это UB - тоесть компилятор может засунуть туда что угодно, хоть винт отформатировать и это будет полностью соответствовать стандарту.
>>744491 ОС передает. Читай в документации к своей операционной системе. >>744495 Чем бы твой "вижуалз" небыл, это врядли что-то меняет. Если ты объявил массив foo размера bar то читать или писать в foo[bar] ты не можешь. Это UB.
>>744506 >ОС передает. Читай в документации к своей операционной системе. Посмотрел сейчас в дебаггере и выяснил, что шиндовс предварительно обрезает все лишние пробелы из argv.
Правда по адресу, где оно находится, предварительно лежит в памяти какое-то дерьмо неясного происхождения.
Дополнительные ссылки на документацию приветсвуются.
>>744491 > The POSIX standard declares exec functions in the unistd.h header file, in C language. The same functions are declared in process.h for DOS (see below), OS/2, and Microsoft Windows. Нашел. Вроде оно.
Помогите с пердолингомАноним15/05/16 Вск 22:35:59#404№744610
Посоны, поясните такую вещь: Указатели argv[0]...argv[argc-1] ссылаются на участки памяти, где лежат аргументы командной строки. Указатель argv[argc] ссылается на NULL (0x00000000), как ему и положено.
А почему argv[argc+n] ссылаются на рандомные(?) участки памяти? Ну по крайней мере отладчик студии мне именно это показывает. Так и должно быть?
Дополнительное исследование показало, что максимально я могу обратиться из под отладчика к argv[argc+2321], а к argv[argc+2322] уже не могу. Лол. Сейчас проведу эксперимент, что будет если прочитаю по этому адресу из работающей программы.
>>744559 Потому что это уже не часть массива argv, там память, относящаяся к чему-то другому. Читать из нее это UB, поэтому у тебя все имело право вообще покрашиться. Но фактически просто нет контроля, и загрузчик может при каждом запуске изменять порядок argv и других данных по какой-то своей внутренней логике. Если тебе не повезет и argv окажется в конце виртуального сегмента, то сработает защита и выбросится SEH (как правило), если же после argv идет другая глобальная переменная или просто неиспользуемая часть выделенной тебе памяти, то ты просто считаешь ее.
> Сейчас проведу эксперимент, что будет если прочитаю по этому адресу из работающей программы. Случилось вот что. Для argv[argc+2322] все прошло ок: Argv[2328] is a: "(null)" А для argv[argc+9999] сдохла со словами: Unhandled exception at 0x00ed1070 in print_argv.exe: 0xC0000005: Access violation reading location 0x0065c544.
>>744632 Запусти свою программу из-под OllyDbg, вообще охуеешь, как там все устроено. Любопытство - это здорово, вообще-то. Если ты не растеряешь его и научишься ставить настоящие вопросы, то цены тебе не будет, братюнь.
>>744632 Смотри, существует такая штука как пейджинг (paging), погугли и почитай что это такое. Если вкратце -- те адреса, которые ты имеешь в своей программе -- это не физические адреса реальных ячеек в оперативной памяти, а виртуальные адреса, которые операционная система отображает на реальные ячейки памяти. У каждого процесса в системе есть виртуальная таблица страниц отображенной для него памяти. Каждый указатель в твоей программе -- это, грубо говоря, индекс в этой таблице. Когда ты обращаешься к памяти по какому-либо указателю, система за кулисами идет в эту таблицу, смотрит на индекс и если в этой таблице такой индекс есть, то она читает ячейки соответствующие записи в таблице по этому индексу. Если такого индекса в таблице нет, то бросается исключение что-то вроде access violation, мол, полез ты не в свою память, дружок, хуй тебе. На процессоре дергается прерывание и в программу твою прилетает сигнал SIGSEGV (это в posix, что там в винде я не знаю), который её и грохает (если ты, конечно, не перехватываешь его, но это уже другая история).
Стоит еще сказать, что память выделяется кусками -- страницами. Если ты выделишь память в один байт, то для твоей программы выделится целая страница, поэтому если ты напишешь, скажем, что-то такое: char x = new char; (x+1) = 42; То с высокой долей вероятности у тебя программа не упадет, несмотря на то, что ты юзаешь невыделенную память. Но может и упасть, если компилятор соптимизирует код таким образом, что этот байт будет выделен где-то на конце страницы, но это OCHE маловероятно.
Когда ты свою прогу запускаешь, система выделяет для неё память и куда-то в эту память кладет аргументы командной строки. Соответственно по указателям на эти аргументы есть записи в табличке страниц и когда ты из них читаешь все хорошо. Вероятно эти страницы помечены флагом readonly и если ты попробуешь в них что-то писать, тебя система пидорнет. Когда ты начинаешь итерироваться по argv[argc+n], первое время ты итерируешься по уже выделенной странице, т.к. маловероятно что аргументы так удачно выровнятся, что попадут прямо в конец страницы и следующий же байт окажется на другой странице, скорее всего впереди еще есть сколько-то байт до конца страницы и ты можешь из них читать. Но рано или поздно ты дойдешь до конца страницы и уже следующий байт будет ссылаться на несуществующую запись в таблице страниц и система тебя грохнет способом который я описал выше.
Вообще если тебе интересна эта тема, почитай Таниенбаума, он всю эту кухню по хардкору расписывает.
>>744703 Бро, как-то ты смазанно рассказал про paging и memory regions, поэтому я добавлю:
- Раньше оперативной памяти не хватало и программисты писали некую срань под названием "оверлеи". Они перекидывали из оперативки на жесткач, кусочки программы, которые прям сейчас были не нужны. Потом олдфаги заебались и решили перекинуть этот геморрой операционной системе. - Разработчики ОС и железа поднатужились и высрали технологию, которую назвали paging (страничной памятью). Помимо автоматического перекидывания данных из памяти на диск и обратно, оно еще дает виртуальное адресное пространство, так что программисты перестали терпеть жопоболь из-за дележки памяти с другими программами и ядром ОС. - Помимо этого, посоны обнаружили, что ебаны в рот, кулхацкеры не дремлют и регулярно пытаются заставить комп выполнять опасный код. Для противодействия этому придумали разделение памяти на сегменты(memory regions), которые призваны запретить интерпретацию данных программы как инструкций. Поддержали сразу и программно, и в железе.
Помимо этого в intel придумали еще и сегментную память. Это такие крутые memory regions, где у каждого региона свое адресное пространство. В современных ОС не используется, потому что разработчики *nix и windows в рот ебали эту дрисню. Дело в том, что из-за нее сильно изменилась бы работа с памятью, а поскольку на других архитектурах эту ёбань не завезли, им пришлось бы дико пердолиться, поддерживая разные модели памяти для платформ. Поэтому в x64 intel выпилили нахуй сегментную память из процессора, ибо только место занимает.
>>745010 На подкапотном уровне тебе никто не обещал кроссплатформенности, маня. Пиздец, так можно про любой язык кукарекать А ЧИВО ЕТА РАЗМЕР БИНАРНИКА ИЗМИНИЛСЯ ПРИ ПЕРЕХОДЕ С КАЛЬКУЛЯТОРА НА СТИРАЛЬНУЮ МАШИНКУ?!!!111 НА ЛИНУПСЕ JVM ЖРЕТ НА ПОЛТОРА МЕГАБАЙТА БОЛЬШЕ РЯЯЯЯЯЯЯ!!!1111 ПИСТОН СТАЛ РАБОТАТЬ БЫСТРЕИ И МАЯ ВЕЛОСИПЕДНАЯ СИНХОРИНЗАЦИЯ ОТВОЛИЛАСЬ!!!!!11111
>>744994 Ты в глаза ебешься? Поведение MSVC - это как раз тот случай, когда компилятор не умеет делать copy elision в данном конкретном случае. Вместо этого он заебенил move-семантику. Лично меня такое поведение удивило. Вроде раньше студия умела в RVO в таком простом случае. Может баги полезли из-за внедрения move-семантики
Вообще, copy elision - единственная оптимизация, которую можно выполнять даже в тех случаях, когда у конструкторов копирования есть побочные эффекты.
#include <iostream> #include <string> using namespace std;
int main() { string line("some line"); for (auto bukva : line){ bukva="x"; cout<<line<<endl;} return 0; } Выдает invalid conversion from 'const char*' to 'char' [-fpermissive] Что я сделал не так?
>>745486 Да нет, прямо из интанса и вызываю Какая впизду игра, переименовал палевное название структуры в первое что в голову придет Отлично, this закатило. >>745485 Когда-нибудь я тоже буду шарить на твоем уровне
>>745740 sizeof - это оператор, который работает во время компиляции, а не в рантайме. Благодаря тому, что плюса статически типизированы, размер переменной ясен уже на этапе конпиляции.
>>745757 >Не размер относительно char, а размер в байтах. Если что char обязан быть размером 1 байт, стандарт прямо указывает что sizeof(char) == 1 для всех реализаций. При этом в char не обязательно должно быть 8 бит. исправлены неточности
>>745818 > Но 1 байт это и есть 8 бит, значит обязан. Почему тупоголовые обязательно решают написать посты и обнажить свою глупость? Если ты туп, то сиди ридонли. > The unit octet was defined to explicitly denote a sequence of 8 bits > byte is a unit of digital information that most commonly consists of eight bits > Various implementations of C and C++ reserve 8, 9, 16, 32, or 36 bits for the storage of a byte. The actual number of bits in a particular implementation is documented as CHAR_BIT as implemented in the file limits.h.
>>745825 Есть переменная p, которая указывает на int, этого достаточно компилятору. И p - это не указатель на переменную, а указатель на участок памяти.
Сап, аноны. Помогите разобраться с УСЛОВИЕМ задачи. дожили блять Есть задача: Дана структура классов программного проекта. Необходимо построить процесс компиляции с помощью топологической сортировки.
Что есть топологическая сортировка я просек, но как понимать СТРУКТУРА КЛАССОВ ПРОГРАММНОГО ПРОЕКТА. О зависимости классов я понял, наследование там, все такое, но что есть СТРУКТУРА КЛАССОВ? Как мне ее передавать и в каком виде она вообще передается.
>>745887 окей, это я тоже понял, что необходимо построить граф. про композицию почитаю. но откуда брать этот граф, точнее не так, в каком виде считывать классы?
>>745850 Забей ты на кодлайт, это говно тут всего пара анонов пиарит. В энтерпрайзе все юзают (в порядке убывания) MS VS / Eclipse CDT / QtCreator / CLion. Лично я рекомендую eclipse, очень годный code assistant прямо из коробки.
>>745890 Если это просто задачка на графы, то тебе уже дается направленный граф, на котором нужно заюзать топологическую сортировку. При этом, раз тебя просят сделать топ. сортировку, то граф должен быть ациклическим, хотя по условию в нем могут быть циклы. Т.е. перед топ. сортировкой нужно найти и разорвать циклы.
Если это не чистая задачка на графы, то тебе нужно пропарсить файлы проекта, найти в нем определения классов (хватит обычных регулярок), построить граф этих классов, а потом сделать то, что нужно в чистой задаче на графы.
>>745893 акей. я вообще идешки недолюбливаю. уж очень тормозные. привык все через вим и терминал делать. но все же не хватает идешных фич. хотел из вима иде сделать. чото не осилил. в иде вим-мод сделан через жопу и это делает меня грустить. хотя qtcreator не плох вроде.
>>745973 Ты че, ебанутый? eclipse отлично открывает makefile проекты и прекрасно их анализирует. Например, проекты linux, freebsd, virtualbox я просто открыл и начал с ними работать. В других ide так сделать нельзя.
>>745954 Данный цикл в макросе не делает ровным счетом ничего, а зачем он нужен я не понял (вроде бы реализует разное отношение к показу сообщений об ошибках в дебаг версии и в релиз версии). Но ты можешь понять тут или в книге "Enough Rope to Shoot Yourself in the Foot", откуда они этот макрос спиздили. https://books.google.ru/books?id=wz2nBAAAQBAJ&pg=PA834&lpg=PA834
>>739169 А почему нельзя просто писать в разные файлы, а в консолях сделать банальный tail -f (в винде есть аналог, я уверен, например фар умеет) на каждый лог-файл?
Байтоебы, поясните за адресное пространство в шине PCI. Таненбаум чета не понятно объясняет. Например он совершенно нихуя не говорит про конфигурационное пространство.
Как-то раз у вас встречалось нечто вроде "ушли в стартапы за деньгами из настоящей индустрии". Если она настоящая, чего ж там денег меньше? Знаете, тут уже недалеко до другого анекдота "может, с них за вход плату брать?". У ivan-gandhi как-то была ссылка на скальную вакансию где-то там, недалеко от Германии, с издевательской припиской "изменить мир задешево". Вот, это оно и есть.
Шум и пафос. Известность. За это платят. А рабу лампы, вернее - большого индустриального комплекса, который раб без этого комплекса мало что значит - можно и не платить. Куда ж он денется-то. 90ые в РФ это хорошо показали, чего стоят инженеры сами по себе. Пусть дальше занимаются серьезным делом, изобретают снижение издержек для мистера Твистера (он же - герр Херр), хозяина завода, газеты и парахода, снизит на миллион, ему дадут 1000 - от щедрот. Изобретет 3д-принтер в 80х, чтобы до масс этот принтер дошел только после 2010, когда мистер Твистер насытится. Разумеется, гитхаб тут неуместен, с ним под сукно сложно что-то сложить. Программисты обладают гораздо бОльшей автономностью. И если они вдруг мистера Твистера обманывают, обещая ему невесть что на хаскеле, то и поделом. Не обеднеет. Делиться надо.
Посоны, правильно ли я понимаю, что MSVS предоставляет только хедеры и декларации функций стандартной библиотеки. А самих исходников этих функций нет? И если я хочу посмотреть исходники, то мне нужен gcc/g++?
>>746083 ну, видимо, да. MSVC не швабодный, поэтому реализации функций ты не найдешь. а gcc опенсурс, только в исходниках (stl например) там хуй разберешься
>>746083 Сам нашел. Они поставляют исходники, но к ним не получится обратиться по 'Go to definition', т.к. программы линкуются к уже готовым .dll > (1) We ship most of the sources for the CRT with Visual Studio; you can find them in the Visual Studio installation directory under VC\crt\src. Плюс, что забавно они сами не писали стандартную библиотеку, а тупо купили ее у Плаугера.
>>746106 > Copyright (c) 1992-2009 by P.J. Plauger. ALL RIGHTS RESERVED. > Consult your license regarding permissions and restrictions. > V5.20:0009 С 2009 года, наверное, сами поддерживают.
Matrix::Matrix(USI M_S) { HOW_MUCH++; numb = HOW_MUCH; Matrix_Size = M_S; m = new int[Matrix_Size]; for (USI l = 0; l < Matrix_Size; l++) m[l] = new int[Matrix_Size]; for (USI s = 0; s < Matrix_Size; s++) { for (USI j = 0; j < Matrix_Size; j++) { ((m + s) + j) = 0; } } }
Matrix::~Matrix() { for (USI l = 0; l < Matrix_Size; l++) delete[]m[l]; delete m; }
bool Matrix::operator==(const Matrix& s) { if (Matrix_Size == s.Matrix_Size) { for (USI i = 0; i < Matrix_Size; i++) { for (USI j = 0; j < Matrix_Size; j++) { if (!(((s.m) + i) + j == ((m + i) + j))) return false; } } return true; } else { return false; } }
const Matrix& Matrix::operator=(const Matrix& s) { for (USI l = 0; l < Matrix_Size; l++) delete[]m[l]; delete m; m = new int[Matrix_Size]; for (USI l = 0; l < Matrix_Size; l++) m[l] = new int[Matrix_Size]; Matrix_Size = s.Matrix_Size; for (USI i = 0; i < s.Matrix_Size; i++) { for (USI j = 0; j < s.Matrix_Size; j++) { m[j] = s.m[j]; } } return this; }
Matrix& Matrix::operator+ (const Matrix& s) { if (s.Matrix_Size == Matrix_Size) { Matrix buff(Matrix_Size); for (USI i = 0; i < Matrix_Size; i++) { for (USI j = 0; j < Matrix_Size; j++) { ((buff.m + i) + j) = ((s.m + i) + j) + (*(m + i) + j); } } cout << "suck my eldak" << endl; cout << buff; return buff; } else { Matrix buff(5); cout << "Sorry, but you can't sum this matrix! RANDOM MATRIX FOR YOU!" << endl; return buff; } }
>>746139 Пиздец ты понаписал говна. Во первых, ты проебался в операторе +, у тебя возвращается ссылка на локально созданный объект (читай иногда предупреждения; компилятор тебе нахуя?). Во-вторых, в присваивании у тебя почему-то Matrix_Size присваивается внутри цикла. Нужно по идее перед тем, как выделять память для новой матрицы, перед строкой 73
Посоны, посоветуйте, пожалуйста, схему подстветки кода для студии, чтобы визуально сразу было ясно где у меня указатели, где ссылки, а где обычные переменные.
Подскажите пожалуйста, я недавно изучаю пдюсы, но не совсем понял как считается медиана: temps[temps.size() / 2] Т.е. берётся вектор temps... А дальше я не понял. Просто, я знаю что если в скобки поставить номер значения вектора, оно его и выведет. А если значение делить на 2 - надо сортировку делать тогда, верно:
>>746406 Кнут отличная вещь, но без определенного уровня подготовки осилить его будет очень тяжело. Как учебник по алгоритмам, как его иногда советуют, не подходит вообще. Для этого лучше взять того же Кормена или Седжвика. Плюс есть лекции на курсере и ocw.
>>736493 (OP) Поясните разницу между std::move и std::forward. Правильно ли я понял, что std::move только для rvalue ссылок, а std::forward для rvalue и универсальных и он пытается преобразовать тип ссылки к rvalue, если передана rvalue для приемника?
Как мне написать исключение, чтобы появлялась ошибка при передачи как аргумента строки "my mama"? Если в поможете я отправлю вам лучшую картинку, что у меня есть! Хоть это и мелочь, но правда помогите пожалуйста.
>>746870 Спасибо большое. Твое решение пока мне кажется хорошим. Почему ты считаешь, что assert лучше исключений? Кроме конечно простоты реализации, здесь твое решение классное. Просто интересно. Для использовании в качестве аргумента в будущих спорах с начальником
>>746896 Исключения запутывают код и они достаточно дорогие в плане производительности. В плюсах их использование не поощряется. assert разворачивается просто в проверку условия и, в случае если условие не выполняется, то в stderr выводится сообщение и вызывается terminate. assert компилируется только в дебаге, в release этот код просто не попадает.
>>746901 >>assert компилируется только в дебаге, в release этот код просто не попадает. Я правильно понимаю, что в release этой проверке уже не будет? Это проверка для программиста, но не для пользователя, верно? Но если мне необходимо запретить именно пользователю вводить неправильные данные?
>>746908 Именно так. Если тебе необходимо запретить вводить пользователю неправильные данные, то пиши явную проверку а-ля If(data_is_wrong) { show_message("Чо ты мне втираешь какую-то дичь? Пшел нахуй!") return 1; }
>>746935 Возврат объекта, представляющего ошибку, был бы норм, если бы в C++ можно было бы возвращать несколько значений или, если бы он был бы динамически типизированным. show_message(...) - можно делать только в функциях расположенных ооочень высоко.
>>746908 Вкуривай вообщем исключения(обработка ошибок - одна из самых выжных и сложных вещей). Это точно пригодится как минимум при работе с чужим кодом.
>>746896 В языках без GC исключения опасны так как они прерывают "нормальное" выполнение программы и могут приводить к разной хуйне (утечкам). Безопасное использование исключений требует определенных знаний, использования специальных идеом (правил) программирования, например raii. Многие препочитают просто не ебатся с ними вообще, например гугл в гайдлайнах не рекомендует их использовать. >>746908 > запретить именно пользователю вводить неправильные данные? Это ущербная практика в любом ЯП. Нормальные люди не программируют бизнес логику на исключениях. Для проверки ввода пользователя у тебя должен быть специальный код, и в случае неправильного ввода он должен "обычным" способом сообщать кому следует, без разницы используешь ты исключения или нет. Исключения предназначены для обработки исключительно исключительных хе хе хе ситуаций. Там к примеру процесс внезапно не смог прочитать/записать в файл (причем первоначальная проверка наличия этого файла и возможности записи должна проводится вне исключений, "обычным" кодом а исключениями покрыта уже дальнейшая работа с файлом), достучаться до сокета который до этого отвечал и т.п.
Как разобраться в чужом спагетти-коде? Есть ли какие-нибудь хитрости? У кода нет документации и нет туториалов. Код писали несколько европейских профессоров и пара десятков аспирантов в течении ~15 лет с перерывами. Сейчас код забросили.
>>747095 Разбираться в коде, который описывает предметную область, не зная самой предметной области - дело бесконечное. Если изучишь сам предмет, разобраться в коде не составит особых трудностей.
>>747751 Если ты новичок, то особой разницы какую версию студии ставить нет. Скорее всего тебе нафиг не нужен ни новый стандарт, ни новые свистоперделки. Плюс в новых версиях студии легко могут перестать собираться старые проекты или поломаться бинарная совместимость, если ты компилируешь плагин для какого-то дерьма. мимо сижу в 2010 студии и мне норм
>>747762 Помоему лучше сразу вкатываться в новый стандарт, по сравнению со старым много удобных нововведений, помимо самого синтаксиса еще куча полезного в STL.
Допустим у меня есть структура typedef struct foo{...}bar;. У нее внутри массивы, char, uint и прочее. 1) Как мне сделать ее дамп памяти? 2) Можно ли как-нибудь в автоматическом режиме привести типы всех ее элементов и распечатать их значения?
>>747895 Программисты -- это, определенно, черви-пидоры. Не понимаю, как можно было не написать библиотеку для этого.
Смотрю сейчас одну программу. Программист объявляет структуру, кладет в нее вложенную структуру, потом забывает, что во вложенной структуре он уже объявил какие-то параметры и начинает их объявлять повторно. Код растет, память засирается, программист рад.
>>748033 >а за этим радостно шагает вся пятёрка нихт. Пятерка - это конструктор по умолчанию, конструктор копирования, оператор присваивания, move-конструктор, move-оператор присваивания
Сап, аноны. Есть одна задача, просить решить просить не буду, нужен совет по алгоритму. "Дана строка в миллион символов, найти две одинаковых подстроки максимальной длины. Любых." Просидел дофига, никак не пойму что да как. В плюсах недавно.
>>736493 (OP) А аккаунт в студии надо создавать? Просто при старте предложили. Мимоновичок.
istreamiterator передача в функциюАноним20/05/16 Птн 16:17:44#602№748450
Аноны помогите плиз! суть такова: я создаю итератор потока для файла. в main все нормально работает (инкрементируется). передаю как параметр в функцию, нихрена не инкрементируется! вот код http://pastebin.com/XMVGQYRD знающие аноны, помогите, пожалуйста! уже весь день эту хрень пытаюсь отладить
>>748457 Я нюфаня в крестах, но твой пример напечатал два раза строку. Пикрилейтед. В файл я записал рандоные строки. Что твой алгоритм делает я не знаю. Также я удалил нафиг все лишние хедеры и оставил только: #include <iostream> #include <fstream> #include <iterator>
>>748461 >>748466 блин, бред какой-то, что я скинул последнее и у меня вроде работает, а в основном алгоритме (сортировка слиянием для файла), почему-то не работает. ща буду разбираться
>>748477 ошибки не выдает, просто неправильно работает. он первое значение выводит, итератор имеет нормальный адрес. после инкремента он пишет что значение такое же осталось и адрес NULL почему-то, но выводит значение(то же самое, не инкрементированне)
>>748512 std::distance If InputIterator is not at least a forward iterator, first and any iterators, pointers and references obtained from its value may be invalidated.
Итератор становится невалидным. Делай std::distance над копиями.
>>748611 И да, я не пользуюсь плюсовыми потоковыми файлами, файловый поток fi в результате вызова distance не перематывается ли в конец? Может надо переместить в начало.
>>748621 istream_iterator<int> isiter(fi); так. как по другому? ну или через =, не суть же >>748623 >>748627 правильную длину возвращает. на SO написали что нельзя потоковые итераторы назад переместить никак, так как они InputIterator
думаю теперь контейнер (вектор) юзать. жалко, с потоками бы круто вышло, если бы получилось, но я уже ниче не могу придумать лучше, а было бы неплохо эту прогу сдать завтра преподу.
Чет не нашел этого в Гугле: Где та палата мер и весов, в которой закреплены четкие и конкретные значение размера в байтах для встроенных типов short, int, long для каждого конкретного режима x86 (64/32/16/other?), а еще для всяких армов и прочих архитектур.
>>748636 Мне лень проверять, поэтому немного с дивана. Я вот чего-то не уверен, что копирование istream_iterator'а корректно. Итератор, как абстрактная структура данных -- это такой объект который указывает на элемент внутри коллекции, может его вернуть и сдвинуться. Когда у нас входной поток и существует два итератора на него, и один из этих итераторов сдвигается, то непонятно что должно происходить во втором итераторе. Как бы по контракту, раз мы его не трогали, он должен указывать на тот же элемент, на который указывал раньше. Но это поток, поэтому там этого элемента уже нет. Самым логичным поведением как мне кажется должна быть инвалидация второго итератора и андефайнд бехейвор. Но с другой стороны ему ничего не мешает просто читать данные из потока несмотря на первый итератор.
Короче. надо смотреть в стандарт, что мне делать лень. Может, любопытные поинтересуются.
стих придумать не успел
запилю ка перекат
пусть анончик будет рад
прошлый тред:
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-треды