Это копия, сохраненная 7 июня 2016 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
стих придумать не успел
запилю ка перекат
пусть анончик будет рад
прошлый тред: >>726671 (OP)
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: Специально для тебя аноны /pr собрали уникальную коллекцию отборной литературы по крестам. Только лучшие книги, последние издания, без хуев! Выбирай категорию и обмазывайся:
-
Для нюфань
Учебники для начинающих. Все примерно одинаковой годноты, читать имеет смысл только какой-нибудь один, который больше приглянется:
Автор(ы) Название Год Ссылка Бьерн Страуструп Программирование. Принципы и практика использования C++ 2016 https://yadi.sk/i/Yd6KKpLBqJSUr Стэнли Липпман, Жози Лажойе и Барбара Му Язык программирования C++ 2014 https://goo.gl/kVaela Стивен Прата Язык программирования C++ 2012 https://goo.gl/z7kA8u
Другие обучающие материалы
Q: Я не умею читать.
A: Можешь посмотреть какой-нибудь онлайн-курс: раз, два, три
Q: Не люблю, когда льют воду. Хочу коротких материалов по существу.
A: Вот тебе блоги, факи, референсы и всякое такое:
- Годный блог, в котором все просто и понятно тян не нужны кококок борщ
- Блог с хорошо расписанными фичами новых стандартов
- Краткие описания библиотечных функций и контейнеров - на русском или более подробно на ангельском
- Блог Герба Саттера (на ангельском)
- Блог Скотта Мейерса (на ангельском)
- Блог еще одной тянки, много о Qt и оптимизации (на ангельском)
- Куча других блогов (на ангельском)
- Большой FAQ по C++ (на ангельском)
- Видео с CppCon (на ангельском)
Софт и библиотеки
Q: Я готов начать погроммировать! Куда мне писать код?
A: На этапе написания хэллоуворлдов можно не ебаться с установкой софта, а использовать онлайн-компиляторы: раз, два, три, четыре. Для работы над более серьезными вещами удобнее всего установить какую-нибудь IDE. Ниже приведены несколько хороших вариантов:
Платформа | Название | Описание | Ссылка |
---|---|---|---|
Windows | Microsoft™ Visual Studio® | Общепризнанно самая продвинутая и удобная IDE, не имеющая равных по части автодополнения и возможностей отладчика. По ссылкам справа можно скачать бесплатную редакцию последнего выпуска (2015 Community Edition). Кроме того, существуют редакции с расширенными возможностями (Professional и Enterprise). Они стоят сотни денег, но если ты студент вуза, подписанного на Dreamspark Premium, то ты можешь получить их безвоздмездно (то есть даром). Многим новичкам интерфейс студии кажется чересчур сложным, так что обязательно прочти этот гайд, если у тебя возникают проблемы с компиляцией хэллоуворда | https://goo.gl/qgAAc6 (русская версия) или https://goo.gl/WIPW9L (ангельская версия) |
Все | CodeLite | Простая, легковесная, кроссплатформенная, швабодная IDE. Менее навороченная, чем студия, но среди бесплатных вне конкуренции. Вероятно, это наилучший вариант для новичка с *nix. Под Windows же требует чуть больше ебли с установкой компилятора MinGW/LLVM | http://codelite.org/, "sudo aptitude install codelite codelite-plugins" для установки под *nix |
Все | CLion | IDE, призванная похоронить Visual Studio пока не особо получается. Она стоит денег, но можно украсть почти не протухшую версию на торрентах или получить бесплатную лицензию на год по скану студбилета, если ты студент. Удобные свистелки и перделки присутствуют. Тормоза и баги присутствуют. Кросплатформенность присутствует | https://www.jetbrains.com/clion |
Q: Я прочитал все вышеперечисленное, теперь я гуру! Что дальше?
A: Дальше переходишь по ссылке, пробуешь отвечать на вопросы и понимаешь, что ты пока в самом начале пути. Кроличья нора крестов практически бездонна, поэтому продолжать постигать тонкости и детали можно очень и очень долго. В то же время, на этом этапе у тебя должно быть достаточно знаний, чтобы уверенно писать неплохой код. Поэтому читай исходники открытого софта и библиотек, отправляй пулл-реквесты в них, читай книжки по предметным областям и общим методикам разработки, а дальше уже сможешь запилить свой проект или вкатиться в существующий.
Стих получше чем у предыдущего опа
>блять проебали юбилейный тред а оп наверно к нему особый стишок готовил или оп-пик рисовал
Ути-пути какие мы нежные. Стишочек не завезли, картиночка не радует глаз - все, буду сидеть в бамплимите и кушать говно.
Пошел нахуй
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?
Почитай про вывод типов
Если к достоинству всратости прибавить достоинство краткости, то у стиха из шапки будет не менее двух достоинств, господа мушкетеры.
>каким образом при создании const string объекта внутри него char преобразуется в const char?
Никаким не преобразуется. У строки есть char begin() и const char begin() const. Компилятор видит, что строка константная, и выбирает последний вариант для итератора.
1) С какого хуя auto что-то там должен отбрасывать? На его место просто подставляется таргетный тип. Отбрасывать const можно и нужно с помощью const_cast, а так же всегда можно сделать это через c-style или reinterpret_cast и выстрелить себе в ногу из жопы;
2) Открываешь реализацию итератора, смотришь что, как и с каким типом там возвращается;
3) Сука, если тебе не нужно менять символы - не передавай их по ссылке, на x64 это будет медленнее варианта с копированием лол.
Not good
Based on a roll
Antonczyk announced joy
char возвращается оператором [] из строки. Если эта строка константная, то этот char в const char компилятор также преобразует?
Это же костыль, и он неочевиден. "низкоуровнеый язык, всем управляет программист" охуенно.
В стринге есть два переопределенных оператора [], один из них возвращает char&, другой просто char.
В случае, если стринг не константный, то будет вызван первый оператор и вернется char&, во втором случае будет вызван второй оператор.
Не работает велосипедное смешание QTcpServer/QTcpSocket и QThreadPool.
Есть смысл расписывать проблему?
Всегда есть смысл расписать проблему. В овер9000 случаев сам поймёшь в чём она.
Ну хорошо.
У меня есть клиент-серверное приложение (чатик).
У клиента есть сокет QTcpSocket
Сервер унаследован от QTcpServer, содержит массив объектов клиентов, в каждом объекте - свой сокет QTcpSocket.
Проблема в том, что если очень быстро отправлять сообщения с клиента - то они "зажевываются" на стороне клиента.
Например, отправил 10 сообщений быстро - прошли хорошо, 11е - зажевалось. То есть оно застряло где-то в очереди к обработке сокета (signal readyRead) на стороне клиента. Самое интересное - при отправке 12го сообщения, обрабатывается 11е, а 12е - зажевывается, соответственно. И так далее.
Вот, могу еще подробнее расписать, если кто-то с таким сталкивался
110% проблема в твоём коде.
Кури свою логику при обработке данных. Вероятно, она делает что-то не то, когда получено сразу несколько сообщений.
Учитывая упоминание QThreadPool: внимательно кури порядок операций. Не может ли сложиться ситуация, что данные придут в тот момент, когда ты уже убедился, что их нет, но ещё не попросил систему уведомить тебя о поступлении новых.
Прикол весь в том что в случае когда оно не инициализировано - я не могу вызвать дефолтный оператор присваивания этого класса , вылетает Floating Point Exception (Underflow error), именно присваивания, я не пытаюсь с этим мусором проводить арифметическую операцию. И что ещё характерно - это только в x86 билде вылетает, в x64 всё нормально.
Т.е в операторе присваивания крешится на месте this->doubleField = that.doubleField
Сталкивались с таким? Природа явления не ясна для меня.
Ну я так не могу делать по определённым причинам. Легаси код, всё такое.
Короче мне больше интересно почему ошибка возникает при присваивании, в моём понимании она должна произойти при попытке произвести какую-то арифметическую операцию.
Посмотри на ассемблерный код. Может, оно его пытается загрузить в регистр сопроцессора зачем-то, и при этом вылезает ошибка.
Есть длинный список названий:
ООО Пики и Хуи
ОАО Пики точены
АОА Хуи дрочены
и тд.
Этот список можно запихать в массив из текстового файла - не подходит так как файл всегда открыт для правки.
Можно сразу в коде запихнуть в массив - тоже не удобно так как списков много разных больших и маленьких.
Так вот вопрос: можно ли этот список добавить к коду как дополнительный ресурс и уже из него брать необходимое?
Может криво объяснил, поправьте.
Я вообще нихуя не понял ни твоей проблемы, ни что ты хочешь сделать, но попробую выстрелить в небо: в чём проблема использовать вектор или любой другой динамический контейнер?
Тебе в Qt - там есть ресурсы.
Будешь открывать свой файл как "qrc://zalupa.txt", а на деле он будет вкомпилен в твою прогу и никто его не отредактирует.
Видимо, список СЛИШКОМ большой, чтобы использовать контейнер.
>>737446
Может глянуть в сторону БД, типа sqlite?
Один из вариантов - сериализация.
не хотелось бы подключать базы
Это PyQt, обвязка поверх крестовых либ.
Да я вангую что это на gcc не повторить.
Вот примерно такой код,
https://ideone.com/H0JsOQ
Таки не могу повторить, походу только на x86 Release билде, а дома у меня винды нет чтоб проверить.
Если С++11, то можно его тупо заинклудить. Добавь в начале файла const char @str = R"(, а в конце )"; Если нет - то xxd и objcopy тебе в помощь.
Попробую объяснить вот так:
string list[100501];
list[1] ="ООО Пики и Хуи";
list[2] ="ОАО Пики точены";
.
.
list[100500] ="АОА Хуи дрочены";
Есть вариант как это сделать проще?
Текст будет в отдельном файле, который вкомпилится в экзешник, обращение к нему через строковую константу. После запуска ты читаешь эту константу, разбиваешь на строки, пихаешь в массив.
Думаю, тебе проще скриптик написать, который читает текстовый файл и генерирует massiv.cpp, и запускать его через твою систему сборки.
Всё ок.
QFile file("qrc://lalka.txt");
file.open(QIODevice::ReadOnly);
QStringList constants = file.readAll().split('\n');
Как то так
Капитан, вначале срабатывает сигнал о новом сообщении, только после этого я запихиваю его в тред.
>>737438
Ничего такого, делаю для себя. Держи, приложил скомпилированные экзешники, если кьют не стоит.
p.s. Я уверен, я много что сделал неправильно.
Алсо, я нашел интересный баг, что если сокет создать в тред пуле, то он отказывается работать напрочь. Поэтому пришлось коннектить клиенты в основном потоке.
http://rgho.st/88KXVZj6C
Это щютка? Мало того, что самый парашный формат архива, который только можно было найти - так еще я и ломать его должен?
Ну прогугли тогда, как определяется стандартный пароль для различных форумов
Верно, нужно приобрести сборник избранного.
Ехай Нахуй, дебил блядь!
Я тут за структуры хотел бы поинтересоваться.
Есть такая хуйня:
http://pastebin.com/5VVA65ic
33 и 34ая строка - уже сделал отдельную переменную, один хуй не понимаю в чем проблема.
Есть два вектора, которые держат две технически идентичные (но разные для восприятия) структуры.
Забиты в одном файле, если важно.
Выделяю под них место, получая инфу с базы.
Для первого - все проходит нормально - приходит значение "4", на "4" и расширяется.
Со вторым все идет через хуй пойми как. Он выбирает даты. Даты выбираются как обычно для qDate (daysTo) - значение "1" - все ок, capacity == 1
Но если значение больше 2 - начинается пиздец.
В функции и в конструкторе выводится "2" - он генерит "4"
В функции и в конструкторе выводится "32" - он генерит "41"
В чем беда - вообще хуй знает. Объявлены глобально в хедере, без указателей и переобъявлений - проверил.
Помимо resize пробовал еще reserve - та же ситуация
Куда еще можно копнуть? Кроме ассистанта
Блять, а щас reserve заработал
да что ж за магия-то
Благодарю за уделенное время.
продам гараж, куплю тиски для выпрямления анальных рук
Ёбаная сука! Говномесный пидорас! Сдохни тварь! Сдохни и не пиши больше! Мои глаза, мои бедные глаза, зачем они видели ЭТО?!
Да, блядь, да. Ебай в assistant, сука, читай, блядь, что там пишут!
reserve - резервирует место, но не создаёт элементы.
rеsize - изменяет размер, т.е. и резервирует и создаёт. Может зарезервировать дохуя больше, чем ты просил. Потому что он, сука, умнее тебя и знает как выделяется память.
size - размер, т.е. количество созданных элементов
capacity - ёмкость, т.е. сколько памяти зарезервировано.
capacity >= size всегда!
В твоём коде говна больше чем кода.
Я открыл один только сервер.цпп и уже в шоке.
Вот пара примеров:
ты делаешь waitForReadyRead с ТАЙМАУТОМ БЛЯДЬ! НО НЕ ПРОВЕРЯЕШЬ РЕЗУЛЬТАТ. А что если ничего не придёт и таймаут случится?
ты используешь QDataStream для чтения из сокета. А с чего ты взял, что там достаточно данных для того, чтобы эта операция не вызывала блокировок и читалала то что надо?
Шпокойней-шпокойней.
Помимо таких профессионалов как ты есть и те, кому просто интересно поколупаться. И они таки могут совершать ошибки, особенно на первых порах.
Вспомни себя, к примеру.
Хотя о чем это я, ты же родился с клавиатурой в зубах, конпелятор у тебя в голове встроенный, с первого раза все делаешь без ошибок и вообще - не тупишь никогда по определению
Нетбинс то зачем?
Норм, только глаза от жабошрифтов вытекают. Я эклипсом пользовался, там нативная отрисовка, и возможностей не меньше.
Потому, что мне в очередной раз придется объяснять шефу, что наша новая стажерка-программистка(!) с КРАСНЫМ, блядь, диплом технического ВУЗа не знает "как установить STL в IDE" и что надо было ее принимать на должность кассира или секретаря (только зачем нам третья секретутка в одном офисе).
Я был:
последовательней (куда браться за многопоточку, если в тривиальных вещах ошибки)
читал учебники и доки
Да-да доки. Там ангельским текстом для простых смертных заветы по использованию 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.как вывести один знак после запятой?
В C++11 UTF-8 поддерживается по умолчанию, может как-то копать туда?
>как вывести один знак после запятой?
http://www.cplusplus.com/reference/ios/ios_base/precision/
С 10й студии на 13ю перешел только вчера, собственно потому и спрашиваю.
>precision
Оно задает общее количество знаков. Как лучше поступить вывода всего целого+1го после запятой?
STraDat'
В том же printf() так замечательно все форматируется..
Уже 30 минут ищу, блять.
В общем надо определить число целых разрядов, числа больше 10кк меня не интересуют, хотя в будущем может быть.
int rcount(int hp)
{
int digitHp = hp;
int _rcount = 1;
for (int i = 0; i<6; i++)
{
if (digitHp/10 >= 1) _rcount++;
digitHp = digitHp / 10;
}
return _rcount;
}
Теперь строка создается так:
hpOS << setprecision(rcount(hp)+1) << hp;
Какое-то говно, хотя бы работает нормально, но бля, задачка на другом языке в 10 раз быстрее бы решилась.
Допустим есть строка Mas, состоящая из пяти однобайтовых символов.
Нужно заменить все символы, кроме латиницы на какой-то другой символ, допустим /
Вот просто для примера набросал код через указатель
И не совсем понимаю, почему он не работает без указателя, с обычным Mas[cx] я уже решил
http://pastebin.com/PfAzVFdf
Во-первых, если количество итераций и количество знаков без учёта служебного $ совпадает, он внезапно выдаёт мне на один знак больше, а потом ещё и пихает мусор, т.е. явно стирается последний служебний символ, хз по какой причине, ведь итерации всего 2.
Во-вторых, если хоть раз встретится не латиница, он будет заменять любые следующие символы на /.
>В том же printf() так замечательно все форматируется..
Так и используй его, нахуя тащить говно-iostream туда, где он только мешать будет?
>последовательней
Каким бы ты последовательным не был, прочти тот спойлер, особенно строчку про "никогда не тупишь".
Учебники и доки читаю по мере необходимости использования того или иного функционала, но этот момент пропустил - не отрицаю этого. Объяснил - и на том спасибо.
>Вылезают на рынок
За всех не говори - лично я не вылезаю. У меня и так есть работа, не связанная с погромированием, пишу "в стол" (а точнее для того чтобы помочь себе самому, а не СТАРТАП ЛАЙФХАК МАНИ ХИПСТЕР АЙФОН
Может that.doubleField не инициализирован, и он ругается на него?
Как это не имеет значения?
Ты двигаешь указатель на один байт, а читаешь/пишешь слово. А еще эти слова пересекаются. А еще при записи слова в позицию последнего символа затирается ноль (ограничитель строки).
Короче, просто поправь на
>byte ptr
и не доказывай, что и "так должно работать".
Бля, затупил, мне показалось, что массив однобайтный, потом посмотрел, показалось, что двухбайтный, написал решение для двухбайтного и в итоге он всё-таки был однобайтным.
ИТТ есть работающие в гейдеве? А программистами графики? Кто-нибудь вообще писал тут 3d или, хотя-бы, двухмерную визуализацию?
int main(){
int array[10];
cout << array1[9] << '\n';
cout << array[9];
}
Почему в array1 все элементы равны нулю, а в array они рандомны?
Понимаю, что array1 глобальный. Но в книге написано, что элементы массивов инициализируются по умолчанию (а для int это 0) вне зависимости от нахождения массива.
Поясните за это плокс
Глобальные элементы и статики инициализируются в нули, а локальные нестатики содержат мусор, так и есть по стандарту.
Сам об этом узнал только недавно, благодаря тесту из шапки, хотя считал, что всегда должен быть мусор.
>И много знать из области математики и геометрии нужно?
Вечно один и тот же вопрос. Загугли и скачай книгу math for game developers.
Он на C с классами лабки пишет, ему можно.
>И много знать из области математики и геометрии нужно?
Для графики - линейка в объеме первого курса, но ее нужно очень хорошо понимать. Теормех-гидродинамика для физона.
>Для графики - линейка в объеме первого курса
Полистал уже книжку, вижу, правду говоришь.
>но ее нужно очень хорошо понимать
С пониманием у меня проблем почти никогда не возникает. Понимать-то я её понимал, весьма простая штука, но вот если бы в институте оценки за понимание ставили.
>Теормех-гидродинамика для физона.
А вот это может стать серьёзным препятствием.
Чому во всех нотациях их называют начиная с m_ или заканчиваю подчёркиванием? Чому нельзя в конструкторе через this как в яве инициализировать и не издеваться над глазами?
Где это в яве методы инициализируются через this?
m_ - member
>Чому нельзя в конструкторе через this как в яве инициализировать и не издеваться над глазами?
Тебе кто-то запрещает и пиздит тебя палкой, если ты это сделаешь?
>Тебе кто-то запрещает и пиздит тебя палкой, если ты это сделаешь?
Именно это и сделают если закоммичу куда нибудь или в команде с устоявшимся кодстайлом буду писать "отсебятину".
нужно рисовать текст, а не выводить в сосноль.
Пароль должен стоять не на архиве, а на скачивание. Чтобы скачивали только двачеры и мимокроки не портили счетчик скачиваний.
>А вот это может стать серьёзным препятствием
Да не станет, не парься. Там все просто. Когда конкретные вещи делать начнешь - сразу станет ясно какие знание нужны, нагуглишь и выучишь.
>Чому нельзя в конструкторе через this как в яве инициализировать и не издеваться над глазами?
Можно, но тогда тебе придется геттеры называть getHuita, как в джаве, что гораздо заебнее.
Сорта говна. Использую тот стиль, что в коде вокруг и мне глубоко похуй на него.
Я ньюфаг (иду нахуй).
Я хочу чтобы мое приложение дебаг мессаджи показывало в отдельной консоли (в нескольких отдельных для разных вещей).
Я понимаю, что мне нужно из родительского приложения запускать процессы консолей, но ума не приложу как организовать между ними обмен данных.
Хочется чтобы в родительском приложении был интерфейс типа
void OpenConsole( enum target );
void MakeEntry( enum target, char* message );
то есть никаких наворотов. Таргет это целевая консоль, их ограниченный список.
Как мне в процессе с таргет консолью принимать эти мессаджи из родительского?
Напоминаю: я ньюфаг и хуй.
Тогда кури WinAPI, иначе можно было бы наверное использовать файлы-дырки.
никто не хочет в Европе работать?
никуда не уходи, скину линк через час
Окей.
Расскажи, что реально вы хотите увидеть в кандидате. Я уже не раз сталкивался, что по описанию я 100% подхожу, а когда дело доходит до приглашения на интервью, то "ой, а у вас еще <то, чего не было в вакансии> нет" или "ой а у вас слишком специфический опыт".
Еще мне интересен требуемый уровень английского. У меня он не fluent, но говорить могу.
1.5+ года в С++, оверолл 6+ в айти(суровый саппорт). Жил\работал в Швеции пару месяцев, теперь хочу в Европку на ПМЖ, английский свободный разговорный. По уровню сказал бы, что между джуном и мидлом, не долбоеб. Есть шансы?
знание плюсов: от низкоуровнего кода до метапрограммирования. gtest/gmock. Linux environment.
English upper mediate и выше. придется много общаться с голландцами и немцами.
int array[10];
int array1=array;
Почему begin() и end(), также как и range for использовать с array можно, а с array1 нет? Ведь array это же тоже int.
И где прочитать про то, почему именно так продизайнили, не как, а именно почему, с какой целью. В стандарте это есть?
уххх какой трипл. Не, я офк скажу, рефбонусы дело полезное
сначала мне. я с тобой побщаюсь, потом к эйчарам пойдем
Потому что array это массив, для него известна длина и компилятор может сгенерировать end() для него. array1 это просто указатель. Неизвестно даже указывает он вообще именно на буфер или просто на одно значение. И не известен размер буфера - следовательно невозможно сгенерировть end().
Спасибо за ответ.
Но array ведь тоже преобразовывается в "просто указатель". Или компилятор помечает этот указатель каким-то образом , видя [10] (я чую опять неочевидную хуйню)?
ты сам принимаешь решение? Вроде тимлид, а вроде и бонус какой-то ждешь за инвайт.
рефервл бонус дают тому, кто привел нового сотрудника.
просто вполне возможно что я буду тех собеседование проводить. и мое решение будет влиять на результат.
забыл указать. c++03. энжой аур легаси. раньше 2018 новый стандарт не можем использовать
фу бля. А чего так? У вас же linux environment. Проприетарный компилятор юзаете?
сдк. есть очень крупный кастомер с vs2008. чтоб он разорился, сука
у меня нет опыта с железом. Это статический анализ железнячих проектов. Там был отдельная команда hardware-разработчиков, которые объясняли software-dev'ам, что какие фичи нужно пилить.
у меня CET+1, разница небольшая.
Не помечает (array обычный указатель), но размер известен и он может использоваться когда нужно (например для выделения памяти под массив).
Я кажись понял. VS15 совсем разучился работать со статическими библиотеками.
http://ideone.com/BJRRw4
Что тебя удивляет? У тебя рекурсивное определение без остановки. Юзай enable_if
По делу.
Есть словарь примерного вида - 2 байта - номер параметра, 2 байта - длина байт значения этого параметра в бд, 1 байт - тип данных в бд(параметр может быть записан как long, float, int, char[n]), 20 байт - название.
Всего 200 параметров.
Теперь по базе данных.
Первые 15 байт одинаковая информация для каждой строки (длина этой строки в байтах, ключевой параметр и пр.), далее следует анал-карнавал - 1 байт номер параметра в справочнике, потом длина байт для значения по справочнику и так идет до конца строки, затем опять новая строка, где первые 15 байт практически идентичны 15 байтам предидущей строки, дальше снова идут параметры в таком же виде. Всего в строке может быть от 1 до 200 параметров. Количество строк с параметрами не ограничено.
Проблема возникла со считыванием данных. Конечно, можно создать структуру со всеми 200 параметрами и просто заполнять в нее каждую строку и закидывать эти структуры в массив, но жалко тратить память на неиспользуемые параметры. Массив ассоциативных массивов создавать тоже не вариант, параметры в строках разного типа.
boost::any
> Массив ассоциативных массивов создавать тоже не вариант, параметры в строках разного типа
Это самый норм вариант, если я правильно тебя понял. Тебе нужно создать класс Параметр и хранить в ассоциативном массиве его. А от этого класса уже отнаследовать все возможные типы.
Это плохая архитектура, потому что когда ты пытаешься делать доступ по интерфейсу к разнотипным объектам, остается только пересечение. Лучше сделать, чтобы метод ему возвращал что-то типа maybe, ну или бросал исключение, если элементы отсутствуют совсем редко.
for (int (&i)[3] : array){
for (auto j : i)
cout << j << " ";
cout << std::endl;
}
Почему на месте "int (&i)[3]" если просто поставить "auto i", то ошибка?
tagged union
int array[2][3];
for (int (&i)[3] : array){
for (auto j : i)
cout << j << " ";
cout << std::endl;
}
>>739944
auto &i : array
>>739951
По стандарту. Ну и как-то логично, что в конструкторе все элементы класса уже должны быть инициализированы, иначе с чем ты работать будешь.
Чтобы в конструкторе класса хозяина с ним можно было работать.
Ох спасибо, стало лучше.
sprintf пока пристроил на примере:
float hp = 289.6965416518;
char buf[128];
sprintf(buf, "%.1f", hp);
string sHp = buf;
life_bar_tooltip.setString("hp:" + sHp);
Вроде 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;
И вы еще при этом утверждаете, что оптимизирующие компиляторы все сами сделают, что кресты быстрый язык, пидоры.
>Посмотрите только сколько ассемблерных действий происходит во время выделения памяти под указатель
4 действия.
Батя, ну ты че. Дай потроллить немного.
>Кроличья нора крестов практически бездонна, поэтому продолжать постигать тонкости и детали можно очень и очень долго.
Действительно, кошмарный язык для пердоленья, а не программирования.
гугл, шапку
Ну, он как бэ интерфейс. У него нечего инициализировать))0))
Лет через 10 может и будет. Сейчас там ни либ, ни тулзов, ни кроссплатформенности.
>кроссплатформенности
Поддерживает всё, под что работает (и будет работать) бэкэнд LLVM. Хотя учитывая что плюсы используют только на десктопе и серверах – всё что уже нужно.
С остальным – ну в принципе да, хотя 2/3 плюсовых тулзов там вообще не нужно.
>Хотя учитывая что плюсы используют только на десктопе и серверах
Ты забыл про микроконтроллеры и мобилки как минимум.
В микроконтроллерах – нет. Мобилки – ок, хотя LLVM на арм вполне себе компилируется.
>В микроконтроллерах – нет
Давно уже да, особенно на 32-битных. В любом случае, с крестами пердолится надо в разы меньше, чтобы что-то собрать под нужную платформу.
Когда я с ними сталкивался успел запомить разве что свежий запах самописных сишных компиляторов, с которыми половину приходилось писать на асме – пердолинга было меньше.
Сейчас-то что нибудь изменилось? Прям где-то нормальная поддержка плюсов а не си с классами?
>свежий запах самописных сишных компиляторов
Gcc есть сейчас почти для всего. Для остального плюсы и не нужны.
>нормальная поддержка плюсов
Стандартной библиотеки часто нет.
Деструкторы, темплейты, оверлоад функций и операторов, неймспейсы. Сейчас еще и лямбды.
>Какие аналоги PEP8 есть для крестов?
Была дока от гугла, есть гнушный, есть не гнушный.
http://geosoft.no/development/cppstyle.html
http://www.possibility.com/Cpp/CppCodingStandard.html
и т.д. и т.п.
>Есть какие-нибудь плагины для пердолинга индентации в визуал студии?
А чего в ванильной не хватает?
В 6ой строке в ретурне временный объект не создаётся?
Разыменовывать указатель, но его значение никуда не записывается, а в ссылку кастится.
A - это не массив функций, ты завалил задание.
Превзойти мое решение через темплейты никому не удастся
Ну смотри, есть у тебя два класса
class A {
public:
--
}
class B: public A {
public:
--
protected:
int lolka;
}
Если ты приведешь A к B, то в A::lolka у тебя будет мусор, а если попытаешься чему-нибудь присвоить, то вообще можешь затереть чью-то память или что-то сломать. По-моему, приводить базовый к наследнику это вообще вандализм и неправильно, так не должно быть никогда.
>И вообще дайте подробности про приведения.
Что именно тебе о них хочется узнать? Неужели мало инфы?
>>742047
Ты о size_t или о чем?
size_t используется не только для количества символов, а для количества любых данных, и еще он возвращается sizeof.
Размер size_t на каждой конкретной системе подобран таким образом что он заведомо больше размеров любого буфера памяти который возможно выделить на этой системе. Тоесть храня смещения в памяти с помощью size_t ты никогда не получишь переполнения, его всегда хватит. Что для других типов не гарантируется.
Обложку Кохл Корутин - Избранное.
> Если ты приведешь A к B, то в A::lolka у тебя будет мусор
Т.е. при приведении память для А как-то перевыделится? Интересует как оно внутри устроено
Нет, просто память по адресу А будет использоваться как для типа B, при том что выделена под А.
Короче, это как напялить обувь другого размера. Вроде сидит, но либо болтается, либо жмёт.
Из-за множественного наследования. Смещение от наследника к родителю всегда известно, а в другую сторону оно может быть какое угодно.
Нихуя не перевыделится. До каста будет считаться что объект лежит в 16 (к примеру) байтах. После каста будет считаться что объект лежит в 16 плюс следующие 32 (к примеру) байта. А так как те 32 байта от левой хуйни то ничего хорошего из этого не получится.
Ничего не перевыделяется, просто указатель после преобразования смещается на некоторое количество байт.
Например, если есть struct A : B, C {}, то в памяти будут расположены сначала поля B, потом C, потом то, что добавляет А. Если тебе нужно скастовать A в C, то указатель будет считаться как указатель на А плюс размер В.
>Получается неявно и A к В или С не приведется?
Приведется - смещение от А к родителям компилятору всегда известно.
>Или неправильно приведется?
static_cast всегда будет правильным. С-каст будет правильным только для А к В, поскольку у них смещение нулевое.
Хм, тогда как вообще адресация по членам класса происходит? Если с помощью смещения, то проблемы приведения базового к дочернему тоже нет. У дочернего сначала идут поля базового класса, потом свои. При обращении к полям базового они будут в начале все ок, а при обращении к не существующим - ошибка, такая же как и при обращении из базового к дочерним.
1. Для чего нужен .NET Framework, и какую версию его лучше юзать? У меня по дефолту стоит 4.5.2, но там есть 4.6.0.
2. Я по вашему совету скачал Вижуал Студию, сделал в ней хеллоу ворлд, а он не запускается. Вернее, запускается какое-то окно на 0.1 секунды. Что я не так делаю?
1. .NET фреймворк нужен для C#, а не для C++ ты ведь не собрался писать на C++/CLI
2. добавь system("PAUSE"); перед return 0;
Ага, спасибо.
>NET фреймворк нужен для C#, а не для C++
Когда я пытаюсь создать С++ файл, пикрил.
Там сделоли чтобы по дефолту даже C++ конпелировал под дотнет. Пердоль настройкию
При множественном наследовании может быть, например A -> B, A -> C, D -> B, C. Как ты тут будешь приводить A к D?
Умоляю помогите!
тебе зачем?
Я не знаю как в памяти хранится. Я бы хранил так сначал A, потом все что от B (без А), потом все что от С (без А). А в начале смещение не нужно все ок. Если приводить B к D, то опять все ок со смещением (AB все по порядку и в B и D), а вот с приведением С к D наверное были бы проблемы. Но я думаю так сделали не только из-за этого, наверное будут какие-то проблемы с вызовом методов, просто я тупой и не могу понять какие.
Открываешь свою любимую IDE, подключаешь хэдер set/map/queue, создаешь переменную нужного типа, тыкаешь правой кнопкой мыши по ее типу и выбираешь что-то вроде "перейти к определению".
ЗЫ static_cast же правильно приводит при множественном наследовании, значит теоретически можно сделать и правильно приведение C к D
А ты что-то в этом понимаешь.
>добавь system("PAUSE"); перед return 0
Вот за такое в любом приличном месте пиздят клавиатурой по еблу. Студия дала вам настройку подсистемы, установи SUBSYSTEM:Console! Не хочу, хочу писать костыли. Небось еще локаль выставляешь каждый раз изнутри кода?
Слушай, для новичка дописать одну строчку явно проще, чем лазить в настройках IDE и чего-то там ковырять для того, чтобы консолька не закрывалась при завершении программы.
А клавиатурой по еблу пиздят чаще тех, кто в приличных местах выебывается вместо того, чтобы вежливо посоветовать более оптимальное решение.
Давно не писал на сишко и крестопараше, но мой шиндовариант привлекал тем, что можно было PRESS ANY KEY TO CONTINUE, а в твоем обязательно жмякать ентер. Не знаю почему, меня это раздражало.
>>742338
>>742346
>>742349
>>742356
>>742387
>>742390
>>742442
Собрались куча даунов и устроили оргию неграмотности. Идите нахуй отсюда.
>>742467
>Если у тебя есть конкретные цели и задачи - забей вообще и пиши на самом подходящем инструменте
Ну у меня есть цели:
>>742458
>писать программы и игры
А на счёт инструмента я не определился.
Для тебя самый лучший путь - выбрать наиболее популярный инструмент для решения твоих задач, к которому полно документации, "живых" библиотек, активное сообщество.
>писать программы и игры
Какие программы и игры? Что-нибудь совсем незамысловатое можно и на том же пистоне наваять.
Опять же, смотри популярные инструменты, движки, на чем они написаны, я не силен в геймдеве.
Реквестирую хорошую статейку по тэмплэйтам в крестах.
Хорошие (читай - с широки м охватом материала) про них только талмуды Степанова и Александерску.
>Степанова и Александерску
Ну вот зачем ты его дезинформируешь-то? У Степанова вообще все книжки про теорию CS, всякие там преобразования орбит, а про STL у него только старые статьи, да и те написаны до фактической стандартизации шаблонов. У Александреску шаблоны - средство, а не цель, а книга про проектирование.
>>742494
>>742488
Если тебе интересны непосредственно шаблоны как механизм, а не их приложения (обобщенность, метапрограммирование), то юзай Вандевурда-Джоссатиса из шапки.
Не пробуй Александреску, ты либо сломаешь мозг и начнешь писать теплейтами как он, либо просто продолжишь пользоваться ими как все нормальные люди.
>либо просто продолжишь пользоваться ими как все нормальные люди.
Все нормальные люди избегают этой параши как только могут.
Нормальные темплейты есть только в дишечке. Которую пилит Александреску, ага.
Темплейты задумывались не для того как их использует Александреску, а ди вообще язык без задач
Просто я не видел ниодного реального проекта или задачи, где нужно было извращаться с метапрограммированием. Как только я увижу что для какой-то задачи метапрограммированние на шаблонах лучше чем что-то еще, я изменю свое мнение. Но скорее всего для этой задачи я просто возьму какой-нибудь другой язык
Самый такой элементарный пример. Процентов 50 кода, который ты пишешь каждый день - всякие конструкторы, инициализаторы, копирование, перегруженные операторы, проверки инвариантов, гарантии безопасности исключений, виртуальность деструктора, синглтоновость etc, можно написать один раз и вынести в стратегии. Сразу долой огромное количество ошибок и потенциальных выстрелов в ногу из-за того, что ты забыл что-то явно указать. Просто наследуешься от нужных стратегий и пишешь только код по существу.
Задача ди - сделать кресты с нормальной библиотекой и без выстрелов в ногу и костылей.
50% кода который я пишу каждый день это не конструкторы и т.д. что ты там написал. Я не создаю классы половину своего рабочего времени, максимум 2 раза в месяц для какой-то новой функциональности наследуюсь и переопределяю методы. Я честно не помню когда что-либо приходилось писать прям с нуля.
А как же стать популярней крестов? Зачем нужен язык которым никто не пользуется?
На мой взгляд, единственной меркой качества языка является его успешность. Если D не выстрелил, значит, с ним что-то не так. Можно сколько угодно кукарекать про тонны крестового легаси и отсутствие пиара, но факт остается фактом - если язык не используется, то идиотизмом будет вкатываться в него всерьез. Мы тут не шутки шутим, надо работать, а не заниматься бета-тестированием для веселых румынов, обивая пороги на SO в поисках ответов на элементарные вопросы.
>обивая пороги на SO в поисках ответов на элементарные вопросы.
А в крестах не обиваешь, лол?
>будет вкатываться в него всерьез
Это не кресты. В него "вкатиться всерьез" можно за неделю, бо не нужно заучивать поведение говна и выстрелов в ногу и механизмы костылей. Он просто работает.
Понимаю, поэтому я и не говорю об универсальности. Зачастую ты берешь либы/фреймворки и пишешь просто логику, опираясь на их структуру. Но когда ты сам пишешь либу/фреймворк или занимаешься непосредственно проектированием кода, то полезность шаблонов трудно переоценить.
Объясняю как обстоит дело на рынке. Ты либо приходишь в проект, либо начинаешь проект. Приходишь ты в проект на язык который знаешь, этот вариант рассматривать не будем. Начинаешь ты проект на любом языке и к тебе идут люди со знанием этого языка. А теперь ответь сколько людей знают Д? А яву? А кресты?
А сколько нужно людей, чтобы писать на яве или крестах? А читаемость кода?
А если смотреть, за сколько времени он учится - то тут он на пару порядков уделает кресты с жабой. Собсно это и есть помесь крестов и жабы минус стрельба по ногам.
Есть эта самая таблица (вектор структур), которую я считываю из файла, имеющего размер size. Считывая из файла с помощью функции получаю ключ (номер элемента массива), моя задача забить этот массив линейно, с определенным шагом. Т.е. если ячейка массива уже занята - двигаюсь дальше на шаг и так до конца. Когда дохожу до конца - начинаю искать место сначала и до этой ячейки. Последовательность действий:
Разбил ее на две функции. Первая
1. Проверяю вектор на заполненность, если пустых ячеек нет - делаю resize на step
2. Проверяю размер ключа, если он больше, либо равен размеру вектора - присваиваю ключу ноль
3. Вызываю основную функцию заполнения вектора, передавая в нее ключ, данные и размер вектора (потом станет понятно зачем)
Вторая функция
1. Начинаю искать место для ключа, проверяя свободна ли эта ячейка или нет, если занята - увеличиваю шаг и проверяю пока не дойду до конца (того самого размера массива). Помимо этого есть булевская переменная которая при нахождении места для ключа дает ТРУ.
2. Проверяю ТРУ ИЛИ НЕ ТРУ. Если не тру: вызываю функцию рекурсивно, передавая в качестве ключа 0 (ищем теперь не с ключа, а сначала), а в качестве размера поиска (в пред пункте размер массива) я передаю ключ, чтобы не повторять действия выполненные в пункте 1
Так вот, хуйня в том, что если мой массив будет размером и колвом элементов n, то с шагом равным 1 он забьет этот массив, все заебись. Даже если я увеличу кол-во элементов - он ресайзнется, норм работает в общем, НО, если я делаю шаг равным 2 - ломается нахуй. Проблемы с выделением памяти.
В чем мой алгоритм плох? С хуя он выходил за рамки, если по идее сделав шаг, который в сумме даст размер больший n - я просто начну искать место сначала, а проверка на забитость у меня еще до заполнения.
>Поэтому мы всегда знаем, где его голова, а где хвост.
Если на планете используется little-endian, то барашку не поздоровится.
Я тебе сейчас секрет открою: ди и без того используется в крупных проектах. Та же Remedy использует его не один год во всех своих ААА проектах.
Тут дело в людях.
Ну возможно, спорить не буду. Просто даже в наших велосипедных самописных либах я не встречал шаблонов, кроме как для написания своих контейнеров. Просто от Александреску у меня сложилось впечатление что он все пишет только на шаблонах трудно читаемый код и никак иначе.
>А в крестах не обиваешь, лол?
В крестах накоплено огромное количество знаний, на поиск ответов уходят секунды.
>В него "вкатиться всерьез" можно за неделю
Я подразумеваю не освоение языка, а переход на него в реальной работе. Нужен софт, нужны хорошие практики, нужны набитые шишки, в конце концов. А их нет. Поэтому тот, кто начнет серьезный проект на D, будет как раз набивать шишки и нарабатывать опыт для себя и других. А можно потратить это время и силы по существу, если не сходить с проторенной дороги без необходимости.
Открой исходники STL или того же boost, например. Чем крупнее и универсальнее либа, тем больше необходимость.
Remedy всплывает почти в каждом споре про D, лол. Одного крупного проекта недостаточно для выработки best practices, нужны сотни.
>В крестах накоплено огромное количество знаний, на поиск ответов уходят секунды.
А в D эти знания тупо не нужны. Там просто есть стандартная библиотека, в которой есть все что нужно. И в средствах языка есть абсолютно все, что нужно. Там не нужно искать "как накостылить то или это". Там не нужен буст. Чтобы на нем кодить - не нужен SO вообще, и гуглить какие-то костыли. Достаточно просто прочитать доку к его библиотеке.
>Нужен софт, нужны хорошие практики
Блин - это просто улучшенные жабокресты. Юзаешь те же самые практики, просто минус костыли.
Там не нужно блин читать стопицот книжек по тонкостям шаблонов как в крестах - потому что там шаблоны пишутся нормально.
Простота языка еще никогда не позволяла сажать макак на места сениоров. В любом случае макаки будут решать свои задачи, а специалисты - свои. Возможно, их жизнь будет легче, но кого это ебет, если ты банально не сможешь найти столько людей?
Количество людей зависит от размера проекта. Я просто не могу поверить, что для написания какого-нибудь интерпрайза с одинаковым функционалом людей со знанием ди нужно в два (3, 4 и т.д) раз меньше, хотя бы потому что на ди не написано столько фреймворков на все случаи жизни
Аж 3 ААА игрушки, куча проектов в проде (каждый год куча народу на dconf из новых компаний выступает).
Вот конкретно какие практити плюсов ты используешь? Виртуальный деструктор?
>Задача ди - сделать кресты с нормальной библиотекой и без выстрелов в ногу и костылей
Поясните, а что в С++ за костыли и выстрелы в ноги?
Для ди просто не нужны фреймворки, лол.
Там просто есть нормальная стандартная библиотека.
90% того, что пилят Qt или буст - там или встроено в язык, или в библиотеку.
Это в крестах - сколько там вариантов строк? std::string, char*, QString, cv::string, что-то из буста для питона? Кто больше вспомнит?
То же самое для массивов, умных указателей, неба и аллаха.
Да я же не говорю что не нужны совсем, я говорю что большинству не нужны. В том числе и мне.
Жди, может начнут пилить для ди свои фремворки, обертки над стандартной библиотекой и там все это появится. Ведь программисты любят писать свои велосипеды
Что же получется, крестоносцы сами ругают свой язык, но продолжают жрать кактус?
суть то ясна, все просто, но вот как создавать их, добавлять, как-либо упорядочивать их, етс?
Ну они там есть. Vibe.d К примеру, что-то вроде RoR, для сайтиков.
Но в отличие от него, кресты в голом виде неюзабельны - нужно обязательно накатывать Qt или буст, чтобы их уже как то юзать. А они реализуют пересекающуюся функциональность.
Это же как нужно писать чтобы ifndef'ы совпали ...
Ну они пытаются прикрутить все это костылями. Вон модульность обещали как-то прихреначить - но в ++17 таки обломали.
Чтобы понять деревья, нужно знать основы теории графов, это несложно на самом деле, больше учить новые термины.
Списки ещё легче. Вообще берешь любую книгу по дискретке или алгоритмам, находишь главы про структуры данных, графы, и читаешь. Там всё это есть.
Это что-то уровня аргумента хаскеллистов про "если собралось, то 99% работает правильно". Давай по пунктам:
1. Я использую VS с кучей плюшек, наподобие визуальной отладки. Что может предложить инфраструктура D, чтобы погроммист получил сравнимые удобства? Сколько всего IDE для D и какова вероятность, что каждый сможет перекатиться со своей IDE на новую, не прожигая стул от ее ущербности?
2. Я хочу сделать хитровыебанную хуйню, которой точно нет в стандартных библиотеках. Сортировать графы графов аудиокодеков, епту. В крестах я гуглю и нахожу стороннюю либу в 99% случаев. В скольки процентах случаев я найду таковую на D? Сколько денег понадобится на содержание дополнительных макак, ответственных за прикручивание библиотек из других языков к D? Что делать с принципиально непробрасываемыми вещами типа тестовых фреймворков?
> кресты в голом виде неюзабельны
а никому и в голову не приходило в стандартную библиотеку все тащить, или писать каждый раз свои велосипеды
основы теории графов знаю, но не понимаю, как это соотносится. я говорю, смысол деревьев и списков мне ясен, а вот все остальное - нет
>Сколько всего IDE для D и какова вероятность, что каждый сможет перекатиться со своей IDE на новую, не прожигая стул от ее ущербности?
Нормальных две - плагин для идеи, и плагин для xamarin studio - monodevelop (эта мне нравится больше). Есть еще плагин для визуалстудии, но его я не пробовал, потому как у меня линупс, а она не кроссплатформенная.
Есть еще на эклипсе - мне не понравилась, вариант для KDevelop (только линупс + вечная альфаверсия, не рассматриваю), плюс велосипеды написаные на самом себе.
>Сортировать графы графов аудиокодеков, епту.
Тут охрененная стандартная библиотека, в частности - охрененные шаблоны. Сортируй что хочешь, просто заинклудь std.algorythm и хоть обдрочись, там реально все на все случаи жизни.
>В скольки процентах случаев я найду таковую на D?
Что именно например?
И да - ди просто может юзать сишные и крестовые либы, они совместимы.
>Что делать с принципиально непробрасываемыми вещами типа тестовых фреймворков?
Юниттесты уже встроены в язык и систему сборки. И еще какие-то контракты, их я не пробовал.
> Сколько всего IDE для D и какова вероятность
Как минимум 2 полноценные (1 из них плагин к студии), т.е. как и у плюсов - либо божественные и тормозящие одновременно цлион и студия, либо инвалиды вроде креатора, которые пидорасятся от любого более менее хитровыебаного кода.
>ответственных за прикручивание библиотек из других языков к D
Там всё что нужно прикручивается из тех же плюсов копипастой с минимальным рефакторингом и 1 лишней строчкой кода.
>Что делать с принципиально непробрасываемыми вещами типа тестовых фреймворков?
Непереносимые вещи лучше оставить там, где они были изначально. Если ты изначально брал чужую библиотеку - сомневаюсь, что горишь желанием её редактировать.
Что остальное? Алгоритмы сортировки? Так читай есть разные деревья, для них свои сортировки
Вот именно, что описал весь алгоритм. Какие могут быть проблемы с ресайзом? Проблема видимо в алгоритме, возможно где-то просчитался или что-то забыл
> делаю шаг равным 2
Если у тебя массив с четным количеством элементов то с шагом два ты пройдешь только по половине элементов.
>И да - ди просто может юзать сишные и крестовые либы, они совместимы.
А про сишку - и вовсе считай надмножество сишки, там как часть стандартной библиотеки - запендюрена как import core.stdc. Плюс платформозависимые вещи для упарывания сисколлами, posix-хуесикс.
Это вообще просто. Грубо говоря ты хранишь значение и указатель на следующий элемент, при добавлении элемента делаешь new, при удалении бегишь в конец и удаляешь, потом снова, пока так все не удалишь. Сортировать можешь хоть пузырьком, просто указатели устанавливаешь на другие элементы
>>742623
Хорошо, все-таки неправильно будет на такое писать возражения с дивана. Я попробую заюзать анонсированное тобой, и потом сможем более аргументированно посраться, если захочешь.
В чем разница? Зачем для динамической линковки нужна статическая либа?
Ну можно и без хедеров, просто гемора больше.
Да нет. Я подключаю dll, а VS просит lib
Ди - у нас все есть, но никто не пользуется
У крестогоспод ifstream сам открывает файл в нужном режиме, сам приводит прочитанные куски файла к нужному виду? нихуя себе йоба, а я в жопу пердолился с няшной чистой
А я кстати собираюсь написать на D свою борду, лол.
А каких фич тебе там не хватает?
Мне не хватает нативной гуйни, а-ля import gui.*
Пока перебиваюсь биндингом dqml.
Количество проектов, обсуждение языка. На хипстерском го много кода, много статей, все о нем говорят, на том же хабре ни дня без статьи про го, а про Ди я вообще ничего не слышу
Зачем тебе это, это сродни дрочки на количество подписчиков на ютабе?
>>742703
Но при этом ди гораздо лучше хипсторского го.
Го пиарит гугл, го - типо "инновация". Дишка - же просто "кресты 2.0".
Его никто не учит с нуля - не модно. На него только с крестов спрыгивают.
Впрочем, и на хабре есть статьи о нем, пусть и не так много.
https://habrahabr.ru/hub/d/
Статьить нечего - он довольно прост. У него отличная документация без подводных камней - если просто пойти ее копипастить - какашками обольют.
У крестов же "популярность" (как и у сишки) очень просто объясняется - их преподают в вузиках и школах.
Мне кажется не особо как-то спрыгивают. Никто не будет перписывать старый код, да и вообще народ как-то с опаской смотрит на Ди, как и на раст.
Вот и ответ - старый код не переписывают, а новый - а все уже написано, лол.
AddInTable(0, name, number, key);
Под конец у тебя key будет >= last, и если он не найдет элемент за один проход, а потом еще и за второй, то выйдет за пределы при проверке. Видимо, ты хотел сделать от 0 до изначального key, тогда тебе в начало функции надо вставить что-то вроде const int originalKey = key; и затем делать AddInTable(0, name, number, originalKey);
Кстати:
>good != true
>good == false
Криво же выглядит, используй !good.
Паскаль тоже преподают, по твоей логике все должны писать на нем тоже. Жабу и похапе не преподают, почему же они в топе? Хуевый аргумент, короче, не находишь?
Разве что на спецкурсах или в шибко продвинутых универах. Стандартный курс: паскаль-асм-няшная-кресты-лисп.
Херню несешь. Жабу преподают массово что в западных универах, что у нас.
Да и насчет паскаля ты не ошибся - дельфи еще дохрена где остался. Но все так же - старый код.
есть static library (.lib, содержащая бинарный код)
есть dynamic library (dll)
dll, в свою очередь можно линковать двумя способами - implicit (статически) и в рантайме explicit(на самом деле смособов больше, есть еще отложенная)
для implicit linking тебе тоже потребуется .lib файл, но только с секцией экспорта, те она работает как библиотека импорта здесь, а не как хранилище оттранслированого бинарного кода
Взял пример из статьи
https://ru.wikipedia.org/wiki/Message_Passing_Interface
http://pastebin.com/b2uztEqG
Все работает, вычисляет в несколько потоков. Но преподаватель хочет, чтобы считало другим методом, например, через другие ряды https://ru.wikipedia.org/wiki/Пи_(число). Как это реализовать?
Берешь <random> и считаешь Бюффоном, самое то для распараллеливания.
А в чем проблема? Берешь любой ряд и пусть каждый процессор вычисляет свой кусок этого ряда. Все члены ряда зависят только от своего индекса, от соседних членов не зависят, поэтому проблем с распараллеливанием здесь нет никаких.
Ты не можешь найти кусок в коде, где происходит вычисление кусочка ряда (он, между прочим, откомментирован и там это место обозначено) и подменить одну формулу на другую?
Двачую этого
Два семестра Java были после паскаля, крестов и дельфи
Про качество, конечно, говорить не буду, но ебалом в документацию окунули - уже хорошо
мимо-из-рггму
Ну так почитай и разберись. Когда у тебя возникнут конкретные вопросы — тогда приходи, поможем.
Честное слово, я не против помочь человеку, который пытается разобраться, но на чем-то застрял, но мне дико бомбит от халявщиков, которые ничего читать и гуглить не хотят, а желают, чтобы им на блюдечке готовые решения давали.
«Я раньше с Х не сталкивался и не работал» — это не оправдание. Все мы раньше не сталкивались и не работал ни с чем, но как-то разобрались, знаешь.
Ресурсы по плюсам есть в шапке, про mpi можешь почитать, например, тут https://habrahabr.ru/post/121925/ или про любой другой ссылке в гугле про запросу "c++ mpi". Удачи.
Есть функция в отдельном файле:
#include "MyForm.h"
void showvec(System::Windows::Forms::TextBox^ &textBox)
{
textBox->Text = "";
}
В нее, по идее, должен поступать адрес textbox->text и в функции этот параметр изменяться. Компилятор на функцию не ругается, а вот вызов не работает.
Говорю за ВМК-факультеты универов, специальность ПМиИ. В МГУ, КГУ, НГУ так. В институтах, возможно, другая программа.
Во-первых, отладчиком пройдись и посмотри, заходит он в эту функцию вообще или нет
Во-вторых, ты правильно разыменовываешь ссылки? У тебя там навешана и шарповская ссылка и сишная, ты уверен, что это так нужно разыменовывать?
С формами и классами я в первый раз. В функцию не заходит, т.к. неоткуда. Я ее вызвать не могу. Насколько я понимаю:
Тип_результата имя_функции(тип_формального_параматра имя_формального_параметра)
По другому разыменовать не могу - ругается.
Честно говоря, мне стыдно. Перепробовал несколько, вот самый адекватный из них:
showvec(&textBox1);
>>743628
>>743624
Ты нормально покажи весь код, что откуда вызывается. По функции из одной строчки никто ничего тебе не скажет.
void showvec(System::String^ textBox)
вот таким вот объявление функции сделай
^ -- это уже ссылка, добавлять & или * не нужно
Спасибо, теперь компилятор не ругается! Но функция не работает, гугл говорит, что '^' - это побитовое исключение.
Может, я ошибся с вызовом?
showvec(textBox1->Text);
Но ведь я не могу так вызвать(+ только что проверил)
Класс схож со структурой.
Если у меня структура:
struct randomstruct
{
char c[10];
char d[10];
}
и переменная
randomstruct a;
То чтобы что-то записать в 'а', я должен указать элемент структуры:
a.b='g'
ой фак, я тебе не то скопировал
вот так у тебя функция должна быть объявлена:
void showvec(System::Windows::Forms::TextBox^ textBox)
вот так ты её доложен вызывать:
showvec(textBox1);
>>743721
Тип System::Windows::Forms::TextBox^ -- это шарповская ссылка, что-то вроде shared_ptr, только со свистелками, считай что это просто умная обертка над указателем. Когда ты пишешь showvec(textBox1); ты передаешь внутрь функции указатель на своей текстБокс и используешь его внутри. Никаких присваиваний структур делать не надо.
Спасибо, я уже не смогу сегодня проверить. Час с копейками на меня потратил... Отпишусь потом.
Может компилятор выкинул нахуй. Ты там гарантировано за буфер вылазишь, это UB - тоесть компилятор может засунуть туда что угодно, хоть винт отформатировать и это будет полностью соответствовать стандарту.
ОС передает. Читай в документации к своей операционной системе.
>>744495
Чем бы твой "вижуалз" небыл, это врядли что-то меняет. Если ты объявил массив foo размера bar то читать или писать в foo[bar] ты не можешь. Это UB.
>ОС передает. Читай в документации к своей операционной системе.
Посмотрел сейчас в дебаггере и выяснил, что шиндовс предварительно обрезает все лишние пробелы из argv.
Правда по адресу, где оно находится, предварительно лежит в памяти какое-то дерьмо неясного происхождения.
Дополнительные ссылки на документацию приветсвуются.
> 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.
Нашел. Вроде оно.
Указатели argv[0]...argv[argc-1] ссылаются на участки памяти, где лежат аргументы командной строки.
Указатель argv[argc] ссылается на NULL (0x00000000), как ему и положено.
А почему argv[argc+n] ссылаются на рандомные(?) участки памяти? Ну по крайней мере отладчик студии мне именно это показывает. Так и должно быть?
Потому что это уже не часть массива 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.
Запусти свою программу из-под OllyDbg, вообще охуеешь, как там все устроено. Любопытство - это здорово, вообще-то. Если ты не растеряешь его и научишься ставить настоящие вопросы, то цены тебе не будет, братюнь.
>>std::cin >> n;
Считывает только число, отставляя '\n' в буфере, который подбирается первым getline
>сработает защита и выбросится SEH (как правило)
Полез читать что такое SEH я нюфаня и обнаружил такое письмо, от автора SEH:
https://www.justice.gov/sites/default/files/atr/legacy/2006/03/03/1341.pdf
А Билл Гейтс голова! Посоны, а вы умеете преобразовывать код из Паскаля в С++ и из С++ в Джаву?
lol, по-твоему вся память начиная argv+argc должна нулями забиваться. Сам понимаешь что это бред?
Тем не менее, по факту часто вся свободная память забивается в режиме отладки нулями, 0xDEADBEEF или чем-то подобным.
Смотри, существует такая штука как пейджинг (paging), погугли и почитай что это такое. Если вкратце -- те адреса, которые ты имеешь в своей программе -- это не физические адреса реальных ячеек в оперативной памяти, а виртуальные адреса, которые операционная система отображает на реальные ячейки памяти. У каждого процесса в системе есть виртуальная таблица страниц отображенной для него памяти. Каждый указатель в твоей программе -- это, грубо говоря, индекс в этой таблице. Когда ты обращаешься к памяти по какому-либо указателю, система за кулисами идет в эту таблицу, смотрит на индекс и если в этой таблице такой индекс есть, то она читает ячейки соответствующие записи в таблице по этому индексу. Если такого индекса в таблице нет, то бросается исключение что-то вроде access violation, мол, полез ты не в свою память, дружок, хуй тебе. На процессоре дергается прерывание и в программу твою прилетает сигнал SIGSEGV (это в posix, что там в винде я не знаю), который её и грохает (если ты, конечно, не перехватываешь его, но это уже другая история).
Стоит еще сказать, что память выделяется кусками -- страницами. Если ты выделишь память в один байт, то для твоей программы выделится целая страница, поэтому если ты напишешь, скажем, что-то такое: char x = new char; (x+1) = 42; То с высокой долей вероятности у тебя программа не упадет, несмотря на то, что ты юзаешь невыделенную память. Но может и упасть, если компилятор соптимизирует код таким образом, что этот байт будет выделен где-то на конце страницы, но это OCHE маловероятно.
Когда ты свою прогу запускаешь, система выделяет для неё память и куда-то в эту память кладет аргументы командной строки. Соответственно по указателям на эти аргументы есть записи в табличке страниц и когда ты из них читаешь все хорошо. Вероятно эти страницы помечены флагом readonly и если ты попробуешь в них что-то писать, тебя система пидорнет. Когда ты начинаешь итерироваться по argv[argc+n], первое время ты итерируешься по уже выделенной странице, т.к. маловероятно что аргументы так удачно выровнятся, что попадут прямо в конец страницы и следующий же байт окажется на другой странице, скорее всего впереди еще есть сколько-то байт до конца страницы и ты можешь из них читать. Но рано или поздно ты дойдешь до конца страницы и уже следующий байт будет ссылаться на несуществующую запись в таблице страниц и система тебя грохнет способом который я описал выше.
Вообще если тебе интересна эта тема, почитай Таниенбаума, он всю эту кухню по хардкору расписывает.
Смотри, существует такая штука как пейджинг (paging), погугли и почитай что это такое. Если вкратце -- те адреса, которые ты имеешь в своей программе -- это не физические адреса реальных ячеек в оперативной памяти, а виртуальные адреса, которые операционная система отображает на реальные ячейки памяти. У каждого процесса в системе есть виртуальная таблица страниц отображенной для него памяти. Каждый указатель в твоей программе -- это, грубо говоря, индекс в этой таблице. Когда ты обращаешься к памяти по какому-либо указателю, система за кулисами идет в эту таблицу, смотрит на индекс и если в этой таблице такой индекс есть, то она читает ячейки соответствующие записи в таблице по этому индексу. Если такого индекса в таблице нет, то бросается исключение что-то вроде access violation, мол, полез ты не в свою память, дружок, хуй тебе. На процессоре дергается прерывание и в программу твою прилетает сигнал SIGSEGV (это в posix, что там в винде я не знаю), который её и грохает (если ты, конечно, не перехватываешь его, но это уже другая история).
Стоит еще сказать, что память выделяется кусками -- страницами. Если ты выделишь память в один байт, то для твоей программы выделится целая страница, поэтому если ты напишешь, скажем, что-то такое: char x = new char; (x+1) = 42; То с высокой долей вероятности у тебя программа не упадет, несмотря на то, что ты юзаешь невыделенную память. Но может и упасть, если компилятор соптимизирует код таким образом, что этот байт будет выделен где-то на конце страницы, но это OCHE маловероятно.
Когда ты свою прогу запускаешь, система выделяет для неё память и куда-то в эту память кладет аргументы командной строки. Соответственно по указателям на эти аргументы есть записи в табличке страниц и когда ты из них читаешь все хорошо. Вероятно эти страницы помечены флагом readonly и если ты попробуешь в них что-то писать, тебя система пидорнет. Когда ты начинаешь итерироваться по argv[argc+n], первое время ты итерируешься по уже выделенной странице, т.к. маловероятно что аргументы так удачно выровнятся, что попадут прямо в конец страницы и следующий же байт окажется на другой странице, скорее всего впереди еще есть сколько-то байт до конца страницы и ты можешь из них читать. Но рано или поздно ты дойдешь до конца страницы и уже следующий байт будет ссылаться на несуществующую запись в таблице страниц и система тебя грохнет способом который я описал выше.
Вообще если тебе интересна эта тема, почитай Таниенбаума, он всю эту кухню по хардкору расписывает.
Бро, как-то ты смазанно рассказал про paging и memory regions, поэтому я добавлю:
- Раньше оперативной памяти не хватало и программисты писали некую срань под названием "оверлеи". Они перекидывали из оперативки на жесткач, кусочки программы, которые прям сейчас были не нужны. Потом олдфаги заебались и решили перекинуть этот геморрой операционной системе.
- Разработчики ОС и железа поднатужились и высрали технологию, которую назвали paging (страничной памятью). Помимо автоматического перекидывания данных из памяти на диск и обратно, оно еще дает виртуальное адресное пространство, так что программисты перестали терпеть жопоболь из-за дележки памяти с другими программами и ядром ОС.
- Помимо этого, посоны обнаружили, что ебаны в рот, кулхацкеры не дремлют и регулярно пытаются заставить комп выполнять опасный код. Для противодействия этому придумали разделение памяти на сегменты(memory regions), которые призваны запретить интерпретацию данных программы как инструкций. Поддержали сразу и программно, и в железе.
Помимо этого в intel придумали еще и сегментную память. Это такие крутые memory regions, где у каждого региона свое адресное пространство. В современных ОС не используется, потому что разработчики *nix и windows в рот ебали эту дрисню. Дело в том, что из-за нее сильно изменилась бы работа с памятью, а поскольку на других архитектурах эту ёбань не завезли, им пришлось бы дико пердолиться, поддерживая разные модели памяти для платформ. Поэтому в x64 intel выпилили нахуй сегментную память из процессора, ибо только место занимает.
https://ideone.com/TFMirB
А зачем там move-конструктор? Он лишний. Там RVO, никаких лишних действий.
Более того, если компилятор не умеет делать RVO, то по стандарту он обязан заюзать копирующий move-конструктор.
>>744949
А как так тогда получается?
http://rextester.com/FGDME69292 (Clang)
http://rextester.com/EVZMH86408 (MSVS)
2 компилятора - разный вывод, кто прав?
Все правы, это implementation defined behaviour. Стандарт разрешает, но не обязывает делать RVO, каждый дрочит как он хочет.
gcc есть везде
На подкапотном уровне тебе никто не обещал кроссплатформенности, маня. Пиздец, так можно про любой язык кукарекать А ЧИВО ЕТА РАЗМЕР БИНАРНИКА ИЗМИНИЛСЯ ПРИ ПЕРЕХОДЕ С КАЛЬКУЛЯТОРА НА СТИРАЛЬНУЮ МАШИНКУ?!!!111 НА ЛИНУПСЕ JVM ЖРЕТ НА ПОЛТОРА МЕГАБАЙТА БОЛЬШЕ РЯЯЯЯЯЯЯ!!!1111 ПИСТОН СТАЛ РАБОТАТЬ БЫСТРЕИ И МАЯ ВЕЛОСИПЕДНАЯ СИНХОРИНЗАЦИЯ ОТВОЛИЛАСЬ!!!!!11111
Ты в глаза ебешься? Поведение MSVC - это как раз тот случай, когда компилятор не умеет делать copy elision в данном конкретном случае. Вместо этого он заебенил move-семантику.
Лично меня такое поведение удивило. Вроде раньше студия умела в RVO в таком простом случае. Может баги полезли из-за внедрения move-семантики
Вообще, copy elision - единственная оптимизация, которую можно выполнять даже в тех случаях, когда у конструкторов копирования есть побочные эффекты.
Если MSVS неправ, то Герб продавит изменение стандарта и он таки станет прав.
ужас какой
#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]
Что я сделал не так?
Ты так буквы в строке меняешь? Тогда auto &bukva
boost::thread* t = new boost::thread( boost::bind(&Player::use,i) );
Почему не работает?
>>Player p;
>>auto t = boost::thread(boost::bind(&Player::use, &p, i));
Метод должен вызываться относитедьно объекта.
Читай доки блджад!
http://www.boost.org/doc/libs/1_61_0/libs/bind/doc/html/bind.html
А если я прям из класса Player и вызываю
>>745482
Да я перекомпилил уже как только могу, мозг немного треснул
И вообще лучше будет так:
>>auto t = boost::thread(&Player::use, &p, i);
или
>>auto t = boost::thread([&p] {p.use(i);});
RVO, move semantics?
>Оптимизируют без профайлера
>заменяя умные указатели сырыми
>на объекте потока
Совсем поехали ньюфаги
В любом случае make_unique > new
int main(){
int p;
std::cout << sizeof(p);
return 0;
}
Каким образом этот код правильно выполняется?
p - указатель на еще не выделенную память, переменной не существует. Какого хуя тогда
#include <iostream>
int main(){
int (звездочка)p;
std::cout << sizeof((звездочка)p);
return 0;
}
годный редактор текстов, ничего не скажешь
sizeof - это оператор, который работает во время компиляции, а не в рантайме. Благодаря тому, что плюса статически типизированы, размер переменной ясен уже на этапе конпиляции.
Не размер относительно char, а размер в байтах. Если что, char не обязан быть размером 1 байт.
>Не размер относительно char, а размер в байтах. Если что char обязан быть размером 1 байт, стандарт прямо указывает что sizeof(char) == 1 для всех реализаций. При этом в char не обязательно должно быть 8 бит.
исправлены неточности
Да, верно, спасибо.
Но 1 байт это и есть 8 бит, значит обязан.
Байт размером не 8 бит это не байт, а какое-то другое название
Так нет никакой переменной. p - указатель на переменную, которой не существует
> Но 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.
Есть переменная p, которая указывает на int, этого достаточно компилятору. И p - это не указатель на переменную, а указатель на участок памяти.
Эй долбаеб, ты кто такой чтобы решать что мне делать? Что по кайфу то и делаю мудила, ебало завалил
пробовал, но там можно настроить только запуск без отладки. без отладки запускается то, что надо. но в дебаге все равно запускает xterm
Этот зверек подорвался. Несите следующего.
Есть задача:
Дана структура классов программного проекта. Необходимо построить процесс компиляции с помощью топологической сортировки.
Что есть топологическая сортировка я просек, но как понимать СТРУКТУРА КЛАССОВ ПРОГРАММНОГО ПРОЕКТА. О зависимости классов я понял, наследование там, все такое, но что есть СТРУКТУРА КЛАССОВ? Как мне ее передавать и в каком виде она вообще передается.
Сасай, бездарность. Иначе в следующий раз просто нахуй пошлем.
Имеется в виду граф классов, где ребра отображают отношения между классами (наследование или композицию).
окей, это я тоже понял, что необходимо построить граф. про композицию почитаю. но откуда брать этот граф, точнее не так, в каком виде считывать классы?
Забей ты на кодлайт, это говно тут всего пара анонов пиарит. В энтерпрайзе все юзают (в порядке убывания) MS VS / Eclipse CDT / QtCreator / CLion. Лично я рекомендую eclipse, очень годный code assistant прямо из коробки.
Если это просто задачка на графы, то тебе уже дается направленный граф, на котором нужно заюзать топологическую сортировку. При этом, раз тебя просят сделать топ. сортировку, то граф должен быть ациклическим, хотя по условию в нем могут быть циклы. Т.е. перед топ. сортировкой нужно найти и разорвать циклы.
Если это не чистая задачка на графы, то тебе нужно пропарсить файлы проекта, найти в нем определения классов (хватит обычных регулярок), построить граф этих классов, а потом сделать то, что нужно в чистой задаче на графы.
акей. я вообще идешки недолюбливаю. уж очень тормозные. привык все через вим и терминал делать. но все же не хватает идешных фич. хотел из вима иде сделать. чото не осилил. в иде вим-мод сделан через жопу и это делает меня грустить. хотя qtcreator не плох вроде.
Спасибо, задача как раз "нечистая". Буду пробовать, добра тебе
>уж очень тормозные
Анализ кода очень требователен к I/O операциям. Если IDE тормозят, то в VIM'е будет то же самое.
Решается покупкой ssd или пляской с tmpfs.
спасибо. буду знать
#define ERROR(str) do { (void)sizeof(str); } while(0)
Зачем цикл в макросе?
Ты че, ебанутый? eclipse отлично открывает makefile проекты и прекрасно их анализирует. Например, проекты linux, freebsd, virtualbox я просто открыл и начал с ними работать. В других ide так сделать нельзя.
Данный цикл в макросе не делает ровным счетом ничего, а зачем он нужен я не понял (вроде бы реализует разное отношение к показу сообщений об ошибках в дебаг версии и в релиз версии). Но ты можешь понять тут или в книге "Enough Rope to Shoot Yourself in the Foot", откуда они этот макрос спиздили.
https://books.google.ru/books?id=wz2nBAAAQBAJ&pg=PA834&lpg=PA834
Вот кусок из книги.
А почему нельзя просто писать в разные файлы, а в консолях сделать банальный tail -f (в винде есть аналог, я уверен, например фар умеет) на каждый лог-файл?
чтобы был скоп и использование переменной. иначе может не скомпилировать или ругаться на неиспользованную переменную
do while(0) idiom
Шум и пафос. Известность. За это платят. А рабу лампы, вернее - большого индустриального комплекса, который раб без этого комплекса мало что значит - можно и не платить. Куда ж он денется-то. 90ые в РФ это хорошо показали, чего стоят инженеры сами по себе. Пусть дальше занимаются серьезным делом, изобретают снижение издержек для мистера Твистера (он же - герр Херр), хозяина завода, газеты и парахода, снизит на миллион, ему дадут 1000 - от щедрот. Изобретет 3д-принтер в 80х, чтобы до масс этот принтер дошел только после 2010, когда мистер Твистер насытится. Разумеется, гитхаб тут неуместен, с ним под сукно сложно что-то сложить. Программисты обладают гораздо бОльшей автономностью. И если они вдруг мистера Твистера обманывают, обещая ему невесть что на хаскеле, то и поделом. Не обеднеет. Делиться надо.
И если я хочу посмотреть исходники, то мне нужен gcc/g++?
Да нет. Там всё есть. Правой кнопкой на инклюде и open file.
ну, видимо, да. MSVC не швабодный, поэтому реализации функций ты не найдешь. а gcc опенсурс, только в исходниках (stl например) там хуй разберешься
хотя реализацию stl в msvc наверное можно глянуть, шаблоны же
Сам нашел. Они поставляют исходники, но к ним не получится обратиться по '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.
Плюс, что забавно они сами не писали стандартную библиотеку, а тупо купили ее у Плаугера.
> Copyright (c) 1992-2009 by P.J. Plauger. ALL RIGHTS RESERVED.
> Consult your license regarding permissions and restrictions.
> V5.20:0009
С 2009 года, наверное, сами поддерживают.
class Matrix
{
private:
USI Matrix_Size;
intm;
static USI HOW_MUCH;
USI numb;
public:
Matrix();
Matrix(USI M_S);
Matrix(USI M_S,int m);
~Matrix();
const Matrix& operator= (const Matrix&);
Matrix& operator+ (const Matrix&);
};
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;
}
}
class Matrix
{
private:
USI Matrix_Size;
intm;
static USI HOW_MUCH;
USI numb;
public:
Matrix();
Matrix(USI M_S);
Matrix(USI M_S,int m);
~Matrix();
const Matrix& operator= (const Matrix&);
Matrix& operator+ (const Matrix&);
};
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;
}
}
пиздец я уебан...
И чо?!
Пиздец ты понаписал говна.
Во первых, ты проебался в операторе +, у тебя возвращается ссылка на локально созданный объект (читай иногда предупреждения; компилятор тебе нахуя?).
Во-вторых, в присваивании у тебя почему-то Matrix_Size присваивается внутри цикла. Нужно по идее перед тем, как выделять память для новой матрицы, перед строкой 73
void mainCycle() {
------{{{
Object->Socket->async_write_some(buffer(Object->buff, 5), boost::bind(&server::on_write,this, _1, _2));
------}}}
}
void on_write(const boost::system::error_code& error, std::size_t bytes_transferred) {
//never calls
}
само создание сокета:
c->Socket = new ip::tcp::socket(this->Service);
Acceptor->accept(c->Socket);
асинхронно записываю 5 байтов
по логике буста должен вызываться on_write() - но в итоге ничего не вызывается, в чем может быть проблема?
Есть Cython, который переводится в C++-код и затем компилится. Вот его точно можно назвать сахарком, хотя там не все фичи языка есть.
Все один хуй идентификаторы. Студия вряд ли их различает.
Динамическая типизация с шаблонами вообще не связана. Шаблоны - средства для генерации кода.
temps[temps.size() / 2]
Т.е. берётся вектор temps... А дальше я не понял.
Просто, я знаю что если в скобки поставить номер значения вектора, оно его и выведет. А если значение делить на 2 - надо сортировку делать тогда, верно:
Сортировку не надо. Погугли алгоритм, на основе быстрой сортировки. Он это за O(logn) делает.
И еще подвопрос, что не так в коде? Вроде, по учебнику делаю. Что-то с сортом не так.
С шапки скачал же.
Пофиг.
Ну ты это. Не сортируй то на каждой итерации.
Да и сумму можешь так посчитать
sum = std::accumulate(temps.begin(), temps.end())
Ну она довольно большая. Уйдёт не менее месяца на это.
Спасибо, теперь работает. Как я понял, это лучший метод получить сумму с вектора? Лучше чем через вышеупомянутый метод?
Я считаю, что единственно верное их применение.
тут прошел слушек что Кнут -- херня без задачь и надо читать иное.
пруфы и авторов прошу итт..
Кнут отличная вещь, но без определенного уровня подготовки осилить его будет очень тяжело. Как учебник по алгоритмам, как его иногда советуют, не подходит вообще. Для этого лучше взять того же Кормена или Седжвика. Плюс есть лекции на курсере и ocw.
у меня есть 2 года стажа цпп + лекции по алгоритмике ~~хуёвые~~
алгоритмики не хватает. анон, что читать?
Поясните разницу между std::move и std::forward.
Правильно ли я понял, что std::move только для rvalue ссылок, а std::forward для rvalue и универсальных и он пытается преобразовать тип ссылки к rvalue, если передана rvalue для приемника?
Почитай про move semantics.
move кастит строго к rvalue, а std::forward кастит к реальному типу универсальной ссылки.
Спасибо. Значит понял относительно правильно.
Бешено двачую.
Вот это пример из Интернета:
void func()
{
try
{
throw 1;
}
catch(int a)
{
cout << "Caught exception number: " << a << endl;
return;
}
cout << "No exception detected!" << endl;
return;
}
Дерьмовый пример или я тупой (да, я туповат, чего уж). Вот есть у меня такая функция:
QString function(const QString & name_your_mother) {
QString penis = "penis";
return message = name_your_message + penis;
}
Как мне написать исключение, чтобы появлялась ошибка при передачи как аргумента строки "my mama"? Если в поможете я отправлю вам лучшую картинку, что у меня есть! Хоть это и мелочь, но правда помогите пожалуйста.
Бешено двачую.
Вот это пример из Интернета:
void func()
{
try
{
throw 1;
}
catch(int a)
{
cout << "Caught exception number: " << a << endl;
return;
}
cout << "No exception detected!" << endl;
return;
}
Дерьмовый пример или я тупой (да, я туповат, чего уж). Вот есть у меня такая функция:
QString function(const QString & name_your_mother) {
QString penis = "penis";
return message = name_your_message + penis;
}
Как мне написать исключение, чтобы появлялась ошибка при передачи как аргумента строки "my mama"? Если в поможете я отправлю вам лучшую картинку, что у меня есть! Хоть это и мелочь, но правда помогите пожалуйста.
Блин.
QString function(const QString & name_your_mother) {
QString penis = "penis";
return message = name_your_mother + penis;
}
Прошу извинения за мою опечатку.
Спасибо большое. Твое решение пока мне кажется хорошим. Почему ты считаешь, что assert лучше исключений? Кроме конечно простоты реализации, здесь твое решение классное. Просто интересно. Для использовании в качестве аргумента в будущих спорах с начальником
Исключения запутывают код и они достаточно дорогие в плане производительности. В плюсах их использование не поощряется.
assert разворачивается просто в проверку условия и, в случае если условие не выполняется, то в stderr выводится сообщение и вызывается terminate.
assert компилируется только в дебаге, в release этот код просто не попадает.
>>assert компилируется только в дебаге, в release этот код просто не попадает.
Я правильно понимаю, что в release этой проверке уже не будет? Это проверка для программиста, но не для пользователя, верно? Но если мне необходимо запретить именно пользователю вводить неправильные данные?
Именно так.
Если тебе необходимо запретить вводить пользователю неправильные данные, то пиши явную проверку а-ля
If(data_is_wrong) {
show_message("Чо ты мне втираешь какую-то дичь? Пшел нахуй!")
return 1;
}
В этом случае кидай идиоматически правильным будет выбросить исключение, например такое:
http://en.cppreference.com/w/cpp/error/invalid_argument
Возврат объекта, представляющего ошибку, был бы норм, если бы в C++ можно было бы возвращать несколько значений или, если бы он был бы динамически типизированным.
show_message(...) - можно делать только в функциях расположенных ооочень высоко.
Вкуривай вообщем исключения(обработка ошибок - одна из самых выжных и сложных вещей). Это точно пригодится как минимум при работе с чужим кодом.
>вообщем
бля, да ты гонишь.
А по теме, пусть читает про общую обработку ошибок, exception safety и exception neutral. В целом, этого достаточно.
В языках без GC исключения опасны так как они прерывают "нормальное" выполнение программы и могут приводить к разной хуйне (утечкам). Безопасное использование исключений требует определенных знаний, использования специальных идеом (правил) программирования, например raii. Многие препочитают просто не ебатся с ними вообще, например гугл в гайдлайнах не рекомендует их использовать.
>>746908
> запретить именно пользователю вводить неправильные данные?
Это ущербная практика в любом ЯП. Нормальные люди не программируют бизнес логику на исключениях. Для проверки ввода пользователя у тебя должен быть специальный код, и в случае неправильного ввода он должен "обычным" способом сообщать кому следует, без разницы используешь ты исключения или нет. Исключения предназначены для обработки исключительно исключительных хе хе хе ситуаций. Там к примеру процесс внезапно не смог прочитать/записать в файл (причем первоначальная проверка наличия этого файла и возможности записи должна проводится вне исключений, "обычным" кодом а исключениями покрыта уже дальнейшая работа с файлом), достучаться до сокета который до этого отвечал и т.п.
Разбираться в коде, который описывает предметную область, не зная самой предметной области - дело бесконечное. Если изучишь сам предмет, разобраться в коде не составит особых трудностей.
чем он тебе не угодил?
Если ты новичок, то особой разницы какую версию студии ставить нет. Скорее всего тебе нафиг не нужен ни новый стандарт, ни новые свистоперделки. Плюс в новых версиях студии легко могут перестать собираться старые проекты или поломаться бинарная совместимость, если ты компилируешь плагин для какого-то дерьма.
мимо сижу в 2010 студии и мне норм
Помоему лучше сразу вкатываться в новый стандарт, по сравнению со старым много удобных нововведений, помимо самого синтаксиса еще куча полезного в STL.
Кнопку не нашел, но нашел окно Bookmarks.
Там же можно не перейти к определению, а просто показать его.
Похуй.
1) Как мне сделать ее дамп памяти?
2) Можно ли как-нибудь в автоматическом режиме привести типы всех ее элементов и распечатать их значения?
Программисты -- это, определенно, черви-пидоры. Не понимаю, как можно было не написать библиотеку для этого.
Смотрю сейчас одну программу. Программист объявляет структуру, кладет в нее вложенную структуру, потом забывает, что во вложенной структуре он уже объявил какие-то параметры и начинает их объявлять повторно. Код растет, память засирается, программист рад.
Вот так вы и пишете свои программы, ироды.
Гугли boost рефлексия. Или просто c++ рефлексия
int main{}
{
cout<<"Hello, World!\n";
return 0;
}
//Гляньте что накодил поцаны.
Все проблема решена, онлайн компилятор не осилил просто.
http://www.stroustrup.com/Programming/std_lib_facilities.h
Всегда подозревал, что фейковое интервью IEEE было нефейковым и он это все делает СПЕЦИАЛЬНО.
>>747974
Тебе нужно написать:
int main()
{
}
И может это не Страуструпа вина. Тут такие шрифты, что не понятно, круглая там скобка или нет.
Расскажите, как вы живёте с правилом пяти?
Работает ли правило нуля в наследовании?
>Расскажите, как вы живёте с правилом пяти?
норм
>Работает ли правило нуля в наследовании?
че за хуйня?
загуглил и ебал я в рот правило нуля.
> правило нуля
Не определяй хуиты из пятёрки/тройки и не выёбывайся.
При наследовании то один хуй надо бы определить явно виртуальный деструктор, а за этим радостно шагает вся пятёрка.
>а за этим радостно шагает вся пятёрка
нихт. Пятерка - это конструктор по умолчанию, конструктор копирования, оператор присваивания, move-конструктор, move-оператор присваивания
Ты бы еще поныл что пальчик болит.
"Дана строка в миллион символов, найти две одинаковых подстроки максимальной длины. Любых."
Просидел дофига, никак не пойму что да как. В плюсах недавно.
То есть я могу просто оставить пустой виртуальный деструктор и ссать с потолка на все эти дефолты, что я наплодил?
Спасибо, няша :3
Проблема не в языке, а в том, что ты не шаришь алгоритмы на строках.
Суффиксные деревья тебе в помощь. Решает именно эту задачу эффективно. Но это сложная поебота, придется покурить изрядно.
суть такова: я создаю итератор потока для файла. в main все нормально работает (инкрементируется). передаю как параметр в функцию, нихрена не инкрементируется!
вот код http://pastebin.com/XMVGQYRD
знающие аноны, помогите, пожалуйста! уже весь день эту хрень пытаюсь отладить
Я нюфаня в крестах, но твой пример напечатал два раза строку. Пикрилейтед. В файл я записал рандоные строки. Что твой алгоритм делает я не знаю. Также я удалил нафиг все лишние хедеры и оставил только:
#include <iostream>
#include <fstream>
#include <iterator>
>>748466
блин, бред какой-то, что я скинул последнее и у меня вроде работает, а в основном алгоритме (сортировка слиянием для файла), почему-то не работает.
ща буду разбираться
ошибки не выдает, просто неправильно работает.
он первое значение выводит, итератор имеет нормальный адрес. после инкремента он пишет что значение такое же осталось и адрес NULL почему-то, но выводит значение(то же самое, не инкрементированне)
вот кусок кода
incr работает нормально
distance на 16 строке работает исправно
distance на 20 строке работает не исправно
что за бред не пойму.
на 19 строке копиконтруктор вроде такой же как в incr, должен нормально работать
а distance не мог проинкрементировать мой итератор?
добавил distance в incr тоже перестала нормально работать -_-
т.е. после distance почему-то все ломается
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 над копиями.
ваще все плохо
http://stackoverflow.com/questions/16373420/distance-between-istream-iterators
че делать :D
получается только юзать контейнеры придется?
И да, я не пользуюсь плюсовыми потоковыми файлами, файловый поток fi в результате вызова distance не перематывается ли в конец? Может надо переместить в начало.
istream_iterator<int> isiter(fi);
так. как по другому? ну или через =, не суть же
>>748623
>>748627
правильную длину возвращает. на SO написали что нельзя потоковые итераторы назад переместить никак, так как они InputIterator
думаю теперь контейнер (вектор) юзать.
жалко, с потоками бы круто вышло, если бы получилось, но я уже ниче не могу придумать лучше, а было бы неплохо эту прогу сдать завтра преподу.
Где та палата мер и весов, в которой закреплены четкие и конкретные значение размера в байтах для встроенных типов short, int, long для каждого конкретного режима x86 (64/32/16/other?), а еще для всяких армов и прочих архитектур.
В файле limits.h твоего компилятора
http://pubs.opengroup.org/onlinepubs/009695399/basedefs/limits.h.html
Благодарю. А существуют реальные примеры такого, когда для одного режима x86 разные компиляторы давали бы разный размер int, например.
Да, оно работает за O(n)
Мне лень проверять, поэтому немного с дивана.
Я вот чего-то не уверен, что копирование istream_iterator'а корректно. Итератор, как абстрактная структура данных -- это такой объект который указывает на элемент внутри коллекции, может его вернуть и сдвинуться. Когда у нас входной поток и существует два итератора на него, и один из этих итераторов сдвигается, то непонятно что должно происходить во втором итераторе. Как бы по контракту, раз мы его не трогали, он должен указывать на тот же элемент, на который указывал раньше. Но это поток, поэтому там этого элемента уже нет. Самым логичным поведением как мне кажется должна быть инвалидация второго итератора и андефайнд бехейвор. Но с другой стороны ему ничего не мешает просто читать данные из потока несмотря на первый итератор.
Короче. надо смотреть в стандарт, что мне делать лень. Может, любопытные поинтересуются.
Это копия, сохраненная 7 июня 2016 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.