Это копия, сохраненная 24 мая 2017 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Утонувший: >>931827 (OP)
Ищите тред по слову "кресты".
Здрасте всем. Че интересного можно на qt написать, подкинете идей оригинальных?
))))))))))
Если ты математег, то сделай рисовалку графиков функций или алгоритм отрисовки графов.
Если ты не только математег, то сделай что-то для сферы, которая тебя интересует.
Если ты только "кодить" умеешь, то сделай компилятор.
тогда пили игрушку
понял
Да мне для laba1
C++17 REMOVED:
register, keyword reserved for future use
bool b; ++b;
trigraphs
if you still need them, they are now part of your source file encoding, not part of language
ios aliases
auto_ptr, old <functional> stuff, random_shuffle
allocators in std::function
Там большая часть для php макак
Кто-нибудь здесь разрабатывал хайлоад приложение или владеет навыками для разработки на этом фреймворке?
http://cppcms.com/wikipp/en/page/main
Какого фига оно не создаёт каталог? На другом ноуте такого дерьма не наблюдалось. Кириллицы, или ещё каких-нибудь дерьмознаков в пути нет.
Де мой ебаный кнопелятор?!
Слишком толсто. Тебе делать нечего? Иди вон - в доцку поиграй, читы для коэсика напиши. Чё ты, а?
Спасибо!
i = 5; ri = 10;
std::cout << i << " " << ri << std::endl;
Я чёт не понял, а чому оно выводит 10 10?
То есть, если мы задаём значение ссылки, то и значение объекта, на который мы ссылаемся тоже будет иметь это значение, даже если мы его отдельно задаём?
Ты дальше 5 страниц любой книги открывал?
ri это, фактически, алиас для i. Меняешь одно, меняется второе. Меняешь второе - меняется первое.
В этом и суть ссылок. Ссылки - более сейфовые и удобные указатели.
Если бы ты хотел, чтобы было две отдельных переменных, нужно было их и создавать, а не ссылку делать.
Причем тут static вообще? Либо сделай конструктор, который будет инициализировать, либо публичный метод у виджета и вызови его перед show();
> void widget->setData(int i1, int i2, int i3, int i4, int i5, int i6, int i7, int i8, int i9, int i10, unt i11, int i12, int i13, int i14, int i15, int i16, int i17, int i18, int i19, double i20);
Хуита какая-то.
Очередной неосилятор?
>что за static class
Наверно из c#. Типа класс состоящий полностью из статических полей и методов.
Бля, когда-то пытался осилить, но он какой-то долгий и нудный
Мне выступления этого мужика нравятся, его рили интересно смотреть
https://www.youtube.com/watch?v=FnGCDLhaxKU&t=5649s&list=LLVWpQXxsK6jOFPVbmvUvbSQ&index=7
> сделай компилятор
>Нахуя?
Чтобы разобраться как он работает и показать, что можешь, очевидно
RS232 терминал с отображением байтов как в HEX-редакторе. Как ни странно, таких почти нет. Более-менее удобный терминал это http://hawkit.ru/progs/wterm/wterm.html
HTerm все же хуже.
Лично писал коммуникацию между ком портами для левого говножелеза. До сих пор это стандарт во многих промышленных девайсах. Например, если взять специальные платформы для сетевых девайсов, на базе которых можно сделать, допустим, промышленный роутер - там везде есть дырки под COM порт
Просто что меня больше всего удивило: до этого я устанавливал креатор на другом ноутбуке. Сделал вполне стандартную установку, галочки не трогал. Но до этого возился с кнопелятором от мингв для коделайт. Но вроде поудалял всё.
Хочешь сказать - в этом дело? Или стоит переустановить креатор?
Всё, понял. Благодарю
Хорошо, что есть апдейт компонентов
Поясните плз, Я так и не понял что выгоднее использовать в его случае!
>for(auto i : vec)
Или
>for(const auto &i : vec)
>>947086
В этом видео к примеру юзают второй вариант, на 2:16.Ведь, большие дядьки хуйни писать не будут
провёл мини тест, и на моей пеке они работают вроде одинаково быстро... Или дело не в скорости, а в памяти?
плз проясните ситуацию
спецификатор auto не выводит ссылочный тип, то есть, допустим, у тебя есть
std::vectir<W> a;
auto b = a;
Здесь произойдет копирование переменной a в переменную b (без учета оптимизаций компилятора, конечно же), если ты сделаешь так:
auto &c = a;
Переменная c будет просто указывать на a, то есть являться lvalue-ссылкой.
Если ты применяешь определение
auto &&d = a;
d в зависимости от последующего поведения a будет являться либо rvalue либо lvalue ссылкой.
Касательно твоего примера, если ты применяешь первый способ, тогда каждый элемент из vec ты копируешь перед использованием, что может быть накладно, если же ты применяешь auto & - объявление lvalue ссылки, тогда переменная i будет УКАЗЫВАТЬ на итерируемый элемент из vec. Если ты желаешь делать ее еще и неизменной, тогда дописываешь const.
>первый способ - тогда каждый элемент из vec ты копируешь перед использованием, что может быть накладно
>если же ты применяешь auto & - объявление lvalue ссылки, тогда переменная i будет УКАЗЫВАТЬ на итерируемый элемент из vec.
Что лучше будет оптимальней выбрать, в плане скорости\памяти? Копирование в переменную или просто получать значение через указатель?
>что может быть накладно
Почему?
Смотря о чем идет речь. Если у тебя, к примеру, используется вектор int'ов или float'ов или других встроенных типов, тогда разницы особой не будет. Если ты перебираешь вектор структур данных или классы, то, лучше использовать ссылочный тип. А вообще, в свое время, Скотт Мейерс рассосал эту тему порядком и, если не ошибаюсь, советовал по-чаще применять auto&&, поскольку, тут уже компилятор решит, что будет быстрее.
Короче, книга называется "Эффективный и современный C++", конкретно по c++11 и c++14, так вот, у меня выводи типов для auto на 31 странице открыт, но, конечно же, лучше начать читать с самого начала, поскольку там идет вывод типов для шаблонов и прочего, а это немаловажно при подступлении к auto.
Ахуеть как часто
Скорее всего под 485, но UART, как промышленный стандарт передачи сообщений до сих пор широко используется.
Пишу игрушечную базу данных на C++Qt (правда всякие йоба-средства Qt использовать не хотелось бы).
Таблица хранится в файле, в начале файла храниться схема отношения (шапка таблицы с именами и типами полей) и дальше лежат записи.
Так вот, как с записями работу организовывать? Писать отдельные классы для обработки полей разных типов, с общим родительским абстрактным классом?
База данных может знать о содержимом, о типе данных (и тогда она сможет индексировать и сортировать) а может и не знать.
Если ты хочешь, чтобы база данных знала о содержимом, у тебя есть какая-то конкретная задача. Изложи её.
"Create, read, update and delete."
Например тот же поиск, примерно соответствует операции выборки. (Выбрать из таблицы записи с определёнными значениями полей. И эти значения естественно не в байтовом "хранимом" формате задаются.)
У тебя QVariant есть, который может хранить различные типы данных, для которых объявлены или допустимы копирующие присваивания.
Касательно базы данных, что именно ты хочешь? Из любого запроса результатом ты получаешь множество записей, которые перебираешь по-очереди и элементы этих записей как раз и представляются QVariant.
То есть: у твоих записей есть некоторое множество текстовых (и численных?) полей.
Когда ты пытаешься научить свою базу пониманию данных, всегда нужно отталкиваться от задачи, которую ты хочешь решить.
Ты говоришь, что ты хочешь поиск по полям. Тогда у тебя должна быть процедура, которая точно знает, что хранится в каждом типе, и возвращает для каждой записи структуру из мапа строковых и численных (например) переменных. Процедура поиска берёт структуру такого типа и смотрит на значения полей - по-разному смотрит на мап чисел и мап строк.
Мапы эти должны где-то храниться, иначе процедура может искать слишком медленно.
привет
Типо ты без написания своего компилятора знаешь, как работает лексер, как идет парсинг в АСТ дерево, как проходит семантический и синтаксический анализ, как работают оптимизации в фронт-енд части, как происходит трансляция и генерация машинных инструкций вместе с их оптимизациями(распределение регистров и тд)?
Я вот ниче из этого не знаю. Есть годная литература или ссылки где почитать для нюфагов?
Отлично. А у тебя?
Спасибо, ознакомлюсь.
так значит MySQL ? Просто раньше думал он майкрософтовский...
ffmpeg
Чтобы сделать видос тебе нужно:
- либа для видеокодека
- либа для контейнера
- либа для аудиокодека
- либы для декодирования всего этого
Декожируешь картинки, составляешь их них входные кадры для видеокодека. Что ты там будешь делать с аудио - не знаю, для начала можешь пихать в контейнер без изменений.
Есть ли что-то проще - не знаю.
как вы думаете если этого мудака запереть в комнате с компом на котором установлена вижуал студия + давать ему все доступные спеки по запросу (но не код)
через сколько лет он напишет .exe способный конвертнуть .webm из .jpg + .mp3?
думаю это будет как в "олдбое" только тот кулаками об стенку стучал, а тут будет стучать по клаве
Думаю, месяц-два. Это не так сложно, если под рукой есть любая литература + стековерфлоу(ну и дохуище свободного времени)
>(но не код)
>>посоны, есть какие-то либы
>>949283
1 минута во встроенной документации: ViewportUpdateMode
да
Олсо, зачем тебе перерисовывать его вручную? Тебе придётся следить за тем, как другие окна перекрывают твой виджет, разве нет?
ну хорошо, какие команды мне гуглить, чтобы писать такой конвертер на чистом С++?
Чьлюы писать на чистом C++ теюе нужны стандарт языка и стандарты всех технологий, которые ты будешь использовать: mp3, MP4, Matroska, H264 и так далее.
Хочешь скооперируемся. Сам пытаюсь что-то написать на этом, но пока что дальше мануалов и хеллоуворда не дошел.
С новыми шейдерами даже хуелоу ворлд хуй осилишь. Делай сначала свой опенгл, на хабре есть серия охуенных статей, заодно поймешь как это работает.
https://2ch.pm/gd/res/195365.html (М)
Вот тут все, что надо есть. Если хочешь начать с хардкора, то можешь скачать книжку OpenGL Superbible или OpenGL Programming Guide. Вот тут да, пиздец, материал подан для тех, кто уже, видимо, пользовался этой технологией. Есть книжка по-проще и ее вполне достаточно для каких-то не самых навороченных игрух или движков, показывают как рендерить полигоны, потом модели освещения, простые тени (без антиалиасинга, естественно и динамического затенения), называется OpenGL ES 3.0 Cookbook. В целом, все, что там описано, применимо и для десктопного OpenGL, но вот второй в плане возможностей по-шире (в сравнении ES 3.0 и GL 4.5).
Все нормальные драйвера (за исключением AMD, которые не смогли обеспечить нормальную поддержку 4.5 для карт 6000 и ниже серии), уже давно поддерживают стандарт 4.5, так что, наверно, лучше пользоваться самыми свежими ништяками, а не барахтаться в куче легаси.
> 2015 год встраивает свой код
> 2017 экспресс можно с майков скачать, но у меня тут есть вопросы, оно того стоит? там большой выбор флагов в бесплатной!!! зачем нужна тогда платная?
Тебе не похуй ли?
Друг.
Хочешь писать на крестах - сразу же Linux и GCC.
На других платформах на крестах уже ничего давно не пишут толком.
Студия по остаточному принципу кресты поддераживает. С ней ты просто заебешься потом работу профильную искать.
Не знаю что советую Страуструп, мне как-то пофиг, что он советует.
Я Qt Creator и Code Blocks использую.
Весь ААА геймдев - студия & винда. Пердолики с ГЦЦ да, нужны, но на деле - учиться лучше в студии. Она в разы дружелюбнее, чем любое красноглазие, топовый дебаггер, да и вообще мимими.
Нахуя тебе иде? Консоль+гдб-волгринд+плагины для твоего редактора(nano, vim, emacs, sublime)
От души спасибос
Весь клиентский софт для редактирования/создания контента, банковский низкоуровневый клиентский софт, все медийные клиенты, включая теперь и vr, почти все утилиты.
На никсах - я в рот ебал писать что-то кросс-дистрибутивное (=популярное) на плюсах, нужен отдельный человек чтобы этот зоопарк поддерживать.
80% вакансий С++ требуют знания линукса и gnu toolchain, так что изучая только виндузный С++ рискуешь соснуть.
Resharper C++
Из PATH все упоминания vc14 удалил, комп перезуагружал - все то же самое.
Есть ли решение этой проблемы, кроме как удаление vc14 и последующая (как правило) переустановка vc8 ?
таки всё верно, у vs2005 (vc8) с++ конпелятор 14 версии. а у vs14 - 20 или даже 21
ЕМНИП, в каждой из студий в папке VC должен быть батник vcvarsall, который устанавливает системные переменные.
Ну а дальше, я думаю, ты поймешь.
Нужно проверить что из первых трёх "битовых флагов" с пика выставлен только один.
Сам придумал только
!( (A && B) || (A && C) || (B && C) )
где
A = flag & INT36
B = flag & REAL
C = flag & STRING
Можно это как-то упростить?
Можно как-то так:
notzero(A)+notzero(B)+notzero(C)==1
Можешь маленькую функцию написать, которая возвращает 1 в ответ на ненулевое значение.
inline int notzero(int q){return q?1:0;}
В операторах && и || сделать проще не получится.
bool isA = (value & ~A) == 0;
bool isB = (value & ~B) == 0;
bool isC = (value & ~C) == 0;
bool valid = isA || isB | isC;
еще проще:
value = value & (A | B | C);
bool valid = !(value ^ A) || !(value ^ B) || !(value ^ C);
Скорее всего с конструкторами обосрался, т.к. пытался не вводить конструкторы без аргументов.
Например есть два класса и один содержит другой:
class Fuck {
QVector<Shit> shit;
Fuck( QVector<int> inits );
}
class Shit {
Shit( QVector<int> inits );
}
Когда Fuck-мемберу QVector<Shit> понадобиться конструктор Shit и обойдётся ли он без пустого конструктора Shit()?
Будет ли правильной такой конструктор Fuck:
Fuck::Fuck( QVector<int> ) {
for(int i = 0; i < inits.size(); i++)
}
>Fuck::Fuck( QVector<int> ) {
> for(int i = 0; i < inits.size(); i++)
> shit.append(Shit(inits));
>}
Фикс, не дописал.
>Скорее всего с конструкторами обосрался, т.к. пытался не вводить конструкторы без аргументов.
Как только ты пишешь один конструктор, дефолтный конструктор скрывается.
Field::Field()=default; - и у тебя снова будет дефолтный (нужен С++11+).
Бля, так я не хочу вводить дефолтный конструктор, у меня часть полей - const, они должны быть определены при создании.
Ввел тебе сваива пайтона в ухо, ббгге.
Поправил и поверил этот пример - действительно не работает.
Зато работает если QVector заменить на QList.
В принципе предсказуемо, но я надеялся что QVector не пытается выделить память под элементы когда он пустой.
>>950841
Так я не использую, QVector<T> использует даже если элементов в нём ещё нет.
Вполне возможно, что и пойдёт, но на офф сайте документации очень мало, а книги по qt про это тоже не пишут. Не знаешь, где найти статьи/книги/гуиды по вебэлементу?
Но если поле Shit.x сделать const то уже не компилируется, т.е. QList зачем-то нужен уже Shit& Shit::operator=(const Shit&) (которого нет из-за константного поля).
Причём если использовать QVector, при наличии const поля и добавить конструктор Shit() : x(0) {} то всё прекрасно работает.
Хуле QVector и QList там внутри делают, блять?
>Так я не использую, QVector<T> использует даже если элементов в нём ещё нет.
Он его не использует (т.е. он бы не запускал его, если бы его не было). Просто объект, который в QVector, должен обладать дефолтным конструктором. Ты не можешь расширить QList, но ты можешь расширить QVector, и для расширения нужен дефолтный.
И вообще, вот тебе исходники, сам смотри.
https://github.com/qt/qtbase/tree/49dc9aa409d727824f26b246054a22b5a7dd5980/src/corelib/tools
> Shit& Shit::operator=(const Shit&)
Наверняка нужен для присвоения QList.
Скорее всего у тебя будут те же проблемы с std::vector (там есть resize) и std::list.
Есть потребность в работе с post get запросами и прочей еболой в протоколе https. Пробовал сначала просто скачать файл через Qt QNetworkAccessManager—он меня нахуй посылает, мол
QSslSocket: cannot resolve TLSv1_1_client_method
QSslSocket: cannot resolve TLSv1_2_client_method
QSslSocket: cannot resolve TLSv1_1_server_method
QSslSocket: cannot resolve TLSv1_2_server_method
Ну я гуглил, гуглил, пацаны сказали, устанавливай OpenSSL, вот тебе уже собранный. Установил—всё равно ругается.
Короче, каким способом в какой IDE, или с помощью какой библиотеки, курл там или сипипинетлиб лучше всего реализовывать работу с сайтами? С меня как всегда нихуя.
Сильно только не бейте, с сетями вообще ни разу не работал, да и вообще неделю назад хеллоу ворлд написал.
Возможно. В любом случае, вопрос
> каким способом в какой IDE, или с помощью какой библиотеки, курл там или сипипинетлиб лучше всего реализовывать работу с сайтами?
не снят. С чем меньше всего ебаться придется? Алсо, реквестирую годные статейки желательно на русском, но там как пойдет на тему взаимодействия с сайтами.
А почему вы таки спрашиваете?
Тебя ждет очень большая ебля. Взаимодействие с сайтами - большая дыра в крестах, и qt исправляет проблему лишь немного. А вообще - на
"QSslSocket: cannot resolve ..." можешь забить, всё и без этого работает, брат жив.
Относительно, в D. Там есть dlang-requests немного смахивающий на питоновский requests.
Впрочем для cpp гуглится гитхаб проекта cpr, кто-нибудь пробовал?
> система сокетов в QT лучше сделана.
То есть даже не стоит лезть в курл, а чинить кьют, я понял, спасибо.
Просто целый день убил на гуглеж всяких разных способов, нашел даже такое https://kaimi.io/2012/01/http-https-cpp-classes/
>В пиздоне заебись
Можно же склеить кусок кода питона с реквестами с остальным кодом, написанным на плюсах, верно? Или так ещё хуже будет?
Можно вызывать код на пиздоне из крестов? Но опять же, это снизит возможности переноса, так как это потребует наличия питона на целевой машине. Но идея не плоха кстати.
Лол, действительно. Интересно, питон можно включить в бинарник?
Костыли-костылики. Но попробую. Если получится, и на скорости не скажется (а оно не скажется, благо парсинг в питоне быстр), то вообще пушка, такое-то прогрессивное программирование на крестах.
Не знаю как пистон, но вышеупомянутый d можно попробовать слинковать - https://dlang.org/spec/cpp_interface.html
Что ты там с этими сайтами делаешь, что тебе медленно? Тебе нужно не питон из С++ вызывать, а наоборот. Переписать на С++ медленный код и все.
> Что ты там с этими сайтами делаешь, что тебе медленно?
Ну, например мне надо проверять большие объёмы текста на наличие слов из массива. Таких ключевых слов может быть 200 и 300. Каждый текст - около 30 слов. И таких текстов может быть сотни штук. И они обновляются раз в 10 минут.
Пиздон просто тихо умирает.
> Тебе нужно не питон из С++ вызывать, а наоборот.
Пиздос. То есть PyQt работает так? Всё не слава богу.
>>950979
Это опять в D встраивается C++ а не наоборот. А мне в QT надо встроить маленький кусок.
>QSslSocket: cannot resolve TLSv1_2_server_method
У меня такая фигня была на винде, где нет openSSL.
Решилось установкой openssl 0.98 (1.+ верссии не работали!), dllки кинул в /system32.
Под RPI и на ебунте всё из коробки заебись было.
У тебя проблема скорее с алгоритмом, если у тебя там o(n*m), то неудивительно, что умирает. А по факту производительность у тебя скорее упрется в скорость интернета, чем в скорость поиска.
Но если прямо вот тебе нужен этот самый С++, то качаешь и парсишь все на питоном, скармливая С++ только нужное. Но скорее всего на питоне уже давно есть такой код.
На питоне у меня уже и так всё написано, да. А вот как его к крестам теперь подключить - не понятно.
> У тебя проблема скорее с алгоритмом
Ну, у меня нет идей его изменения.
Смотри, я скачиваю большое количество маленьких статей. Мне нужно узнать, содержится ли в каждой статье хоть одно слово из списка. В списке куча ключевых слов, а с учетом особенностей русского языка - еще и куча форм этих слов. А каждые 20-30 минут еще и новые докачиваются.
Вот так и получается что питон умирает.
Индексируй. Возьми статью, удали из нее все знаки препинания и приведи к lowercase, а затем отсортируй. Далее поиск у тебя будет уже не o(nm), где n - число слов в статье и m - число ключевых слов, а o(log(n)m).
Но по факту тебе нужно взять какой-нибудь уже написанный движок типа apache solr, или что там есть у питона свое.
Ого, даже такое имеется. Чтож, спасибо, попрою в сторону уже написанных движков. Как это вообще верно называется? Парсер текста?
text search engine
Ставил сейчас 2015 студию апдейт 2. С галкой C++. Эта дура не поставила компиляторы. Узнал об этом только, когда CMake не смог их найти. Стал проверять -- и правда нигде нет.
Ща буду переустанавливать. Почему они не могут научить своих индусов, чтобы инсталяторы просто копировали файлы, а делали миллион каких-то непонятных операций с системой, с реестром, с сетью, с аллахом? Пиздос.
Или такой вариант: можно ли использовать 2015 студию только в качестве IDE, а компиляторы и линковщики использовать от 2010?
Есть два стула. Писать скрипт и вызывать его, но большая ебля с конвертацией объектов, QString сначала в стринг а потом в питоний стринг придётся.
Либо же нашел вот такое, https://github.com/kayhayen/Nuitka
позволяет компилировать скрипты в сишный бинарник. Как его вызывать и передавать объекты пока не понял.
length - функция, а не поле
Ты хоть раз инсталятор открывал? "typical" - это кнопка в инсталяторе, можешь выбрать вообще всё.
Не боишься написать в 15 студии код, который компилятор 10й не проглотит?
http://doc.qt.io/qt-5/opensslsupport.html
Нужен опенссл для твоей битности и твоего компилятора.
А, это вообще не та хуйня, сори. Просто глазом зацепился, думал, что это говно говорит о том, включена ли поддержка SSL.
Ладно, так и сделаю. Просто может, какая-то фича есть, а я и не знаю о ней...
Кури паттерны всякие, судя по всему тебе подходит цепочка обязанностей, но я могу и ошибаться
cout выводит обычные символы, и возможно, utf-8. Для wchar нужен wcout и нужно еще локаль настроить.
http://www.jecgonline.com/article/S0022-0736(09)00536-6/abstract
Не меньше минуты тупил в текст, пока до меня не дошло что это не тот Qt.
Со строчками и их принципом разобрался, не понимаю как их выводить в wcout, если wcout сталкивается с неаскии символом, начиная с этого символа весь вывод пустотой заменяет, но винапи прекрасно все понимает. Проблема исключительно с wcout. Какую локаль настроить?
Похоже что у тебя шиндовская командная строка не пропускает японскую кодировку. Попробуй код запустить на юниксе какой-нибудь, там с юникодом все в порядке, тут например http://cpp.sh/
Да, не пропускает, даже пытался кандзи пихать в нее.
Конечно, это замечательно, что на никсе все будет работать, но меня интересует винда.
Попробуй тогда подключить clocale и установить std::setlocale(LC_ALL, "en_US.UTF-8");
Тогда так "ja_JP.UTF-8"
> Какую локаль
Попробуй td::setlocale(LC_ALL, "ja_JP");
Или попробуй перед выводом строки конвертнуть ее в utf-8
Или поищи какой-то винапи вызов
Если тебе не нужно изменять строки то лучше в utf-8 работать
Сэйм.
>>951265
Да хотелось бы изменять.
>>951264
В Qt своя механика реализации всего этого, свои подклассы для рисовки и прочего, я бы советовал учить все с нуля и работать напрямую с либами OpenGL.
От себя могу посоветовать типулю, который делает достаточно неплохие видосы по этому поводу https://www.youtube.com/channel/UCeQhZOvNKSBRU0Mdg7V44wA (я так понимаю тебе с нуля).
И книжку (Ginsburg D., Purnomo B. - OpenGL ES 3.0 Programming Guide - 2014), говорили что полезная, я не по графике выступаю, поэтому скачал и забил.
Спасибо. А если писать на чистом OpenGL то кроссплатформенность останется? И на сколько вообще сложно изучать это? Мне много не надо, чисто 2д и спрайты, как во втором варкафте. QT знаю хорошо, написано много программ, но в граффику вкатываюсь впервые.
Сам на яве, блядь, пиши, дай мне консольный юникод оутпут. Я ебал все сорцы портировать в qt. Мне даже винапишный подойдет, главное, чтобы работал.
>>951289
OpenGL - либы, ты можешь их на много языков натянуть, хоть на ту же обоссную джаву, можешь сразу на андроед деплоить. Да, все кроссплатформенное, но это не значит, что любой код, написанный с помощью этих либ будет одинаково четко работать на разных девайсах, к примеру, то же разрешение экрана, сенсорное управление и прочее.
Qt это как детский вариант плюсов, все просто и почти так же быстро, он удобен, но немного отупляет.
И да, тебе придется им за лицензию отсыпать, если игру не только для своей мамы пишешь.
Тебе уже дали, сам виноват что на поделие от m$совта запускаешь, твоя головная боль
> можешь сразу на андроед
Не нужно, только пека и юниксы.
> Qt это как детский вариант плюсов
И не поспоришь. Но, нормального гуя для приложений я кроме как qt не нашел, а тем более кроссплатформенного.
Чтож, спасибо, буду пытаться вкатываться, надеюсь opengl нормально работает с qt.
Опача, вот за это спс.
Неее, старик, с такими познаниями я тебе настоятельно советую посмотреть те видосы, читать книжки про опенгл и так далее, поверь, ты еще 300 раз пересмотришь свои взгляды на геймдев.
Для начала я бы тебе посоветовал узнать ответ на парочку вопросов
1 чем оконное гуи отличается от рисования квадратиков и как бы отличалась прога, если бы синюю рамку и кнопочки ты нарисовал через DrawRect какой-нибудь графлибы
2 в чем разница directx от opengl на винде, это ж либы, значит либы тоже дергают какие-то функции, вот в чем разница между функциями которые они дергают
как узнаешь ответы на эти вопросы, все станет яснее
Ну, что пересмотрю это не сомневаюсь, несколько лет назад в начале изучения крестов пытался вкотиться в гл, охуел от сотен функций.
А ответы на вопросы я и так (я думаю) знаю:
1 - qt всё рисует сам, все элементы уже готовы их надо просто поставить, а в огл всё рисовать надо самому. Поэтому я буду использовать qt только для логики, просто консольное приложение с огл.
2 - Ну, по идее, и тот и тот дергает низкоуровневые драйвера. Только директх для винды, а в огл есть разная реализация в зависимости от платформы
Я имел ввиду именно низкоуровневые вопросы, именно как кто дергает "низкоуровневые драйвера". Вот разберись с этим, много нового узнаешь, я съебал.
Наследуешься от QOpenGLWidget и рисуешь в методе void QOpenGLWidget::paintGL().
В этом методе получаешь контекст рендергина при помощи одноименной функции context() и затем дескриптор для работы с OpenGL функциями в зависимости от всратости желаемого OpenGL - functions() или extraFunctions().
Ну и соответственно добавишь таймер на отрисовку контента.
Годнота, ушёл обмазываться
В качестве нетипового параметра шаблона могут быть использованы указатели на объекты.
Вопрос: почему этот объект должен иметь статическое время жизни?
А головой подумать?
нет
Попробуй поставить GCC, начиная с Windows 7 он поддерживается (пункт "Подсистема Linux" в виндовых компонентах).
Например я хочу, просто создать поток. А потом по очереди скормить ему несколько функций или одну функцию с разными переменными. Или это так не работает?
Нельзя. Скормить функцию ты можешь через конструктор -> по одному объекту на функцию выходит.
Тебе нужно, чтобы функции последовательно или параллельно выполнялись?
В любом случае ты можешь создать функцию, которая будет плодить эти потоки, и вызывать её в отдельном потоке или просто так.
Если нужно последовательное выполнение, ты создаешь поток; ждёшь, пока он выполнится (join); повторяешь.
Если нужно параллельное выполнение, то придётся или хранить массив потоков и каждый ждать. Если вдруг ждать не нужно, то можно плодить потоки, как для последовательного случая, но при этом говорить, что тебе всё равно, когда закончится поток (detach).
При использовании потоков обязательно вызывать join или detach, иначе твоя прога рискует улететь по std::terminate.
Вся информация взята из гугла.
Просто так нельзя. То что ты хочешь делают через пул потоков (thread pool). Стандартной реализации нет, нужно или самому делать или тащить откуда-то. В бусте, например, вроде как есть.
Что за данные? Это большая структура, или диапазон данных этого самого массива, или что?
Сделай пул потоков.
Также можно использовать std::async. В MSVC в реализации используется пул потоков.
Лол. Я другой анон, но пришёл сюда с вопросом по std::async.
Just in time.
Вопрос следующий.
Есть некоторые данные, прилетающие через udp.
Данные из пакета мне надо скармливать функции и работать дальше. Что там делает дальше функция - не важно. Возвращаемое в основное тело программы значение - неважно. Единственный момент - количество прилетаемых данных разное, поэтому, теоретически, в некоторый момент вызов функции может идти в тот момент, пока она ещё работает с предыдущим набором данных.
Проблема, в общем-то, такая.
Если я просто обращаюсь к функции, то всё становится до момента, пока она не отработает и не выдаст результат. Что логично.
Т.е. из main() я вызываю "fastParse(recvData);"
В fastParse() у меня есть вывод в консоль для отсмотра поступления данных в принципе:
printf("%s\n", recvData);
while (true) {
b++;
printf("%i\n",b);
}
Т.е. при обращении к функции вижу факт поступления данных, а потом бесконечный поток увеличивающихся значений.
При повторном обращении поступления новых данных не вижу (они не выводятся среди увеличивающегося потока значений).
Если я делаю через
std::async(fastParse, recvData);
то я вообще не вижу никакого отклика от функции. Что не так.
В примерах (типа http://www.cplusplus.com/reference/future/async/ ) есть ожидание данных через std::future, но мне эти данные, по большому счёту, получать не надо, поэтому в future необходимости нет.
Или async не создаёт и не распараллеливает дополнительные экземпляры функции, поэтому мне надо смотреть нечто другое (потоки?)?
Что я делаю не так?
Лол. Я другой анон, но пришёл сюда с вопросом по std::async.
Just in time.
Вопрос следующий.
Есть некоторые данные, прилетающие через udp.
Данные из пакета мне надо скармливать функции и работать дальше. Что там делает дальше функция - не важно. Возвращаемое в основное тело программы значение - неважно. Единственный момент - количество прилетаемых данных разное, поэтому, теоретически, в некоторый момент вызов функции может идти в тот момент, пока она ещё работает с предыдущим набором данных.
Проблема, в общем-то, такая.
Если я просто обращаюсь к функции, то всё становится до момента, пока она не отработает и не выдаст результат. Что логично.
Т.е. из main() я вызываю "fastParse(recvData);"
В fastParse() у меня есть вывод в консоль для отсмотра поступления данных в принципе:
printf("%s\n", recvData);
while (true) {
b++;
printf("%i\n",b);
}
Т.е. при обращении к функции вижу факт поступления данных, а потом бесконечный поток увеличивающихся значений.
При повторном обращении поступления новых данных не вижу (они не выводятся среди увеличивающегося потока значений).
Если я делаю через
std::async(fastParse, recvData);
то я вообще не вижу никакого отклика от функции. Что не так.
В примерах (типа http://www.cplusplus.com/reference/future/async/ ) есть ожидание данных через std::future, но мне эти данные, по большому счёту, получать не надо, поэтому в future необходимости нет.
Или async не создаёт и не распараллеливает дополнительные экземпляры функции, поэтому мне надо смотреть нечто другое (потоки?)?
Что я делаю не так?
> поэтому в future необходимости нет
Если я правильно понял то в этом твоя проблема. В future необходимости нет, но async его возращает, и так как это временный объект то future сразу же удаляется, тоесть вызывается его деструктор. А особенность деструктора future в том что он блочит тред в котором вызвался пока не будет завершен связаный с ним async. Тоесть вызов std::async(fastParse, recvData); фактически синхронный так как деструктор future блочит тред пока не выполнится async, а он у тебя бесконечный. Потопробуй сохранять куда-то future, при чем так чтобы он не удалялся до самого завершения async.
Контейнеры, хуё-моё, тааак падажжи. Можешь пример кода дать?
Не, ведёт себя внешне так же как без async.
>>951980
Да, подозреваю, что у меня без future (в случае с launch всё равно подразумевается) происходит блокировка и async не такой уж и асинхронный в этот момент в том смысле, в каком я это понимаю.
Всё-таки накидал пока через std::thread с детачем. Выглядит гораздо ближе к тому, что я хочу видеть (с передачей аргуметов косяк - сам вызов происходит, но передаются пустые значения; но это уже разгребу - проблемой не выглядит).
А сохранять future - я боюсь, что это повлияет на производительность. Или нет, если возвращается, например, NULL? С этой позиции, как я понимаю, детачнутый поток освободит ресурсы сразу по завершению? Понятное дело, что в моём примере этого никогда не произойдёт из-за while(true)?
Ну, в своём первоначальном вопросе я имел в виду кое-что другое: имеется массив со словами. И при каком-нибудь условии, вытаскивается какое-то конкретное слово, а не все.
Ну, например, объявляем переменную
int x = 1 + rand() % 30;
Она будет в диапазоне от 1 до 30. И при определённом значении переменной будет выводиться нужное слово из массива.
Я знаю, что можно сделать просто через switch, но будет много говнокода. А так хочется узнать, как это будет выглядеть при работе с массивом.
Спасибо
Так тебе же всё равно надо или позицию этого слова знать, или перебирать все элементы.
Во втором случае http://ru.cppreference.com/w/cpp/container верно, остаётся только выбрать самый оптимальный вариант перебора для конкретного случая.
http://www.cplusplus.com/reference/array/array/
В разделе member functions есть примеры к каждой конкретной функции.
Глянул быстро, на cppreference тоже есть. Правда я им не пользуюсь, не знаю, насколько много. на сиплюсплюс - точно много. Только, кажется, там русского нет (тут мне пофиг).
На производительность не повлияет, future же конструируется в любом случае. Это если бы был вариант асинка без возрата - он был бы эффективнее. А так ты теряешь только десяток байт на хранение future. И то не факт - под временный объект где-то выделяется память, если на стеке вызывающей функции, то так так ты вызываешь из мейна, то тратить память для хранения future придется в любом случае. Но для твоего варианта тред лучше. Профит асинка только в надежде что его реализация использует пул потоков, а так как у тебя бесконечная задача то в пуле нет смысла.
Спасибо ещё раз.
Используй сигналы beginInsertRows и endInsertRows. Первый вызываешь перед добавлением элементов при этом передаешь ему два индекса - места, куда ты будешь запихивать свои элементы, второй вызываешь при окончании добавления.
CLion?
Как потребовать от шаблона быть InputIterator-ом?
В псевдокоде это выглядело бы что-то вроде "template<InputIterator<T>>".
На С# было бы что-то вроде "Method<IEnumerable<T>>".
От шаблона чего, если функции, то можешь SFINAE применить. Или, например:
template<typename T>
void some_func(InputIterator<T> &iterator);
Я использовал continuous таски из TBB они не блокируют текщий тред. Единственное важное условие результат вычислений должен быть соответственно синхронизироваться с помощью атомиков, либо мьютексов.
Неа, ничерта не работает, список как был таким, так и остался, перерыл хуеву кучу материала.
Возможно я не ту модель наследую, может QAbstractListModel не позволяет сделать несколько колонок, разделенных табуляцией?
Посмотрел в примерах, там такого разделения как я хочу нет.
>>952039
Понятия не имею как сигналы могут помочь, если у меня сам объект неправильно устроен.
Да нихуя не получилось, пытался запилить QAbstractItemModel там примеры хуй пойми что, ничего не понятно, ни как заполнять, ни про индексы, все данные идут из дефолтных функций клюта, на хуя я вертел такое гуи. Сделаю через QlistView, похуй, не будет колонок.
Думаю да, подошел бы, но после нескольих часов дроча их документации я уже не настроен на новые технологии.
Так ты осилил? Тогда молодец.
//Бредогенератор
#include <iostream>
using namespace std;
int main()
{
setlocale(LC_ALL, "Russian");
setlocale(LC_ALL, "ru_RU.UTF-8");
setlocale(LC_ALL, "");
unsigned rand_value = 11;
srand(rand_value); //рандомизация генератора случайных чисел
int a;
int x;
start:
x = 1 + rand() % 30;
switch (x) {
case 1:
cout << "Неизвестный ";
break;
case 2:
cout << "Президент Гондураса ";
break;
case 3:
cout << "Пенсионер ";
break;
case 4:
cout << "Милиционер ";
break;
case 5:
cout << "Пингвин-убийца ";
break;
case 6:
cout << "Моряк-гомосексуалист ";
break;
case 7:
cout << "Анатолий Вассерман ";
break;
case 8:
cout << "Евгений Петросян ";
break;
case 9:
cout << "Известный писатель ";
break;
case 10:
cout << "Одноногий человек ";
break;
case 11:
cout << "Артемий Лебедев ";
break;
case 12:
cout << "89-летний зоофил ";
break;
case 13:
cout << "Афроамериканец ";
break;
case 14:
cout << "Владимир Путин ";
break;
case 15:
cout << "Владелец известной компании ";
break;
case 16:
cout << "Пьяный лётчик ";
break;
case 17:
cout << "Билл Гейтс ";
break;
case 18:
cout << "Стив Джобс ";
break;
case 19:
cout << "Китайский рабочий ";
break;
case 20:
cout << "Сисадмин ";
break;
case 21:
cout << "Строитель ";
break;
case 22:
cout << "Министр обороны ";
break;
case 23:
cout << "Чак Норрис ";
break;
case 24:
cout << "Алкоголик ";
break;
case 25:
cout << "Наркоман ";
break;
case 26:
cout << "Знаменитый блоггер ";
break;
case 27:
cout << "Маньяк ";
break;
case 28:
cout << "Кондуктор ";
break;
case 29:
cout << "Водитель маршрутки ";
break;
case 30:
cout << "Хакер ";
break;
}
x = 1 + rand() % 26;
switch (x) {
case 1:
cout << "убил ";
break;
case 2:
cout << "зарезал ";
break;
case 3:
cout << "изнасиловал ";
break;
case 4:
cout << "застрелил ";
break;
case 5:
cout << "родил ";
break;
case 6:
cout << "послал на хуй ";
break;
case 7:
cout << "повесил на столбе ";
break;
case 8:
cout << "превратился в ";
break;
case 9:
cout << "убил и съел ";
break;
case 10:
cout << "подал в суд на ";
break;
case 11:
cout << "съел ";
break;
case 12:
cout << "предал анафеме ";
break;
case 13:
cout << "снялся в порнофильме про ";
break;
case 14:
cout << "купил себе ";
break;
case 15:
cout << "обоссал ";
break;
case 16:
cout << "выкакал ";
break;
case 17:
cout << "покусал ";
break;
case 18:
cout << "забил ногами ";
break;
case 19:
cout << "разбил голову об ";
break;
case 20:
cout << "выкинул из окна ";
break;
case 21:
cout << "утопил в унитазе ";
break;
case 22:
cout << "бросил под поезд ";
break;
case 23:
cout << "снял на видео ";
break;
case 24:
cout << "влюбился в ";
break;
case 25:
cout << "сбил на автомобиле ";
break;
case 26:
cout << "переехал ";
break;
}
x = 1 + rand() % 26;
switch (x) {
case 1:
cout << "старушку ";
break;
case 2:
cout << "НЛО ";
break;
case 3:
cout << "жену ";
break;
case 4:
cout << "депутата ";
break;
case 5:
cout << "пенсионера ";
break;
case 6:
cout << "резиновую уточку ";
break;
case 7:
cout << "мухомор ";
break;
case 8:
cout << "человека-паука ";
break;
case 9:
cout << "себя ";
break;
case 10:
cout << "Новодворскую ";
break;
case 11:
cout << "Тимошенко ";
break;
case 12:
cout << "ребёнка ";
break;
case 13:
cout << "президента ";
break;
case 14:
cout << "школьника ";
break;
case 15:
cout << "8-летнюю девочку ";
break;
case 16:
cout << "друга ";
break;
case 17:
cout << "батон колбасы ";
break;
case 18:
cout << "собаку ";
break;
case 19:
cout << "кошку ";
break;
case 20:
cout << "хомячка ";
break;
case 21:
cout << "клизму ";
break;
case 22:
cout << "новенький iPhone ";
break;
case 23:
cout << "эльфа ";
break;
case 24:
cout << "таракана ";
break;
case 25:
cout << "компьютерную мышь ";
break;
case 26:
cout << "бутылку водки";
break;
}
x = 1 + rand() % 18;
switch (x) {
case 1:
cout << "на почве ";
break;
case 2:
cout << "из-за ";
break;
case 3:
cout << "в бытовом споре по поводу ";
break;
case 4:
cout << "в борьбе за независимость ";
break;
case 5:
cout << "в результате воздействия ";
break;
case 6:
cout << "под действием ";
break;
case 7:
cout << "в состоянии ";
break;
case 8:
cout << "под видом ";
break;
case 9:
cout << "на виду у любителей ";
break;
case 10:
cout << "из-за недостатка ";
break;
case 11:
cout << "в отместку за расстрел ";
break;
case 12:
cout << "от переизбытка ";
break;
case 13:
cout << "устав от ";
break;
case 14:
cout << "опасаясь ";
break;
case 15:
cout << "угнав вагон ";
break;
case 16:
cout << "доказывая вред ";
break;
case 17:
cout << "при поддержке ";
break;
case 18:
cout << "с помощью ";
break;
}
x = 1 + rand() % 34;
switch (x) {
case 1:
cout << "перхоти";
break;
case 2:
cout << "Америки";
break;
case 3:
cout << "гнилых пельменей";
break;
case 4:
cout << "интернетов";
break;
case 5:
cout << "растишки";
break;
case 6:
cout << "наркотиков";
break;
case 7:
cout << "алкоголя";
break;
case 8:
cout << "инопланетных излучений";
break;
case 9:
cout << "лесных эльфов";
break;
case 10:
cout << "педофилов";
break;
case 11:
cout << "ФСБ";
break;
case 12:
cout << "импотенции";
break;
case 13:
cout << "секса";
break;
case 14:
cout << "котлет";
break;
case 15:
cout << "комаров";
break;
case 16:
cout << "черепашек-ниндзя";
break;
case 17:
cout << "живого журнала";
break;
case 18:
cout << "порнографии";
break;
case 19:
cout << "денег";
break;
case 20:
cout << "негров";
break;
case 21:
cout << "местного детского сада";
break;
case 22:
cout << "анального секса";
break;
case 23:
cout << "соседнего макдональдса";
break;
case 24:
cout << "всего";
break;
case 25:
cout << "ништяков";
break;
case 26:
cout << "своего интернет-провайдера";
break;
case 27:
cout << "аниме";
break;
case 28:
cout << "онлайн игр";
break;
case 29:
cout << "онанизма";
break;
case 30:
cout << "операционной системы Linux";
break;
case 31:
cout << "ночного клуба";
break;
case 32:
cout << "толкиенистов";
break;
case 33:
cout << "шаурмы";
break;
case 34:
cout << "хакеров";
break;
}
cout << "." << endl;
cout << "Хотите ещё? Если да, то введите 1. Для выхода из программы введите любое другое число." << endl;
error:
cin >> a;
switch (a) {
case 1:
goto start;
default:
exit;
}
system("pause");
return 0;
}
//Бредогенератор
#include <iostream>
using namespace std;
int main()
{
setlocale(LC_ALL, "Russian");
setlocale(LC_ALL, "ru_RU.UTF-8");
setlocale(LC_ALL, "");
unsigned rand_value = 11;
srand(rand_value); //рандомизация генератора случайных чисел
int a;
int x;
start:
x = 1 + rand() % 30;
switch (x) {
case 1:
cout << "Неизвестный ";
break;
case 2:
cout << "Президент Гондураса ";
break;
case 3:
cout << "Пенсионер ";
break;
case 4:
cout << "Милиционер ";
break;
case 5:
cout << "Пингвин-убийца ";
break;
case 6:
cout << "Моряк-гомосексуалист ";
break;
case 7:
cout << "Анатолий Вассерман ";
break;
case 8:
cout << "Евгений Петросян ";
break;
case 9:
cout << "Известный писатель ";
break;
case 10:
cout << "Одноногий человек ";
break;
case 11:
cout << "Артемий Лебедев ";
break;
case 12:
cout << "89-летний зоофил ";
break;
case 13:
cout << "Афроамериканец ";
break;
case 14:
cout << "Владимир Путин ";
break;
case 15:
cout << "Владелец известной компании ";
break;
case 16:
cout << "Пьяный лётчик ";
break;
case 17:
cout << "Билл Гейтс ";
break;
case 18:
cout << "Стив Джобс ";
break;
case 19:
cout << "Китайский рабочий ";
break;
case 20:
cout << "Сисадмин ";
break;
case 21:
cout << "Строитель ";
break;
case 22:
cout << "Министр обороны ";
break;
case 23:
cout << "Чак Норрис ";
break;
case 24:
cout << "Алкоголик ";
break;
case 25:
cout << "Наркоман ";
break;
case 26:
cout << "Знаменитый блоггер ";
break;
case 27:
cout << "Маньяк ";
break;
case 28:
cout << "Кондуктор ";
break;
case 29:
cout << "Водитель маршрутки ";
break;
case 30:
cout << "Хакер ";
break;
}
x = 1 + rand() % 26;
switch (x) {
case 1:
cout << "убил ";
break;
case 2:
cout << "зарезал ";
break;
case 3:
cout << "изнасиловал ";
break;
case 4:
cout << "застрелил ";
break;
case 5:
cout << "родил ";
break;
case 6:
cout << "послал на хуй ";
break;
case 7:
cout << "повесил на столбе ";
break;
case 8:
cout << "превратился в ";
break;
case 9:
cout << "убил и съел ";
break;
case 10:
cout << "подал в суд на ";
break;
case 11:
cout << "съел ";
break;
case 12:
cout << "предал анафеме ";
break;
case 13:
cout << "снялся в порнофильме про ";
break;
case 14:
cout << "купил себе ";
break;
case 15:
cout << "обоссал ";
break;
case 16:
cout << "выкакал ";
break;
case 17:
cout << "покусал ";
break;
case 18:
cout << "забил ногами ";
break;
case 19:
cout << "разбил голову об ";
break;
case 20:
cout << "выкинул из окна ";
break;
case 21:
cout << "утопил в унитазе ";
break;
case 22:
cout << "бросил под поезд ";
break;
case 23:
cout << "снял на видео ";
break;
case 24:
cout << "влюбился в ";
break;
case 25:
cout << "сбил на автомобиле ";
break;
case 26:
cout << "переехал ";
break;
}
x = 1 + rand() % 26;
switch (x) {
case 1:
cout << "старушку ";
break;
case 2:
cout << "НЛО ";
break;
case 3:
cout << "жену ";
break;
case 4:
cout << "депутата ";
break;
case 5:
cout << "пенсионера ";
break;
case 6:
cout << "резиновую уточку ";
break;
case 7:
cout << "мухомор ";
break;
case 8:
cout << "человека-паука ";
break;
case 9:
cout << "себя ";
break;
case 10:
cout << "Новодворскую ";
break;
case 11:
cout << "Тимошенко ";
break;
case 12:
cout << "ребёнка ";
break;
case 13:
cout << "президента ";
break;
case 14:
cout << "школьника ";
break;
case 15:
cout << "8-летнюю девочку ";
break;
case 16:
cout << "друга ";
break;
case 17:
cout << "батон колбасы ";
break;
case 18:
cout << "собаку ";
break;
case 19:
cout << "кошку ";
break;
case 20:
cout << "хомячка ";
break;
case 21:
cout << "клизму ";
break;
case 22:
cout << "новенький iPhone ";
break;
case 23:
cout << "эльфа ";
break;
case 24:
cout << "таракана ";
break;
case 25:
cout << "компьютерную мышь ";
break;
case 26:
cout << "бутылку водки";
break;
}
x = 1 + rand() % 18;
switch (x) {
case 1:
cout << "на почве ";
break;
case 2:
cout << "из-за ";
break;
case 3:
cout << "в бытовом споре по поводу ";
break;
case 4:
cout << "в борьбе за независимость ";
break;
case 5:
cout << "в результате воздействия ";
break;
case 6:
cout << "под действием ";
break;
case 7:
cout << "в состоянии ";
break;
case 8:
cout << "под видом ";
break;
case 9:
cout << "на виду у любителей ";
break;
case 10:
cout << "из-за недостатка ";
break;
case 11:
cout << "в отместку за расстрел ";
break;
case 12:
cout << "от переизбытка ";
break;
case 13:
cout << "устав от ";
break;
case 14:
cout << "опасаясь ";
break;
case 15:
cout << "угнав вагон ";
break;
case 16:
cout << "доказывая вред ";
break;
case 17:
cout << "при поддержке ";
break;
case 18:
cout << "с помощью ";
break;
}
x = 1 + rand() % 34;
switch (x) {
case 1:
cout << "перхоти";
break;
case 2:
cout << "Америки";
break;
case 3:
cout << "гнилых пельменей";
break;
case 4:
cout << "интернетов";
break;
case 5:
cout << "растишки";
break;
case 6:
cout << "наркотиков";
break;
case 7:
cout << "алкоголя";
break;
case 8:
cout << "инопланетных излучений";
break;
case 9:
cout << "лесных эльфов";
break;
case 10:
cout << "педофилов";
break;
case 11:
cout << "ФСБ";
break;
case 12:
cout << "импотенции";
break;
case 13:
cout << "секса";
break;
case 14:
cout << "котлет";
break;
case 15:
cout << "комаров";
break;
case 16:
cout << "черепашек-ниндзя";
break;
case 17:
cout << "живого журнала";
break;
case 18:
cout << "порнографии";
break;
case 19:
cout << "денег";
break;
case 20:
cout << "негров";
break;
case 21:
cout << "местного детского сада";
break;
case 22:
cout << "анального секса";
break;
case 23:
cout << "соседнего макдональдса";
break;
case 24:
cout << "всего";
break;
case 25:
cout << "ништяков";
break;
case 26:
cout << "своего интернет-провайдера";
break;
case 27:
cout << "аниме";
break;
case 28:
cout << "онлайн игр";
break;
case 29:
cout << "онанизма";
break;
case 30:
cout << "операционной системы Linux";
break;
case 31:
cout << "ночного клуба";
break;
case 32:
cout << "толкиенистов";
break;
case 33:
cout << "шаурмы";
break;
case 34:
cout << "хакеров";
break;
}
cout << "." << endl;
cout << "Хотите ещё? Если да, то введите 1. Для выхода из программы введите любое другое число." << endl;
error:
cin >> a;
switch (a) {
case 1:
goto start;
default:
exit;
}
system("pause");
return 0;
}
Блядь, табуляция
Тупой вопрос, но все же.
Если я создам вектор массивов, когда будет вызван деструктор вектора, он корректно освободит память или как? Т.е. вызовет delete[] для своих членов. В свою очередь если он корректно освобождает память, то как он это делает? Допустим я пишу свои контейнер, как мне реализовать такой умный деструктор?
А если я создам вектор указателей на void, как он их будет освобождать? Никак? Или как-то?
Допустим я под voidPtr храню массив хуйпоймичего, логично, что вектор не знает, как освободить память, допустим я сам удалю содержимое, но у вектора останется указатель и если он такие вызовет delete или delete[] то это приведет к хуете. Как в таком случае корректно работать с вектором?
Массив - по сути просто указатель на первый элемент массива (вернее, на нулевой)
Указатель - просто число
Соответственно, никаких деструкторов вызвано не будет, потому что у чисел их нет
У указателя нет деструктора. Чтобы освобождалась память, нужен unique_ptr (или другие).
Запихнуть массивы в вектор ты не можешь, зато можешь сделать вложенные векторы.
Если нет информации о типе объекта, разобрать его ты не сможешь.
Типо такого: Array< Array<int>(10) > a(10); // попытка создать массив размера 10x10
Там стандартные заголовки же есть
http://doc.qt.io/qt-4.8/qstandarditemmodel.html#setHorizontalHeaderLabels
Или единственный варик - это создавать массив указателей и в цикле их заполнять?
for (int i = 0; i < a4.size(); ++i)
{
a4 = new Array<int>(10, 3);
}
Такой варик норм, но тогда не работает индексация массива с []: вместо a4[j] приходится писать (*a4)[j]
Можно как-то задавать поведение для массива в зависимости от типа? Я имею ввиду, в случае с типом Т для индексации использовать один метод, а для указателя на этот тип - другой?
Займись чем-нибудь полезным и не пиши никогда своих контейнеров пока у тебя не будет хотя бы пары лет опыта.
Спасибо за ответ, последую твоему совету
иди нахуй, уебок. Нехуй сказать, а все равно надо же что-то спиздануть. Откуда вы блять беретесь
То, что у него нет конструктора по-умолчанию - лично твои проблемы, классу Array, как таковому, вообще ничего не нужно.
Многомерность можешь сделать через переменное количество аргументов и через рекурсивный вызов конструктора.
А ещё многомерность можно сделать через алокацию ОДНОГО блока памяти и через перегруженый оператор [], который вычисляет оффсет, без рекурсии.
>через перегруженый оператор []
Как его перегрузить, если он принимает один аргумент - int(или size_t)? Ну точнее, перегрузить можно, но тогда это будет не канонический вызов a
>То, что у него нет конструктора по-умолчанию - лично твои проблемы
Я в курсе
>Многомерность можешь сделать через переменное количество аргументов и через рекурсивный вызов конструктора.
Нихуя не понял. Дай ссылку на реализацию похожего(ну или объясни поподробнее)
Локаль для cout и устанавливается через imbue.
Ебанутые свитчи вместо того, чтобы использовать массив строк.
Ебанутые константы.
GOTO вместо использования while / do-while
Используете ли вы Boost? Если да, то какие фичи\библиотеки? Какие, на ваш взгляд, самые полезные\популярные?
ВОООТ.. Я сам бы хотел в него вкатиться со всей силы...
>В ШАПКЕ ->
>Дэвид Вандевурд и Николаи ДжоссатисШаблоны C++. Справочник разработчика2003После прочтения этой книги тебя не приведут в ужас даже исходники boost::MPL
Кто читал, так ли это? Стоит ли читать эту книгу for learning boost?
Заранее спасибо
>Как его перегрузить, если он принимает один аргумент - int(или size_t)?
Пусть он принимает туплами тогда, лол. Даже тайпчекинг будет - во время компиляции узнаешь, что передал тупл не того размера.
>Нихуя не понял. Дай ссылку на реализацию похожего(ну или объясни поподробнее)
Я тоже нихуя не понял. Собственно, если ты правильно напишешь класс, то
Array< Array<int>(10) > a(10);
и есть рекурсия, о которой я думал, и я не вижу препятсивй для этого.
>Можно ли создать Array из Array'ев?
Да.
>и есть рекурсия, о которой я думал, и я не вижу препятсивй для этого.
Когда я передаю в качестве аргумента шаблону хуйню типо Array<int>(10), компилятор выдает ошибку о том, что это нихера не тип, а объект класса: template argument for template type parameter must be a type
>БЛЁ, есть же Matrix<>
Я в курсе, это мой пердолинг
>Когда я передаю в качестве аргумента шаблону хуйню типо Array<int>(10), компилятор выдает ошибку о том, что это нихера не тип, а объект класса: template argument for template type parameter must be a type
Я на самом деле неопытен в плюсах, поэтому не заметил эту ошибку.
У тебя есть два варианта объявления массива:
- ты задаёшь размерность массива с помощью вложенных аргументов, а потом методом (который будет рекурсивно ресайзить подмассивы) ресайзишь его.
- ты задаёшь размерность массива аргументом темплейта, а размеры - туплой.
Можно сделать микс, но тогда будет сложно проверить соответствие размера туплы размерности массива, поэтому так делать не надо.
В первом случае ты сможешь использовать подмассивы независимо, во втором случае тебе нужен плоский массив с соответствующим образом перегруженным оператором [], и разделить его на подмассивы будет посложнее.
Лучше сделать так, чтобы конструктор массива принимал нужное число аргументов.
http://stackoverflow.com/questions/9100680/member-function-template-with-the-number-of-parameters-depending-on-an-integral
Буст офигенен как либа. Использовал в laba1 для длинной арифметике.
Есть один экзешник (exe1), который запускает другой экзешник(exe2), второй выполняется действия(копирует файлы).
Проблема в том что ехе1 и ехе2 находятся в разных директориях, и когда ехе2 спрашивает свой путь через GetModuleFileName() ему выдает путь ехе1.
Вероятно, в CreateProcess нужно добавить какие либо данные в STARTUPINFO, к примеру, но ничего похожего на это я не нашел..
https://msdn.microsoft.com/en-us/library/windows/desktop/ms682425(v=vs.85).aspx
https://msdn.microsoft.com/en-us/library/windows/desktop/ms686331(v=vs.85).aspx
Лол, третий с конца параметр в CreateProcess, в глаза ебусь.
Можно кукарекнуть, что это мой говнокод, который хотя бы работает?
Про массивы я как раз спрашивал и уже даже понял, как это реализовать. Насчёт локали и констант не понял. Поясни подробней, что не так.
Ну неужели нельзя сделать нормальный интерфейс . Макось уже успела поменять кучу хуйни, а тут этот кривой неудобный дизайн из года в год тянут.
Что не так с интерфейсом?
В случае с треугольниками там все нормально - их центры, которыми они закреплены, выровнены.
Надпись "сортировка по" выровнена по середине относительно выпадающего списка, тоже норм.
>Захотел такой написать проект на Qt
>Нашел такой на сайте файлик qt-opensource-windows-x86-msvc2015-5.8.0.exe , 1 Гб весит ну да ладно
>Оп, Qt да вместе с тулчейном студии. Два в одном, хорошо придумано
>Ставишь такой Qt, заходишь в настройки - а там пикрилейтед. Компилятора нету, ничего нету.
Это теперь отдельно качать студию?
Можно подключить утилиты Mingw, но ничего хорошего не будет.
Если нужно только Qt, то MinGW за глаза хватит. Если нужно GCC по-свежее, пусть MSYS ищет или Cygwin
Qt принципиально не может распространять тулчейн студии. MSVC в названии означает совместимость бинарных библиотек с MSVC. С MingW они несовместимы.
Тулчейн (или только компилятор) есть в SDK и WDDK, емнип.
>>953290
Cygwin не подойдёт без костылирования, инфа сотка. MSYS нафиг не нужен.
https://sourceforge.net/projects/mingw-w64/files/mingw-w64/
Что за смысл опций он предлагает, а именно threads и exceptions?
По первой прочитал:
http://stackoverflow.com/questions/17242516/mingw-w64-threads-posix-vs-win32
Разница как бы есть, но ее как бы нету, да?
>Разница как бы есть, но ее как бы нету, да?
Разница в том, что программа, у которой куча тредов, будет работать быстрее с Win32-тредами, но не будет полной поддержки C++11.
>и exceptions?
https://wiki.qt.io/MinGW-64-bit#Exception_handling:_SJLJ.2C_DWARF.2C_and_SEH
Различные модели несовместимы.
А я понял тебя. Ты захотел поставить Qt с либами студийными прямо из коробки. Но так как VS и Qt под разными лицензиями, Qt не может раздавать VS либы. Качай отдельно или ставь студию.
Нахуя они тебе вообще MSVC, если у тебя нет студии и ты не собираешься с ней интегрироваться? Для таких как ты есть большая кнопка download и там есть mingw.
Задача: Массив, в котором каждый элемент содержит данные уникального типа (т.е. первый элемент может содержать пару int'ов, второй int, bool и string и т.д.). Каждый элемент будет структурой/классом и в нем будут идентификаторы типа элемента, указывающие на то какой именно это элемент, так что при считывании я буду точно знать какие данные он должен содержать.
1-ый вариант решения: создать класс, который будет включать в себя все-все-все типы данных, используемых в его элементах и затем при добавлении в/считывании из массива просто записывать/считывать лишь нужные данные в/из каждого элемента. Очевидный минус - каждый элемент будет избыточен процентов на 95.
2-ой вариант передавать уникальные данные в бинарном виде, а затем при считывании, разбивать бинарные строки на нужные переменные. Тут придется повозиться с объемами бинарных строк. Откровенно говоря тут я плаваю и не слишком понимаю можно ли вообще по этому пути пойти. Во-первых потому что все данные я считываю из xml файла и на данный момент слабо представляю себе как я буду считывать бинарную строку, а затем ее преобразовывать. Но если все же это сработает, такой путь кажется оптимальнее. Плюс, я не уверен что такой вариант будет работать быстрее, хотя скорость для меня не столь важна в данном случае.
Возможно есть какие-то более изящные методы.
То есть теоретически каждый элемент массива может содержать неограниченное количество базовых типов?
Или всё таки есть ограничение на количество?
В любом случае лучше всего первый вариант с union.
http://en.cppreference.com/w/cpp/language/union
Если тебе нужно чтобы была возможность в массиве хранить бесконечное количество и сочетание разных типов - то делай union-структуру, а в массиве храни массивы этой структуры.
нет, количество переменных в каждом типе элемента вполне определенное для каждого типа, само разнообразие типов тоже ограничено, порядка 30 штук.
Все они в случайном порядке встречаются в массиве.
>>953486
да, спасибо, похоже это то что нужно.
struct S
{
int type;
union
{
myStruct1 a;
myStruct2 b;
myStruct3 c;
.....
};
};
std::variant же не поддерживает хранение любых типов, то есть нельзя заслать неспециализированный шаблон в какую-либо функцию. Это по сути типобезопасный union.
В QVariant можно запихать любое говно, которое ты ранее продекларировал с Q_DECLARE_METATYPE. Только и этот костылек мне не нравится. Наверно, еще немало времени пройдет, пока появится полиморфная обертка над std::variant для хранения любых типов.
Хм, тут то я проебался. Давно новости не читал. Для таких целей ввели std::any.
>само разнообразие типов тоже ограничено, порядка 30 штук.
Ну сделай 30 классов, наследующихся от одного базового и пихай их в массив указателей на базовый.
Не нужно так делать.
У меня есть некие события, каждое из которых описывается рядом переменных.
Типов событий ограниченное количество, примерно 30. Каждый из типов описывается своим набором переменных базового типа.
Массив - это совокупность случайного набора этих событий.
Проходя по массиву я должен четко определить что за событие содержится в каждом элементе и передать все его переменные дальше в код для обработки.
В принципе union, вроде бы, уже решил эту задачу. Для каждого типа событий я создал структуру с набором присущих ему переменных, затем создал еще одну структуру, единичного события (singleEvent), куда вписал enum, который определяет тип события и union, с переменными типов структур различных событий.
В основном классе создал массив из SingleEvent.
Теперь, проходя по этому массиву я считываю тип события и через switch раскидываю это по соответствующим полочкам.
Можешь использовать паттерн visitor, тогда твое событие будет само вывзывать необходимые методы посетителя. Только вот с твоими 30 классами это будет полный пиздец, на каждое событие по методу.
Кстати, а ты не думал, что их можно каким-то образом объединить (то есть подобное к подобному и так далее), потому что 30 разных событий, как по мне, это уж слишком дохуя, причем они все имеют только одного родителя.
Хотя в SDL гоняют union'ы для хранения событий и вполне себе ничего живут.
Верно написал. Я не ОП, но я хотел сказать, что в Windows Sysroot не нужен. ЕМНИП, он нужен для кросс-компиляции в POSIX-системах (Cygwin, например, но совместимость Qt с Cygwin не поддерживается).
Если ты хочешь именно хранить данные в массиве (а не ссылки на них) то через юнион единственный вариант - нужно чтобы объекты разных ивентов были одинакового размера. А вообще чтобы небыло "считываю тип события и через switch раскидываю" придумали полиморфизм.
нет, но применять собираюсь это в игре на UE4
>>953740
Кстати да, про полиморфизм все время забываю.
Насчет одинакового размера, из того что я прочитал юнион переменная просто занимает размер максимального элемента, что для массива должно быть приемлемо, или это не так? Во всяком случае компилятор по этому поводу ошибок не выдал.
про объединение думал, конечно, но там сложновато с подобием, плюс при дальнейшем написании кода это точно будет путать, поэтому от этой идеи решил отказаться.
По поводу визитора, нагуглил, надо почитать может быть получится извлечь профит.
в моем случае в свиче все равно будут функции, каждой из которых передается свой тип события. Поэтому проще сделать полиморфную функцию и вообще обойтись без свича.
Сейчас дочитываю C++ Templates - The Complete Guide и смотрю на такие вопросы как на пустое место.
И че? Нахуя это еботня кому-то нужна. Ты бы еще стандарт полностью прочитал
В .h описал все функции, заинклюдил во всех связанных .cpp. Вроде работает всё, но:
1) я правильно внутри h описал функции? Вид:
void sendsignal(int signal);
std::string sendmessage(std::string message);
Или без описания можно/нужно?
2) взаимосвязано с №1. Я сделал инклюд в .h
#include <string>
Это нормально? И можно ли в h разом описать все инклюды, общие для всех .cpp?
Я предполагаю 1-2 хидера по 15-25 описанных функций (т.е. 15-20 строк) в одном.
Т.е. идея свести все функции для удобства отслеживания.
В гугловыдаче один чувак топит за отсутствие инклюдов в хидерах, другой в 10 пунктов топит за использование хидеров при повторении инфы.
>(т.е. 15-25 строк)
пофиксил
>>953928
>другой в 10 пунктов топит за использование хидеров при повторении инфы
Уточнение: в смысле один и тот же набор инклюдов - повторение, по логике.
Там нужно макросы добавлять всякие, чтобы везде инклюды кидать.
На вижле #pragma once, в остальных компиляторах другие, но это всё гуглится.
class Yoba
{
template<typename T>
T test() { return T(); }
template<>
int test() { return 1; }
};
template class не подходит, один объект должен выдавать разные типы
Раскрой вопрос, пока не понятно. Желательно на примере, ещё лучше если это какой-то код, как ты себе это представляешь.
template<>
int test<int>(){ return 1; };
А вообще, можно без тимплитов оверлоады сделать:
int test() { return 1; };
Хотя нет, я протрезвел и понял, что написал хуйню. Оверлоад ты не сделаешь. Но и специализация у тебя будет хуевая, т.к. тимплитный аргумент руками писать будет надо
ideone.com/rFmjbP
Ну и как это, каждый день ощущать себя ущербным?
Я сам запутался, пытаюсь эффективно создавать переменные для интерпретатора скриптов (значения передаются сторонним С функциям типа set_as_int и я не могу их шаблонизировать), пока получается так:
Scalar var = script.newScalar<const char ж>("value")
Scalar var = script.newScalar<int>(14)
Array var = script.newArray({ script.newScalar<const char ж>("a"), script.newScalar<const char ж>("b") })
Array var = script.newArray<std::string>({ "a", "b", "c" })
Hash var = script.newHash({ { "a", script.newScalar<int>(1) }, { "b", script.newScalar<int>(2) } })
Hash var = script.newHash<int>({ { "a", 1 }, { "b", 2 }, { "c", 3 } })
Лучше же никак не сделать?
<boost/filesystem.hpp> - говорит за себя
<boost/lexical_cast.hpp> - строки в числа и обратно
<boost/format.hpp> - запихиваем что угодно в строку
<boost/current_function.hpp> - портабельный способ определить позицию в коде (для дебага)
До с++11 были ещё треды и ряд других вещей которые засунули из буста в стандарт
Anonymous Pro с обосравшимся хинтингом в qt-креаторе с вручную настроенными цветами
Сап ананасы, вкатился нуфаг. Дали задание:найти количество отрицательных элементов массива и вставить найденное кол-во перед первым в массиве отрицательным числом. Я написал какую-то поеботу, которая ищет сами элементы, но не могу додуматься, как вывести их кол-во. Прошу подсказки, пик прилагаю.
C-тред в другой стороне.
А вывод кирилицей на КьюТихе починили?
Нахуй что-то не в юникоде в 2017?
Ну ахуеть, да? В 17 то году самое то обмазываться windows 1251
Да, студия на русском, да, я говноед
Уже существующий файл нужно же конвертнуть в UTF-8, то гжде стрелочка меняет только отображение, а не содержимое файла.
>>954427
Если для студеноты то можешь http://cimg.eu/reference/group__cimg__tutorial.html посмотреть. А так-то нужно под задачу подбирать вариант. Пожет сразу в OpenGL пердолиться, может какое-то SFML или еще чего откопать.
Хм, если уж совсем грубо говоря, то мне нужно запилить через классы сравнение двух изображенийи более., просто не сильно представляю себе как эти изображения мацать и сохранять.
Студетота. Спасибо за тутор.
> Уже существующий файл нужно же конвертнуть в UTF-8, то гжде стрелочка меняет только отображение, а не содержимое файла.
Я в курсе, как руками конвертить. Вопрос в том, какого хуя студия сама не создаёт его с юникодовской кодировкой?
Возьми любую либу для работы с изображениями. Или тебе прям все-все надо самому написать?
Именно самому.
Ёбаная параша
Эккеля почитай. Там вроде как раз для таких написано.
Посмотри на C++ Tour Страуструпа
Нихуя не понятно начинается обычно с ООП. Вот в этом месте тебе нужно забыть как это процедурно программировать, и начинать думать вв рамках ООП.
http://ideone.com/ZTggVd
1) Ускорил на десять процентов, добавив пробел: http://ideone.com/bj8N8a (просто перекомпилировалось).
2) http://ideone.com/mqCLqO - удалил код второй функции, лол. Код первой функции замедлился.
Запусти на локальной машине, никаких гарантий производительности Ideone не даёт.
А вы, плюсисты, тем временем Java ругаете за тормознутость.
Я сомневаюсь, что разработчики LO уступают вам в мастерстве, скорее наоборот.
Они точно не ламеры и лучше вас среднестатистически.
И выходит, что C++ не так уж и хорош, как его хвалят.
Первый вызов без анролла работает быстрее (Больше инструкций-больше кэш миссов?) Это я к тому что Loop Unrolling не обязательно будет отимизировать цикл по скорости.
0/10, try harder
Прочти то, что я написал: я никак не изменил код первой функции в 2) и при этом она работает хуже.
Олсо, учти векторизацию.
все очень просто
там где раньше делал макросами - теперь делаешь типобезопасно на шаблонах
плюс шаблоны позволяют делать статический полиморфизм
там где раньше для реализации динамического полиморфизма ручками писал реализации vtable теперь пользуешься встроенными виртуальными функциями
ссылки используешь везде где нужно передавать что-то без копирования, раньше для этого указатели нужны были
указатели остаются нужны для реализации механик косвенного обращения
для реализации adhoc полиморфизма есть перегрузка
ну и прочее в том же духе
те на крестах по сути уже встроено для тебя куча механизмов что раньше приходилось либо писать ручками (тот же полиморфизм через vtable), либо делать это ослабляя типизацию (через макросы или void*)
>>954642
>Ускорил на десять процентов
>замедлился
Абсолютные значения не имеют значения (каламбур лол), у нас же не процессор реального времени и тайминги могут скакать в пределах +/-.
А вообще, ладно, проехали, я взбугуртил из-за того что был сегодня на собеседовании и там спросили как можно оптимизировать по скорости код на примере. Я упомянул simd и распараллеливание на потоки. Когда он начал говорить про анролл цикла(че-то там про уменьшение количества сравнений, без явных simd, видимо), я сказал, что это не даст гарантированного прироста еще и замедлить может при определенных условиях, все зависит от архитектуры процессора.
Те же строки можно сравнивать с помощью uint64_t (если есть) - типа, СИМД ручками.
Анролл даёт гарантированный прирост производительности в очень коротких циклах без вызовов функций. BTB его уменьшает, но он есть.
Но в данном примере всё зависит от флагов компиляции. Этот пример очень простой, и GCC наверняка векторизовал его с помощью SIMD.
> написан на C++, но лагает просто жутко даже на крутом компе
Duke Nukem 3D был написан в 1995 году. Выдавал 120 кадров в секунду на 486 кудахтере с 8MB оперативной памяти. Единственная причина почему у нас нет шутеров с 1200 фпс в 2017 году -- это то, что программистов перестали учить ассемблеру. Software is not a platform. Hardware is a platform.
https://www.youtube.com/watch?v=CezOHqlXAFY
А может потому что никому нахуй не уперлось 1200 фпс в шутерах?
Скажите, в Windows нативно как-то организована сборка мусора, чтобы автоматически освобождались из памяти объекты, на которые нету больше ссылок, или тут нужно самому их освобождать?
Например:
void OtherClass::callThisManyTimes() {
//создаю такой объект
MyClass *myClassInstance = new MyClass();
myClassInstance->doSomething();
//...
//тут нужно вызывать delete(myClassInstance), или в ОС есть подсчет ссылок ?
}
Помню в вузе с этим были проблемы, такая ситуация вызывала исключительные ситуации в неожиданных моментах
Для указателя ничего вызывать не надо, ты же не на куче его создаешь, а на стеке(в джаве все объекты в куче, если что)
Деструктор указателя или объекта, на который они указывают? Если ты создал указатель не на стеке (т.е. объявив объект) - надо. Вызывать деструктор объекта в обход указателя не следует.
объяви вне цикла новую переменную, типа int, не забудь ей сразу присвоить ноль, затем в цикле, каждый раз как будешь натыкаться на отрицательный элемент, прибавляй к ней единицу, при выходе из цикла получишь свое количество. Надо сказать, к программированию это мало отношения имеет, тут скорее логику подключить надо было.
Ну в c++ нету сборщика мусора. Советую не полениться и осилить таки std::unique_ptr и std::shared_ptr. Также неплохо бы осилить ссылки, l-value и r-value. После этого можно будет более менее с такими вопросами разбираться.
Можно пример синхронизации с другого языка, который тебя бы устроил?
Ну и стандартные мьютексы не подходят? (с++11)
http://en.cppreference.com/w/cpp/thread/mutex
У тебя Win10 и ты менял масштабирование интерфейса, я так понимаю?
Если за, тогда выкачай Windows 10 DPI fix или как его там, вроде так называется. Мыло сразу убирает
Насколько тебе важна производительность? Сколько я книг не читаю, но многие пишут, что ежели ты собрался что-то стоящее написать, не стоит заострять раньше времени внимание на обоссаных API, которые, во-первых непортируемы, а во-вторых настолько расщеплены (то есть реализуют малый набор операций, и лежат в одной куче, грубо говоря), что их все в идеале, да и даже не в идеале, заебешься просто изучать.
Если бы ты антивирусы писал, драйвера, системные сервисы или какую подобную поеботу, тогда да.
Что мешает тебе передать выполнение другому потоку, то есть std::this_thread::yield() и std::chrono для замеров интервалов времени? Что ты реализуешь? Реактор, проактор?
Похоже на правду, хотя масштабирование не менял. Если сбилдить, то в свойствах эту парашу можно отключить.
Спасибо.
Чтобы не перегревалась видеокарта, в новых играх приходится ставить 60 кадров. Причём, это игровая видеокарта, а не среднечёк.
Раньше можно было выжить сотни fps, тот же Дюк, потом возьмём для примера Cube 2, где fps упал в разы, но оставался внушительным, а сегодня эта цифра упала ещё в 3 раза.
Через 10 лет, для красивой современной графики придётся покупать супердорогую для рашкинского среднекласса видеокарту.
За те же бабки будут идти "машины" Российского производства.
Мы должны учесть и снижение количества покупаемых десктопов, что ещё больше повысит цены на их железо. Но цены игровых ноутбуков выставляют учитывая цену игровых десктопов, так что и они будут дорогими; даже не самые топовые.
Не ясна логика компаний-игроделов, им же нужно, увеличивать продажи любыми способами, а их AAA-игры идут всё у меньшего количества геймеров.
Но они не станут тратиться на дополнительные оптимизации, они слишком дорого обходятся. Многие проекты так вообще жить не смогут, т.к. расоходы будут перебивать прибыль.
Вероятно, что-то в этой сфере в скором времени изменится, скорее всего появятся новые ниши. Но конкуренция по истине огромна.
Сейчас школотроны умнее пердунов-альтфаков, так что завали ебало, хейтерский выродок.
>Чтобы не перегревалась видеокарта, в новых играх приходится ставить 60 кадров.
Бред какой-то.
>>955130
Просто разбираюсь с многопоточностью. Собственно чтобы код был портируемым и спросил.
По сути, один поток должен крутиться в цикле и периодически проверять (ожидать где-то пол секунды примерно) готовность другого потока который висит на блокирующем вызове.
Понятно, что реализаций подобного множество, мне было интересно, нет ли в стандарте сахарку для такого).
А вот по поводу yield можно подробнее, а то я понял, что он всего лишь вытесняет текущий поток.
Я только плюсы и знаю, лол. Мьютексы подходят, просто рассматриваю различные варианты.
малаца, заходи еще.
>Где получить эти знания я тоже не знаю, т.к. в книгах такое не рассказывают.
Вон из профессии.
Вон из треда школьник
Тебе нужно искать книги по архитектуре программного обеспечения, а не по языку программирования. Сначала посмотри Gang of Four Design Patterns.
Ну сделай сначала блок схему архитектуры, если не можешь сообразить сразу в коде.
https://en.wikipedia.org/wiki/Class_diagram
В общем случае тут и посоветовать нечего, скорее всего ты просто выбрал не ту профессию, если у тебя не получается проектировать в голове даже простые вещи.
Архитектура от задачи зависит. Хотел тебе написать о разделении клиентского и backend-кода, но это тоже не всегда нужно.
>>955532
У этого студента проблемы с несколькими классами в разных файлах, а ты ему паттерны советуешь, лол. Вещь хорошая, но ему вообще не поможет, если у него не получается три класса связать без ошибок.
По сути, там наглядно показывается связь компонентов друг с другом. А ежели вопрошающий не знает, как связать два класса, то ему и UML не поможет. Нужно хотя бы синтаксис понимать, хотя бы минимум.
чел, не тупи, пиши все в одном .cpp файле
на более-менее норм компе можно спокойно работать в любой ide с файлом в несколько сотен тысяч строк без тормозов и с незаметной глазу временем компиляции
QRegularExpression(R"(((?<one>\w+)=(?<two>\d+)\s+)+")
в "foo=12 bar=42"
заматчит только последние вхождения
<one> bar
<two> 42
мой препод совковых времен с пеной у рта доказывает, что это потрясающая IDE
но у меня чет есть подозрения
>это потрясающая IDE
Для 1998 года была неплохая IDE. Так что препод прав. Спроси его только, что он делал последние 20 лет.
Покажи ему Visual Studio 2017 и CLion 2016. Пусть посмотрит на чудеса современности лол.
О, класс. Спасибо.
А то я тут почитал http://www.cplusplus.com/reference/algorithm/next_permutation/
Меня смутило: "A permutation is each one of the N! possible arrangements the elements can take".
Да у меня трустори. Делал я, значит, laba1 на C++, конпелировал у себя дома на g++ с ubuntu. Я специально ухудшал свой код, в результате он стал менее читаемым и безопасным, зато конпелировался даже на c++98 (тестил на cpp.sh) и препод не доёбывался (он любит максимально старомодный код). Думал, что никаких проблем не будет, но на компах в классе была visual studio, да и ещё 2010, где мой код, конечно же не работал. У одногруппников на 2015/2017 студиях код тоже не работал. Как я понял, дело в Visual C++, которая имеет некоторые отличия. Вот я и поинтересовался, можно ли как-то воспользоваться g++ на ведроиде с целью конпеляции на wndws.
Пока что остановился на установке ОС на USB, т.к. у меня даже с C# была проблемы из-за устаревшего софта.
Так тебе на ведре или на убунте нужно компилить? Если убунта, то вот какой-то способ.
http://stackoverflow.com/questions/2033997/how-to-compile-for-windows-on-linux-with-gcc-g
warning: return from incompatible pointer type
return huita;
100 лет на си не писал
> char a[] = "слово";
> char b[] = "aword";
> std::cout << sizeof(a) << "\t" << sizeof(b) << std::endl;
Не могу понять, вроде оба массива являются char, но для русского массива выделяется в 2 раза больше памяти, не подскажет кто почему?
Потому что кириллический символ занимает 2 байта и не помещается в один char. Можешь использовать 2-байтовые чары:
wchar_t a[] = L"слово";
std::wcout << a;
но там какая-то возня с локалью ещё нужна
А Шрёдингер разве тоже пидором был?
>Не могу понять, вроде оба массива являются char, но для русского массива выделяется в 2 раза больше памяти, не подскажет кто почему?
Потому что в твоём компиляторе используется UTF-8. Сделай текстовый файл в UTF-8 в Notepad++ - увидишь то же самое.
Чтобы узнать число букв нужно использовать другие функции.
const unsigned int const a = &c;
Можно ли весь тип переменной а(const unsigned int const ) вывести в консоль?
boost вроде умеет через type_info работать
>could not convert 'nullptr' from 'std::nullptr_t' to 'QModbusDataUnit'
>return nullptr;
Код выглядит так:
QModbusDataUnit::RegisterType regType = QModbusDataUnit::HoldingRegisters;
bool ok = true;
int startAddress = this->ui->lineEditRegAddr->text().toInt(&ok, 0);
if (ok == false) {
return nullptr;
}
Почему nullptr несовместим с экземпляром класса?
Я кроме как получить сырой указатель и кастануть его dynamic_cast`ом ничего не придумал
http://pastebin.com/DR6kPzQH
Пньятненько, надо было не думать, а погуглить
Вот это накрутили в С++.
http://stackoverflow.com/questions/3030829/c-is-it-possible-to-set-an-object-to-null
Оказывается, экземпляр класса - это не указатель в памяти, как объясняли в вузе. Переделал тип возвращаемой переменной в подпрограме на указатель с экземпляра, а дальше - разименовываю его, проставив звездочку
Ты бы блять хотя бы объявление функции показал. Откуда мне знать, что она возвращает?
Если ты не CUDF-ёб, то, думаю, можно. В c++17 нормальные такие плюхи завезли.
нет, будет слайсинг
Есть много алгоритмов, но TOP PRO CODERS наиболее часто пользуются таким:
StackOverflow-Google-Yandex Driven Development
Решил второй раз попробовать вкатиться, в прошлой версии такого не было
Ну че ты начинаешь
Строки abcd,efg,hjklm
записываем abcdefghjklm и маску 11110001111
Так вот, вопрос: можно ли это сделать как-то компактнее? Понятно, что строчку можно сжать всякими хаффманами и lz, но меня сейчас больше интересует собственно оптимизация хранения инфы для восстановления списка строк.
Ну сортировку там какую-нибудь, поиск в глубину-ширину. Если хочешь выебнуться, то можешь разобраться с ахо-корасиком, красно-черными деревьями и разными дейкстрами-хуекстрами, но энивей это юзлесс говно тебе никогда не пригодится.
Мы то откуда знаем что тебе нужно? Ставь вон инструменты C++ для iOS. Точно нужно!
Install Gentoo Install MinGW.
>Разработка приложений Windows
>Разработка классических приложений
Я создаю "class 1" объект которого создаётся в main.cpp, потом у меня есть другой класс "class 2", объект которого я создаю в первом классе. В первом классе я спокойно могу использовать поля и методы второго класса, но как сделать чтобы второй класс мог использовать первый класс? Я не знаю как это сделать т.к. объект первого класса у меня создаётся в main.cpp... Я вам даже схему нарисовал.
Передавай указатель на экземпляр первого класса при инициализации экземпляра второго.
Так у меня экемпляр второго класса инициализируется в первом классе, как и куда мне передавать указатель? Там нет обратной связи, у меня классы в разных файлах.
Посмотри здесь:
http://stackoverflow.com/questions/38060436/what-are-the-new-features-in-c17
Вот, что я ждал, это следующие:
if constexpr, который, например, для следующей конструкции, не будет заставлять использовать другие шаблонные функции-хелперы или структуры:
template<typename T>
auto fn(const T &x) {
if constexpr (std::is_same<T, short>::value) {
return x;
} else {
return static_cast<int>(x);
}
}
То есть теперь можно из одной функции возвращать значения разных типов (грубо говоря, и с определенными условиями, конечно же). Раньше для этого нужно было применять SFINAE к функциям, и дублировать, дублировать, а потом этот самый SFINAE перерастал в монструозный кусок говна. Теперь по-проще.
>> Template deduction of constructors
Вот это однозначно заебатая вещь, только в объявлениях она не будет работать, как я понимаю. То есть, раньше, чтобы сделать std::map причем с ебанутым маппингом, нужно было делать так, например:
std::map<std::string, std::shared_ptr<std::pair<int, myType>>> map;
Сейчас можно просто при создании std::map нахуячить туда значений и вот эту всю синаксическую парашу можно не писать, то есть:
std::map {
std::pair(firstString, sharedPtr),
};
>> Structured binding declarations
Тоже интересная вещь, сделанная по подобию Python, то есть, преобразует std::pair и std::tuple в наборы значений, не нужно делать pair.first, pair.second, std::get<0>(tuple) ... Что тоже очень хорошо
>> std::string_view
>> Removal of trigraphs
>> Allow typename (as an alternative to class) in a template template parameter
>> non-const .data() for string.
>> non-member std::size, std::empty, std::data like std::begin/end
Неужели блять?!
Посмотри здесь:
http://stackoverflow.com/questions/38060436/what-are-the-new-features-in-c17
Вот, что я ждал, это следующие:
if constexpr, который, например, для следующей конструкции, не будет заставлять использовать другие шаблонные функции-хелперы или структуры:
template<typename T>
auto fn(const T &x) {
if constexpr (std::is_same<T, short>::value) {
return x;
} else {
return static_cast<int>(x);
}
}
То есть теперь можно из одной функции возвращать значения разных типов (грубо говоря, и с определенными условиями, конечно же). Раньше для этого нужно было применять SFINAE к функциям, и дублировать, дублировать, а потом этот самый SFINAE перерастал в монструозный кусок говна. Теперь по-проще.
>> Template deduction of constructors
Вот это однозначно заебатая вещь, только в объявлениях она не будет работать, как я понимаю. То есть, раньше, чтобы сделать std::map причем с ебанутым маппингом, нужно было делать так, например:
std::map<std::string, std::shared_ptr<std::pair<int, myType>>> map;
Сейчас можно просто при создании std::map нахуячить туда значений и вот эту всю синаксическую парашу можно не писать, то есть:
std::map {
std::pair(firstString, sharedPtr),
};
>> Structured binding declarations
Тоже интересная вещь, сделанная по подобию Python, то есть, преобразует std::pair и std::tuple в наборы значений, не нужно делать pair.first, pair.second, std::get<0>(tuple) ... Что тоже очень хорошо
>> std::string_view
>> Removal of trigraphs
>> Allow typename (as an alternative to class) in a template template parameter
>> non-const .data() for string.
>> non-member std::size, std::empty, std::data like std::begin/end
Неужели блять?!
"кастовать типы" можно, если реализовать соответствующий converting constructor. Если ты про полиморфизм то его нельзя.
А потом уже куда потянет. Можешь базы данных задрачивать, можешь графику, можешь системное программирование, машинное обучение и еще кучу разных направлений. Я, например, сейчас решил разбираться в вопросах архитектуры, книг много, например Software Architecture in Practise, Pattern-Oriented Software Architecture (она в 5 томах), и еще какие-то есть, я уже забыл, вот эти самые запоминающиеся, как по мне. Ну можешь еще почитать Совершенный код - тоже никому не мешало еще.
Как мне проверить каждую строку первого файла с каждой стройок второго файла Строка 1 файла один со строкой 1 2 3 4 5 6....n до конца файла 2. Потом строка 2 файла 1 со строкой 1 2 3 4 5 6....n до конца файла 2?
Я нашелнабросал такое - но такой алгоритм проверяет первую строку одного файла с первой строкой другого, вторую строку со второй и тд.
Если есть исходник такой хуйни - буду рад. В гугле - хуйня подобная моей.
http://pastebin.com/bvDd1LLV
struct Hui
{
Type type;
union
{
int ival;
float fval;
};
};
где Type - enum co значениями INT и FLOAT
Можно ли как-нибудь сделать функцию, которая бы возвращала ival, когда type == INT и float, когда type == FLOAT?
или я даун и так делать не надо (но тогда как лучше это провернуть?)
Хотя, блядь, это же будет известно только во время выполнения, а следовательно хуй компилятор такое провернёт
Си чистый. Впрочем, никого это не должно удивлять. В универах так и учат.
Можно такую хуйню с полиморфизмом провернуть: делаешь базовый абстрактный класс с единственным методом getType(), и делаешь enum, элементы которого возвращаются этим методом. Потом каждый примитив оборачиваешь в наследников этого класса и передаешь дальше куда тебе надо. Для выбора стратегии просто пишешь свитч с getType и усе. Это самый тупой способ, можно нормально с помощью какого-нибудь паттерна заебошить(по типу стратегии)
Единственный минус такого подхода - для каждого примитива надо писать обертку(хотя можно и на шаблонах сделать) и передавать все объекты по ссылке(по значению получится срезка)
Алсо, если ты используешь только примитивы разных размеров, то можно выбирать действие в зависимости от sizeof примитива.
Вот именно. Можно сделать функцию, которая будет возвращать тебе дабл, например - в него помещаются оба типа без потерь, если он шире обоих.
Потыкай кнопку "Файл -> Новый проект -> Проект из существующего кода" (или как оно там по-русски).
Чем any не угодил?
Получаю:
ошибка: cast from 'uint8_t {aka unsigned char}' to 'uint8_t {aka unsigned char}' loses precision [-fpermissive]
crc_hi = crc_lo ^ (uint8_t)(&auchCRCHi); // calculate the CRC
На stackoverflow советуют в таких случаях навешивать приведение типов ( http://stackoverflow.com/questions/21574449/why-is-cast-from-x-to-y-loses-precision-a-hard-error-and-what-is-suitable ) но куда его тут вешать, вроде бы типы всех операндов явно соблюдены?
Пишу на QT, Win32. Возможно, деды писали этот код для С.
Диды это под дос писали?
Начнем с того, что ты - пиздоглазое мудило!
&auchCRCH\[i\] - это адрес i-того элемента в массиве auchCRCH.
На кой хуй ты его приводишь к типу uint8_t?
мимо-школьник-кун
Спасибо за ссылку, навела на идею: классы включаю через указатели, а сами вложенные классы определяю в .cpp-файле без вложений.
>>957481
На уой ляд там взятие указателя? Зачем адрес для подсчёта CRC?
Вангую, что этот код никогда не работал.
Код взял отсюда:
http://we.easyelectronics.ru/khomin/modbus-rtu-dlya-chaynikov.html
Похоже, его писали под контроллер с достаточным объемом ОЗУ.
Это объясняет, почему там указатель кастится в 8-битный инт. Если ты под винду хочешь это скомпилить, то поменяй uint8 на что-нибудь побольше, а то у тебя оно банально не влезает.
В первом же комментарии к высеру:
>Данный код на работоспобность не проверял, набросал за 20 минут )
Есть проверенный проект, осторожно! Присутствует быдлокод и нет комментариев ))
А ты и вправду зеленый, раз постишь нерабочий код на с99 в крестотред.
Вот пост с рабочим кодом.
http://we.easyelectronics.ru/khomin/modbus-rtu-dlya-chaynikov.html#comment118068
Проект там под АВР, указатели и инты там 16разрядов.
> Начнем с того, что ты - пиздоглазое мудило!
>
> &auchCRCH\[i\] - это адрес i-того элемента в массиве auchCRCH.
>
> На кой хуй ты его приводишь к типу uint8_t?
>
> мимо-школьник-кун
В голосину блядь
Вот только распределение там будет другое (скорее всего уёбищное) и для общения по протоколам с использованием CRC это говнище использовать нельзя.
http://we.easyelectronics.ru/khomin/modbus-rtu-dlya-chaynikov.html#comment174196
Вот и разъяснение подъехало. Чтобы это заработало в обычной программе без разделения на флэш/нефлэш нужно писать
auchCRCHi
вместо
(uint8_t)pgm_read_byte(&auchCRCHi)
Как прикрутить QT к Xcode? А то уж больно мне не нравится QtCreator
// Подключаем общий yoba.h, упрощённо:
class Yoba {};
потом вместо
Yoba ptr = new Yoba;
получается так
Yoba ptr = reinterpret_cast<Yoba>(18446744072632792624);
18446744072632792624 - адрес объекта того же класса, который создан в той же программе, но в другой shared библиотеке.
Будет ли это работать например с виндовыми .dll?
Правильный ли тип для указателя? У меня выбор из long long, unsigned long long и строки. Компилятор - GCC, должно работать на любой ОС, у меня на 32-битном линуксе вроде работает
Попробую где-нибудь спрятать void*, но тип это только малая часть проблемы.
Суть в том, что у меня есть интерпретатор и с ним можно делать что угодно: эвалить строки, запускать файлы, либо делать всё напрямую через API без расходов на парсинг текста. Но никакой обратной связи нет, о своей С++ обёртке он ничего не знает, сунуть коллбек некуда. Единственный способ задействовать С++ код - подключить разделяемую библиотеку как модуль. И я задумал сделать небольшой модуль, который бы взаимодействовал с С++ кодом который уже в памяти. Получается примерно такая схема:
С++ (yoba.so):
link libperl.so
perl.eval(" YobaModule::call('funcname') ");
C (libperl.so):
link yoba-module.so
yoba_module_call_function(this_cpp_interpreter_ptr, "funcname")
C++ (yoba-module.so):
link yoba.so
this_cpp_interpreter_ptr->getCallback("funcname")();
С++ (yoba.so):
...возвращаемся сюда
И ещё вопрос - если все эти либы оптимизированы компилятором, будет ли значительный оверхед из-за таких кросс вызовов, от чего это зависит?
http://stackoverflow.com/questions/9456635/effect-of-dll-to-execution-speed
Вот здесь пишут, что оверхед небольшой, но, я, в принципе, тоже так считаю. Если ты делаешь подключение библиотеки как плагина, то потребуется время на загрузку либы и разбор таблицы символов в писках экспортируемых функций. А так, во время работы это не чувствуется (сам плагинами трюками пользуюсь уже давно и все заебись пока что)
1) Скачиваешь Qt для MinGW - внутри динамический Qt, MinGW и Qt Creator. Ставишь.
2) Указываешь в Xcode путь к MinGW (сам гугли).
3) Смотришь в документации, как пользоваться Qt через qmake и moc (емнип, moc вызывается qmake-ом). Воспроизводишь эту последовательность через настройки сборки в Xcode.
Готово!
Бамп
Боюсь что так тоже не выйдет.
Ты хочешь от чтения книг, в которых тебе объясняют каждую строчку по целой странице, а то и больше, перейти к чтению кода, в котором, если повезет, на половину строчек будут небольшие комментарии.
Почему сам не попробуешь написать что-то. Придумай себе задачу, сделать простенькое приложение и начни пилить, пользуясь гуглом и прочими форумами, АИБами.
>Так вот, вопрос: можно ли это сделать как-то компактнее?
Пиздец. Вариантов ажно три:
- пиши нулевой байт в конце строки
- пиши байт длины строки в начале строки. Если нужно хранить длинные строки и хочется больше места, можешь писать блоками по 255 символов: если длина строки 255, то после блока пишешь байт 0 - типа, строка закончилась, а во время чтения проверяешь байт, следующий за блоком - если 0, то строка кончилась и нужно начинать следующую
- operator<< и operator>> блядь. Эти бро запишут всю твою структуру строк вместе с их числом и коректно прочитают.
Писать битовые маски - уродский вариант.
Спасибо. А плагинов для дизайна форм в XCode нет? Или можно импортировать ui-файлы из QtCreator?
Никогда не использовал Xcode, плагины можешь сам поискать, .ui-файлы наверняка специфичны для Qt.
Байтовые строки - что это еще за зверь такой?
Если хранишь именно текстовые строки - просто раздели строки с помощью "\n", в с++ есть методы чтения строчек из текстового файла.
Если хранишь бинарные данные произвольной длинны - то самый простой варик - это писать в файл byte или int с размером строки, а следом - сами байты строки, потом опять размер строки и байты и тд.
Но в таком случае у тебя будут проблемы с произвольным доступом к строкам - ты не сможешь найти строчку с индексом i, не пройдясь по всему файлу.
Если похуй и загружаешь всё целиком - можешь так и оставить, если нужен произвольный доступ - то пишешь в начало файла индекс-данные, например так (псевдокод):
int count; //количество строк.
[
{
int id; //номер строчки
int64 offset; //offset начала строки
int size; //длина строки в байтах
}
]
После этого ты можешь читать только индекс, а потом скипать файл до нужного offset.
а ты уверен, что в этом консольном шрифте есть японские символы? менять пробовал?
Потому что ебланы не умеют пользоваться goto и засрут им весь код.
Если хочешь сделать что-то типа goto end, лучше сделай так
do {
stmt_1;
if (expr) {
break;
}
stmt_2;
} while (false);
end_stmt;
Или можешь использовать идиому Guard
Это табу для новичков. Для сильных разрабов это еще один инструмент, который имеет свои применения. А дебил его просто повсюду будет пихать и дебажить потом до тепловой смерти вселенной
Всё просто - табы в разных редакторах по-разному отображается.
Нужен контейнер под набор данных.
Набор содержит, положим, 6 полей(?), 10000 единиц хранения, например:
1) int 2) int 3) int 4) string 5) string 6) string.
По отдельности одинаковые 1, и 2, и 3 могут встречаться во всём наборе не по разу, но вот совокупность 1 и 2 даёт уникальный поднабор данных (например 10 единиц хранения), а совокупности 2 и 3, или 1 и 2 дают уникальную единицу хранения.
То есть, эдакий составной ключ. Обращаться я хочу как к уникальной какой-то единице, так и к поднабору (те самые 10 единиц из 10000).
Менять уникальные единицы не планирую. Т.е. только вставить, прочитать, удалить.
Вот каким это контейнером (контейнером же?) это лучше реализовать, не перебирать же все значения.
Из идей у меня
std::unordered_multiset<int, int, int, std:string, std:string, std:string>globMultiset;
Предполагал, что получится фигня, фигня и получается.
Или мне что-то со struct надо придумать?
Фактическая идея - таблица с составными ключами по типу как у БД.
И что делать с неиспользуемыми output-параметрами функций из сторонних библиотек и legacy-кода? Код типа:
int unused_param = 0;
do_a_barrel_roll(foo, bar, unused_param);
выглядит топорно, есть ли какие-то изящные решения? Wrapper-ы под каждую такую функцию писать, что ли?
Это наверное следствие из того что на временные объекты нельзя объявлять не конст ссылки, так как объект может быть уничтожен в любой момент и такая ссылка не имеет смысла. А при объявлении константной ссылки время жизни временного объекта продлевается до времени жизни ссылки.
A x1 = B()
B x2 = dynamic_cast<B>(x1)
чтобы не возиться с кучей? Я не могу размещать все объекты в куче, потому что придётся реализовывать сборщик мусора
На ум приходит
shared_ptr<A> x1(new B)
shared_ptr<B> x2 = dynamic_pointer_cast<B>(x1);
но невозможно же по всему коду такие конструкции писать, можно как-то упростить через перегрузку оператора= или вроде того?
Конструкция на картинке компилится, но x2 считается чистым объектом A, виртуальные методы не работают
Чем тебе QtCreator не угодил? Это единственная кросс-платформенная и полноценная альтернатива студии, я его давно использую без всякого Qt, а для разработки на Qt это очевидно лучший инструмент. Система сборки - CMake (стандартная QMake слишком примитивная). Можно подключить плагины вроде обычных вкладок и разные анализаторы кода на лету.
> Это единственная кросс-платформенная и полноценная альтернатива студии
Полнейшая кросс-платформенная альтернатива студии - clion. По сравнению с ним QtCreator и рядом не стоял
Хотя в целом он неплох
>JetBrains
Если уж использовать графические приложения на джаве, то и писать лучше на ней, чтобы не расставаться со сборщиком мусора в анусе и занимать всю доступную память, Eclipse/NetBeans туда же.
Кстати есть ещё навороченный KDevelop, но он тащит с собой KDE либы на 300 мб и соответственно отрисовывается на них, выглядит абсолютно чужеродным вне KDE окружения. Зато подсвечивает и выводит подробный тултип чуть ли не на каждый символ в коде, раскрывает макросы, автодополнение на том же уровне. Использует файлы CMake как проект и лучше всех работает с ними. Должен хорошо работать с Qt, так как сам по сути на нём написан.
Наследовать Scalar и Array от одного класса Variable и возвращать Variable из функций. Почему полиморфизм на стеке невозможен?
>shared_ptr<B> x2 = dynamic_pointer_cast<B>(x1);
Что ты делаешь, блядь.
shared_ptr<B> x2 = x1;
B &x3 = x1;
Слабо штоле?
>A x1 = B()
>B x2 = dynamic_cast<B>(x1)
Боже....
B &x2 = B();
A &x3 = B();
Виртуальные деструкторы не забудь только.
Я уже всё перерыл в интернете и ничего не нашёл на этот счёт, а то что нашёл не помогло. Сам gdb показывает C++ код, но вот ёбаный qt creator показывает его дизассемблированным.
Так же, как включить табы.
Ты точно в Debug конпилируешь? Убедись что в выхлопе конпеляции есть флаг -g для GCC. Ассемблер он отображает когда эксешник/либа собрана без debug-символов и с оптимизацией. Никогда такой проблемы не было, собственно именно в креаторе я в своё время познакомился с GDB, стало круто сегфолты искать.
Compile Output, должен быть флаг -g и не должно быть -О2
Можешь ещё написать QMAKE_CXX или просто CXX (не помню) = g++ -g чтобы наверняка
Всё нормально с флагами компиляции, и в QMAKE_CXXFLAGS я их тоже дописал чтобы наверняка, всё равно не помогает.
> g++ -c -pipe -g -O0 -g -Wall -W -D_REENTRANT -fPIC -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I../../untitled -I. -isystem /usr/include/qt -isystem /usr/include/qt/QtWidgets -isystem /usr/include/qt/QtGui -isystem /usr/include/qt/QtCore -I. -isystem /usr/include/libdrm -I/usr/lib/qt/mkspecs/linux-g++ -o main.o ../main.cpp
> g++ -o untitled main.o -lQt5Widgets -lQt5Gui -lQt5Core -lGL -lpthread
То есть gdb untitled у тебя в штатном режиме работает? Тогда не представляю в чём проблема, если он отображает ассемблер, значит видит GDB, а если видит, то должен отображать то же самое.
Я бы ещё удалил .pro.user и открыл проект заново для переконфигурации, проверил и поменял какие-нибудь параметры
Да я уже всё перепробовал, я сегодня весь день на это потратил.
Так, падажжи. Тогда B &&x2 = B(); - ссылка на rvalue.
>>959720
Телепаты в отпуске, УМВР.
http://ideone.com/V8dwB1
Только что запустил - УМВР. КОгда дебужил релизный код - видел ассемблер, и когда ты будешь в функции без символьной инфы попадать, тоже будет ассемблер.
Exception e;
e.arg1=...
e.arg2=...
...
throw e;
никогда не встречал вторую конструкцию.
Да, я куда только уже не жмакал.
struct ZALUPA {
....T1 a1;
....T2 a2;
}
try {
....throw Zalupa{ 1,2 };
} catch(const Zalupa& z) {
....// do something
}
Не нужно, если у тебя нет буста едущем на бусте
Наконец-то осилил вызов С++ функций из скрипта. Создаём для скрипта функцию, например YobaPerl::test, она вызывает С++ функцию из небольшой либы-моста, та в свою очередь достаёт из таблицы символов интерпретатора указатель на С++ обёртку вокруг него и делает с ним что угодно. Достать из стека интерпретатора аргументы функции и засунуть обратно результаты не проблема.
Эффективности должно быть достаточно для использования в игровом движке например, по-моему до меня с Perl никто такого не делал.
Пример:
// C++
perl.set_callback("func_name", [](Array args) -> Array { ... });
// Perl
@results = YobaPerl::call("func_name", ...)
И всё работает максимально быстро, проблема только с поиском коллбека по имени, но по-другому похоже не сделать никак
Я тебя боюсь.
Ответ http запроса должен помещаться в массив байт, который является единственным элементом вектора. Задание такое)
Мне кажется, ты всё слишком буквально воспринимаешь.
Если у тебя дохуя хидеров, которые нужны_везде, то ты делаешь предкомпилированый заголовочный файл и включаешь его везде. Компилятор вместо того чтобы парсить этот хидер берёт предкомпилированный бинарь и читает его. Что существенно быстрее.
Короче - для говнокодеров, которые не умеют форвард декларации и приватную имплементацию. Пидрильный код, пропагандируемый мелкомягкими.
И да, в шланге и гцц оно есть. гугли gcc/clang pch
Потому что полиморфизм предполагает разные объекты, т.е. разные размеры. А не стеке не может лежать что-то неопределённого в момент компиляции размера.
Это же ж очевидно.
Никак. Энджой ойр СТАТИЧЕСКАЯ ТИПИЗАЦИЯ. Если ты современный объектно-ориентированный парень то можешь почитать про ШАБЛОН ПРОЕКТИРОВАНИЯ КОМАНДА.
[code]
cmake_minimum_required(VERSION 2.8)
project(CCoda)
set(CMAKE_BUILD_TYPE Release)
file(GLOB python_binding_src "../src/nlp-stack//PythonExtension.cpp")
file(GLOB python_binding_h "../src/nlp-stack//PythonExtension.h")
file(GLOB_RECURSE all_h "../src/nlp-stack//.h")
add_library(ccoda SHARED ${all_h} ${python_binding_h} ${python_binding_src})
[/code]
Почему-то эта cmake-параша не видет .h файлы, жалуясь после cmake . && make:
[code]
$ make
-- Configuring done
-- Generating done
-- Build files have been written to: /home/xxx/Fitness_Bot/Coda/c_interface
Scanning dependencies of target ccoda
[ 20%] Building CXX object CMakeFiles/ccoda.dir/home/xxx/Fitness_Bot/Coda/src/nlp-stack/Dictionary/PythonExtension.cpp.o
In file included from /home/xxx/Fitness_Bot/Coda/src/nlp-stack/Dictionary/PythonExtension.cpp:1:0:
/home/xxx/Fitness_Bot/Coda/src/nlp-stack/Dictionary/PythonExtension.h:3:33: fatal error: DictionaryInterface.h: Нет такого файла или каталога
#include "DictionaryInterface.h"
^
compilation terminated.
CMakeFiles/ccoda.dir/build.make:62: ошибка выполнения рецепта для цели «CMakeFiles/ccoda.dir/home/xxx/Fitness_Bot/Coda/src/nlp-stack/Dictionary/PythonExtension.cpp.o»
make[2]: [CMakeFiles/ccoda.dir/home/xxx/Fitness_Bot/Coda/src/nlp-stack/Dictionary/PythonExtension.cpp.o] Ошибка 1
CMakeFiles/Makefile2:67: ошибка выполнения рецепта для цели «CMakeFiles/ccoda.dir/all»
make[1]: [CMakeFiles/ccoda.dir/all] Ошибка 2
Makefile:83: ошибка выполнения рецепта для цели «all»
make: * [all] Ошибка 2
[/code]
Хотя в переменных этот файл есть, и grep говорит что он там:
[code]
$ grep -r DictionaryInterface.h .
./CMakeFiles/ccoda.dir/CXX.includecache:DictionaryInterface.h
./CMakeFiles/ccoda.dir/CXX.includecache:/home/xxx/Fitness_Bot/Coda/src/nlp-stack/Dictionary/DictionaryInterface.h
[/code]
Помогите побороть эту залупу!
[code]
cmake_minimum_required(VERSION 2.8)
project(CCoda)
set(CMAKE_BUILD_TYPE Release)
file(GLOB python_binding_src "../src/nlp-stack//PythonExtension.cpp")
file(GLOB python_binding_h "../src/nlp-stack//PythonExtension.h")
file(GLOB_RECURSE all_h "../src/nlp-stack//.h")
add_library(ccoda SHARED ${all_h} ${python_binding_h} ${python_binding_src})
[/code]
Почему-то эта cmake-параша не видет .h файлы, жалуясь после cmake . && make:
[code]
$ make
-- Configuring done
-- Generating done
-- Build files have been written to: /home/xxx/Fitness_Bot/Coda/c_interface
Scanning dependencies of target ccoda
[ 20%] Building CXX object CMakeFiles/ccoda.dir/home/xxx/Fitness_Bot/Coda/src/nlp-stack/Dictionary/PythonExtension.cpp.o
In file included from /home/xxx/Fitness_Bot/Coda/src/nlp-stack/Dictionary/PythonExtension.cpp:1:0:
/home/xxx/Fitness_Bot/Coda/src/nlp-stack/Dictionary/PythonExtension.h:3:33: fatal error: DictionaryInterface.h: Нет такого файла или каталога
#include "DictionaryInterface.h"
^
compilation terminated.
CMakeFiles/ccoda.dir/build.make:62: ошибка выполнения рецепта для цели «CMakeFiles/ccoda.dir/home/xxx/Fitness_Bot/Coda/src/nlp-stack/Dictionary/PythonExtension.cpp.o»
make[2]: [CMakeFiles/ccoda.dir/home/xxx/Fitness_Bot/Coda/src/nlp-stack/Dictionary/PythonExtension.cpp.o] Ошибка 1
CMakeFiles/Makefile2:67: ошибка выполнения рецепта для цели «CMakeFiles/ccoda.dir/all»
make[1]: [CMakeFiles/ccoda.dir/all] Ошибка 2
Makefile:83: ошибка выполнения рецепта для цели «all»
make: * [all] Ошибка 2
[/code]
Хотя в переменных этот файл есть, и grep говорит что он там:
[code]
$ grep -r DictionaryInterface.h .
./CMakeFiles/ccoda.dir/CXX.includecache:DictionaryInterface.h
./CMakeFiles/ccoda.dir/CXX.includecache:/home/xxx/Fitness_Bot/Coda/src/nlp-stack/Dictionary/DictionaryInterface.h
[/code]
Помогите побороть эту залупу!
http://pastebin.com/XBg4RiE0 - рейт
В чем идея - есть мини-консолька, и хотелось сделать автовывод всех типов и их количества для коллбэков, чтобы новые команды в консольку добавлять просто как пара "строка - указатель на функцию". А конвертация типов из строк и прочее - было автоматически. И мне это удалось.
Работает на g++ 5.4 и студии 2015
http://www.cplusplus.com/reference/functional/function/
Ты про этот function? Что значит "разные функции"?
Ну просто разные. Открываешь любой заголовочный файл и вырываешь оттуда любые функции.
>>960441
Самое лучшее, что можно сделать без существенных усилий:
http://stackoverflow.com/a/19473438/6889930
Для этого нужно, чтобы у функций одинаковая структура была. Может кому-нибудь и такой вариант пригодится.
Сможешь что-то, кроме void, вернуть?
Ну вот конвертер под каждый тип аргумента - это уже перебор. Скорее всего, этот код без задач.
а как ты предлагаешь строки из ввода конвертировать в нужные аргументы для функции? Тебе все равно придется это делать.
А, я вижу. Я просто смотрел на код из контекста прошлой задачи с мапом. У тебя тут целый скриптовый движок.
Ты сможешь переделать это всё под ту задачу? Просто хранить разные функции в мапе? То есть просто нужно, чтобы я по имени функции мог получить указатель на эту функцию или экземпляр function.
У меня разные типы хранятся. В варианте мапе - кроме полиморфизма и ручного реинтерпрет-кастинга мне ничего в голову не приходит.
Впрочем, это тоже задача без задач. Хз, как потом эти функции вызывать. Тоже придётся не одну сотню строк написать. Пока не завезут reflection, проще про это забыть.
Да я надумал просто сделать
unordered_map<string, function<A(B)> a
unordered_map<string, function<B(C)> b
и не возиться с этим
В c++17 variant завезли, можешь уже попробовать, в принципе. Только нужно будет задать типы используемых функций сначала.
Пока копался, нашёл doxywizard - божественная штука, через десятки опций конфига может сгенерировать HTML документацию с навигацией из любого набора файлов с даже не документированным кодом, в общем всё очень просто. Поддержка формата qthelp встроена в doxygen, осталось разобраться как в креатор её запихнуть.
Если не считать того, что ты пытаешься обойти одно из главных достоинств плюсов - очень интересно. Интересно, зачем это вообще может понадобиться.
>>960589
>Ну просто разные. Открываешь любой заголовочный файл и вырываешь оттуда любые функции.
Что ты собираешься делать с этими разными функциями? Если ты кастуешь их не в тот тип, который им принадлежит, ты получаешь UB. Тебе нужен UB?
Если ты хочешь сбацать скриптовый язык на плюсах, тебе нужно каждую функцию хранить вместе с описанием типа, иначе тыкву получишь.
>>960589
>Самое лучшее, что можно сделать без существенных усилий:
Это и есть существенные усилия. Ты нагромоздил гору темплейтов ради статической проверки существования конвертеров для всех fn::функций. Можно было бы сделать всё то же самое без темплейтов.
>Это и есть существенные усилия. Ты нагромоздил гору темплейтов ради статической проверки существования конвертеров для всех fn::функций. Можно было бы сделать всё то же самое без темплейтов.
Я не тот анон. В той ссылке что-то уровня map<string, function <void()> >, 10 строк кода.
>Что ты собираешься делать с этими разными функциями? Если ты кастуешь их не в тот тип, который им принадлежит, ты получаешь UB. Тебе нужен UB?
Ничего. Я пытался найти решение этой задачи для другого анона just for lulz. Но потом понял, что ничего не могу в итоге с этим мапом делать.
А я тот анон
>Если не считать того, что ты пытаешься обойти одно из главных достоинств плюсов - очень интересно. Интересно, зачем это вообще может понадобиться.
Как раз, я пользуюсь информациями о типах,
и красиво их конверчу. Практического смысла, кроме как "Смотрите как я могу", тут правда нет, но тем не менее, имхо, я сделал охуенно.
открыть ман и посмотреть, что последний аргумент является int'ом, а не указателем не позволяет религия?
Так в том то и дело, никаких указателей на int нет, мильен раз уже проверял
Ой, прошу прощения, поторопился с ответом, уже понял)
Хотя все равно не работает, теперь пишет наоборот invalid conversion from 'int' to 'int*'
ебанько ты, я умею читать, а ты похоже нет, убрал, ошибка была invalid conversation from 'int' to 'int'
А теперь ошибка invalid conversation from 'int' to 'int'
короче наоборот from 'int' to 'int*', я хз че в предыдущем комменте звездочки убрались
Возьми и проверь.
Вообще должно быть похуй через какой API ты дошёл до места, которое выбросило исключение.
forward declaration. И всегда стараться инклюдить хедеры своего проекта только в ccp файлах. Иногда может не помочь - тогда ты соснул и нужно что-то менять. Например если ты допустил такую вещь как:
class A {
B b
}:
class B {
A a;
}
А есть ли какие-нибудь ещё варианты помимо уродливого forward declaration? Может быть паттерны какие или ещё что? У меня почти то-же самое что ты привёл в примере, причём с подобным я сталкиваюсь уже не впервые... Что можно у меня поменять я не знаю т.к. я относительно недавно в программировании...
Enjoy пердольные кресты. По идее - если у тебя циклические зависимости - то ты что-то делаешь не так
Ну я пытаюсь разделить свою gui программу на классы, в главном классе что является главным окном я создаю экземпляры моих классов с другими окнами, которым через конструктор я передаю указатель на главное окно. По идее я могу не разделять программу на классы и всё делать в одном, но исходный код с несколькими тысячами строк кода как мне кажется будет не очень хорошей идеей. Может кто что подсказать по этому поводу?
гугли идиому pImpl
так перехвати
try {
// вот тут въебал код, который бросит хуй знает что надеюсь, это будет не указатель
} catch (...) { // вот это означает, что будет перехвачено ЛЮБОЕ исключение, не перехваченное ранее
aa_blya_pizdos_flag = true;
}
http://stackoverflow.com/questions/17016175/c-unordered-map-using-a-custom-class-type-as-the-key
Отличная либа для кроссплатформенной разработки.
ASIO - сеть, сокеты, вроде в файлы можно записывать.
filesystem - работа с путями
property_tree - парсинг XML, INI, JSON.
Хм, не один я костылю, значит, с хэшами.
Это копия, сохраненная 24 мая 2017 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.