Просмотр сообщений
|
Страниц: [1] 2 3 ... 7
|
1
|
Qt / Qt-инструментарий / Qt creator и вертикальный монитор
|
: Сентябрь 28, 2021, 14:32
|
У кого есть опыт использования Qt creator с вертикальным монитором. Окна не плавают, могу только сделать копию окна с кодом. Прилипить к нему другие окна не получается (например сверху Projects) или ошибки компиляции.
Конфигурация двухмониторная - вертикальная и горизонтальная
|
|
|
2
|
Программирование / С/C++ / Re: Когда искусственный интеллект научится исправлять ошибки компиляции
|
: Август 19, 2021, 16:12
|
Компиль умеет находить место где забыта скобка. Пусть сам ее и поставит.
С первой ошибкой чуть-чуть сложнее. Все равно число ситуаций где это вылезает ограничено и ошибка исправляется механически. Можно без какого-то крутого ИИ решить.
Неужели Вы думаете, что никто об этом не задумывался? Неужели вы думаете, что не предпринимались попытки такое сделать? Возьмите Open Source проекты, их огромное количество. А тут - никто не хочет этим заниматся. Лентяи! Это вы ещё шаблоны на C++ не писали, привет 80 по IDE. И пишут, без всякого ИИ. Это невозможно, не потому что я так решил, а потому что это ни у кого не получилось. Я помню 2000-е, прогнозирование заката программированния в будущем. Ничего не изменилось, те же тезисы. Я к чему - если уж вам компилятор сказал, что скобочка не там, то поверьте, он не хочет скобочку за Вас ставить, потому как не знает где. А если вы ему доверите, то жопа ещё
|
|
|
3
|
Программирование / С/C++ / constexpr
|
: Август 19, 2021, 15:53
|
class Example { public: static const constexpr auto BASE_DATA_DIR = "../data/"; static const constexpr auto ORIG_DATA_DIR = BASE_DATA_DIR + "images"; }
Вопрос, как сложить две строки во время компиляции. invalid operands of types 'const char* const' and 'const char [7]' to binary 'operator+'
|
|
|
4
|
Программирование / С/C++ / Re: c++ using
|
: Июнь 23, 2021, 16:07
|
https://ideone.com/sBRvjxC++ (Qt) class A { public: A(int) {} A& operator=(int){return *this;} }; class B: public A { using A::A; using A::operator=; }; int main() { B a(1), b(1); a = b; return 0; }
Та не работает. Возможно из-за Templates. Спасибо за ответ конечно, я промоделирую вашу ситуацию для шаблонов...... (просто ; пропустил, в оригинале она есть). Давайте попробую в своих шаблонах по нарастающей, и отвечу.....
|
|
|
5
|
Программирование / С/C++ / c++ using
|
: Июнь 21, 2021, 16:01
|
class BaseClass { public: Конструкторы, Консрукторы ......... operator() = operator() = };
class DeriveClass { public: using BaseClass::BaseClass; //здесь мы заюзали все конструкторы из базового класса без переопределния их ручками.
using BaseClass::operator=; //КАК? }
Вопрос собственно - как "унаследовать" с помощью using оператор копирования. Раз уж конструктор копирования можно так использовать, то как оператор присваивания?
|
|
|
6
|
Программирование / С/C++ / Re: Default constructor
|
: Июль 06, 2020, 12:44
|
Добрый день Справочник открывал, но на сей раз там так много и мутно... лучше спрошу у знающих людей Есть масса простых структур, напр C++ (Qt) struct CDrawInst { // data CMaterial * m_material; int m_count; ... };
Единственное что мне нужно в конструкторе - прописать все такие POD члены нулями, и все. CDrawInst() = default это делает? Или это уже и так делается с новыми стандартами? Или по старинке расписывать? Это конечно нетрудно, но надо же как-то у культуре приобщаться Спасибо Могу ещё посоветовать обнулить в конструкторе в стиле С: memset. В большинстве случаев оно того не стОит, но это же работа с графикой, а мемсет очень хорошо оптимизирован под SSE.
|
|
|
7
|
Программирование / С/C++ / Re: Template class name
|
: Февраль 06, 2020, 22:28
|
int использован для примера как самый короткий тип. И, конечно же, это фрагмент дерева. Просто возникало чувство неловкости при написании. class DevItem : public Item<int, DevItem > {...}; Какое-то масло маслянное. Уже ушло. Спасибо за ответ. P.S. Уважамс! Хватает же терпения на осмысленные название комитов.
|
|
|
8
|
Программирование / С/C++ / Template class name
|
: Февраль 06, 2020, 19:57
|
Есть ли шаблонные решения?. template <class T> class Item { public: Item<T> parent() { return mParent;} private: Item<T> mParent; }
Item<int> t1; Item<int> parent = t1.parent; //OK
Ну тут все понятно, пока мы не сделаем наследование. class DevItem : public Item<int> { ....... }
DevItem t1; DevItem parent = t1.parent() //error - несовместимые типы Item<int> и DevItem
И как?
|
|
|
9
|
Qt / Общие вопросы / Re: Сохранить "диффы"
|
: Январь 28, 2020, 21:17
|
Вы наверное прикалуетесь. Или Вам общения не хватает. Мыслей у меня умней нет. Возможно, Вы хотите просто поговорить. Или постебаться. Вот тебе швейная машинка - почини и строчи сколько хочешь. "DO SAVE" (что Вы видимо оставили мне для самостоятельной работы) - не простая формальность. Пример
Ай. Извиняюсь. Зарылся и пошел писать и тестировать код. Через месяц встретимся. Всё для Вас. Особенно порадовало самостаятельная работа в одну строку. qDebug() << diff.startPos << diff.QByteArray(diff.data,diff.size); Где qDebug заменяется на поток записи в файл. Зачем хранить data если известно смещение в оригинале?
Зачем здесь экономить биты снижая скорость (пусть немного)? Простецкий vector<char> лучше
Батенька, ну это же "lapsus manus" (как говорили древние). Правда такой код потом ускорять хорошо, счет пойдет не на % а на разы. Наверно в этом была идея.
Вы понимаете о чём Вы говорите? Ваша задача оптимизировать объем записи. Зачем вообще думать о производительности? Какая разница char* или bit. Вы я так понял человек процесса, а не результата. Зачем отвлекаться на незначимые вещи, которые не имеют никакого значения? Ну сделайте чтобы оно хоть как-то работало медленно, а вопрос производительсти решается на ура потом. Главное восприятие и понятность. Но нет, оно не работает нифига, зато нужно рассуждать о задаче, которая разбита на этапы (чтобы лучше воспринималась) и рассуждать о производительности. Делаем машину. Она не едет, зато рассуждения об оббивке сидений. Кстати, что за фамильярность, Батенька? Вы же у нас тут "Облико морале". О чем мы с Вами можем разговаривать, когда мы друг друга не слышим. Я хотя бы пытаюсь. Это разговор двух идиотов. Не хочу больше рассуждать об этом. Закончу, что я имел в виду, а Вы не поняли: универсальный метод типа RLE вам не грозит в связи с малым объемом данных. Хотите пробовать - протестируте, ок если я ошибаюсь. Значит нужно искать свой гребаный путь для своих данных - находить пакеты отностительно похожих данных с одинаковой границей. Люди на таких задачах только на тестовых данных недели тратят. НЕ! Швейную машинку ему дали не ту. Недели и месяцы, чтобы просто проаналзировать, что происходит и только потом голову чухают, а как же его сделать? "Боюсь за границы 4Gb вылезти при использовании int". Прикольный save на 4 Гб. Если вы её эффективно решите, можете забить на свою программу, вы уже миллионэр. Не отвечайте на данный пост. P.S. Не удержался. Хотите алгоритм - вот вам. 1. Сохраняете свои блоки, при разных условия, мышкой водите там или чего. Короче для разных процессов. 2. Пишите тулузу, которая читает эти данные и визуализиует для Вас. Аля дефрагментор как раньше показывал. Синенькие совпадаю, красненькие жопас. 3. Думаете. 4. Находите почему так и что-то общее. 5. Прозреваете либо забиваете. 6. Задумываетесь. P.S.S. Не отвечайте.
|
|
|
10
|
Qt / Общие вопросы / Re: Сохранить "диффы"
|
: Январь 27, 2020, 17:39
|
Имеет, и с этой (вроде мелкой - но гнусной) проблемкой я сталкиваюсь уже не раз. Делать "по честному" (все 64) хорошо пока это ничего не стоит. А вот здесь уже стоит, и что делать - хз. Как минимум нужны комменты что работает до 4Gb, может лучше assert.
Та делаете везде 64. А при записи обрезайте до 32-х. Исправить потом запись в одном месте, если превысит (а оно не привысит) ничего не будет стоить. Таких советов может дать массу каждый. Но Вы сами бы последовали хотя бы одному из них? Думаю что нет. Писать код не хотите, уже поняли что там работа кропотливая. Ладно, давайте по-другому Каких советов. Да держите. Тестируйте сами и в std сами переводите. #include <QCoreApplication>
#include <QCoreApplication>
#include <QBitArray> #include <QDebug>
int main(int argc, char *argv[]) { QCoreApplication a(argc, argv);
QByteArray s1("Tksteeeeeeeeeeeeeeeeeeeeeeeeeeeeehhhhhhhhhhhhhhhhhhhhhhsdfsdfffffffffffffffffffffffff"); QByteArray s2("Testeeeeeeeeeeeeeeeeeeefeeeeeeeeehhhhhhhhhhhhhhhhhhhhhhsdfsdfffffffffffffffffffffffff");
struct diff { int startPos; int size; char *data; };
QVector <diff> diffs;
constexpr int BLOCK_SIZE = 8; //nice to store in degree 2 const int dataSize = s1.size();
//count of blocks int blockCount = (dataSize % BLOCK_SIZE == 0) ? dataSize / BLOCK_SIZE : dataSize / BLOCK_SIZE + 1; QBitArray diffVector(blockCount); //std::bitset //fill vector for (int i = 0; i < blockCount; ++i) { int dataPos = i * blockCount; //in real word for perfomance need comapre in registers //for instance //warning - need unbounding check! //if (((__int64)s1[dataPos] != (__int64)s2[dataPos])) //or memcmp if (s1.mid(dataPos,BLOCK_SIZE) != s2.mid(dataPos,BLOCK_SIZE)) diffVector.setBit(i); }
//optimize result vector - in this case union through the one block //does not matter if block size equal metadata size //bad idea if block size is more than metadata size //good idea if block size is less than metadata size for (int i = 2; i < diffVector.size();++i) { if (diffVector[i] && diffVector[i] == diffVector[i - 2]) diffVector.setBit(i - 1); }
int diffPos = -1; //calc diffs for (int i = 0; i < diffVector.size(); ++i) { if (diffVector[i]) { if (diffPos == -1) diffPos = i * BLOCK_SIZE; } else { if (diffPos != -1) { int size = i * BLOCK_SIZE - diffPos; diffs.append({diffPos,size,s2.data() + diffPos}); diffPos = -1; } } }
//diff in last element(s) if (diffPos != -1) { int size = dataSize - diffPos; diffs.append({diffPos,size,s2.data() + diffPos}); }
//calc diff size int diffSize = 0; for (int i = 0; i < diffs.size(); ++i) { diffSize += diffs[i].size + 8; }
//nothing to do - diff more that 70% of the source size double fillPercent = diffSize / (double)dataSize; if (fillPercent > 0.7) { return 0; }
//DO SAVE
return a.exec(); }
Создайте тесты и на своих рабочих данных гоняйте их, изменяя например размер блока и данные, чтобы оценить эффективность. Никто в этом мире на ваших данных не подскажет вам параметры. Это как размер кластера на винчестере. Рекомендации то у всех есть, а определять самому надо. Да и вообще подходов может быть много. Вы же можете хранить данные в памяти с идентификацией объекта. А объект сам знает, чем он отличается от другого объекта. Можно цепочку создавать. Я так понимаю, данные кусками идут повторяющиеся. Ну, можно сравнить с видео - предыдущий кадр практически совпадает с текущим. Пока не появится новая сцена, тогда нужно новую цепочку строить. Это мои предположения, т.к. мы не знаем ваши условия. P.S. Подправил исходники, неверно размер вычислялся
|
|
|
11
|
Qt / Общие вопросы / Re: Сохранить "диффы"
|
: Январь 27, 2020, 13:24
|
1) Наверное startPos все-таки unsigned int. Академически даже size_t но на это наверно лучше забить, считаем блоков > 4Gb нет.
Демагогия началась. Qt - int, std - size_t. Но это вообще не имеет никакого отношение к решению данной проблемы. 3) Пусть пакуются данные байты которых совпадают "через один", напр строки abcdefgh aacceegg При этом упакованный размер намного превысит изначальный Раздражает, да? Меня тоже Какая-то совершенно глупая задачка (явно не стоит выеденного яйца), а из нее все лезут и лезут проблемы, та шо такое Ну так у вас 64 разрядная вроде система? Тогда сделайте проверку сразу на блок символов по 8 байт. В вашем случае достаточно взять блок по 2 байта, чтобы уйти от этой проблемы. Но я думаю вы надумали её. В ваших блоках хранятся совершенно конкретные данные, конкретных типов, и думаю, они все выравнены по 64 (32) бита, так что сравнение побайтово имеет, гм, чисто академический интерес Но даже если отбросить эти теоретические выкладки, для хранения изменений вам нужно минимум 2 int - итого 64 бита. Глупо записывать 1 байт данных на 8 байт метаданных, так что 64 таки блок делать. Или запихнуть метаданные в 1 int, тогда 32 байта блок. Или решайте совсем универсально. Определите эффективный размер блока. Создайте матрицу, которая содержит изменения блоков (да, нет) Объедините блоки, которые рядом (опционально, зависит от размера блока) Посчитайте размер с метаданными всего диффа. Если не устраивает (например 70% от общего), записывайте оригинал.
|
|
|
12
|
Qt / Общие вопросы / Re: Сохранить "диффы"
|
: Январь 27, 2020, 11:58
|
Так Вы храните указатель на данные s2, а на восстановлении s2 отсутствует, его и надо получить.
Так измените структуру на: struct diff { int startPos; QByteArray data; };
Этож всего лишь пример. Тем более если Вы сохраняете, предыдущие данные присутствует, поэтому будет лишнее копирование.
|
|
|
13
|
Qt / Общие вопросы / Re: Сохранить "диффы"
|
: Январь 26, 2020, 13:44
|
Есть 2 блока памяти одинакового размера, предполагается что многие байты совпадают. Нужно сохранить "только изменения" так чтобы имея первый блок + изменения получить второй.
Не то чтобы я не могу написать (и хочу чтобы кто-то сделал за меня), но как-то у меня получается безумно длинно и сложно, может чего-то не вижу?
Спасибо
Да, бывает. Как зависнишь иногда над чем то. #include <QCoreApplication>
#include <QLatin1String> #include <QDebug>
int main(int argc, char *argv[]) { QCoreApplication a(argc, argv);
QByteArray s1("Test"); QByteArray s2("Lkst");
struct diff { int startPos; int size; char *data; };
QVector <diff> diffs;
int diffPos = -1; for (int i = 0; i < s1.size(); ++i) { if (s1[i] != s2[i]) { if (diffPos == -1) diffPos = i; } else { if (diffPos != -1 ) { int size = i - diffPos; diffs.append({diffPos,size,s2.data() + diffPos}); diffPos = -1; } } }
//diff in last element(s) if (diffPos != -1) { int size = s1.size() - diffPos; diffs.append({diffPos,size,s2.data() + diffPos}); }
//output diffs for (auto &i: diffs) { qDebug() << QByteArray(i.data,i.size); }
QByteArray restored(s1); //restore for (auto &i: diffs) { restored.replace(i.startPos,i.size,i.data,i.size); }
//output restore mem block from the source by diffs qDebug() << restored;
return a.exec(); }
На полноту тестирования не претендую, думаю смысл упаковки понятен - сохраняем позицию, размер и указатель на начало данных. Учитывая, что работа с памятью и вам нужно это быстро делать - _mm_loadu_si128, _mm_cmpeq_epi8 Либо в исходники QByteArray (или интет), либо использовать QByteArray как источник данных (QByteArray::compare - там тоже на sse, правда только для поиска вхождения возможно использовать). На самом деле в плане оптимизации производительности задача не такая уж тривиальная, как кажется. На SSE, даже если будет больше кода, выигрышь в производительности будет ощутим (два порядка - т.е. в 4 раза запросто в человеской десятичной системе) - обработка пачками, что уменьшит количество итераций цикла for (предсказание ветвлений) и много других плюшек. Если же задача оптимизации объема занимаемой памяти (например для серилизации памяти на диск), выигрышь будет ощутим даже на чистом с++ (что выше). Опять же, каков процент изменений, дифы в цепочках будут? Вопросов много. Это я так. Вы уж их сами себе позадавайте.
|
|
|
14
|
Qt / Qt-инструментарий / Re: Настроить предупржедения анализатора
|
: Декабрь 28, 2019, 20:51
|
Теперь да, есть два похожих места - этотнастройки одели кода (там теперь два пункта в комбобоксе) и настройки анализатора (там все по-старому). Вам первый нужен
Абсолютно точно! Спасибо за наводку. Нужна была именно модель кода. Я же упорно ковырял настройки анализатора. Вот как переклинуло меня, на это с 98, "два дня потратил" из принципа......, так и не нашел в инете. Просто на всплывающей подсказке (по warningу) нажмите х, Qt Creator автоматом добавит это в Code Model
|
|
|
15
|
Разное / Говорилка / Re: Абстрактное мЫшление
|
: Декабрь 19, 2019, 14:50
|
Поэтому всегда существуют "посредники", которые из бухгалтерских терминов переведут в абстрактные. Популярная точка зрения, мол, кто-то должен "давать формулы", а дело программиста - только их реализовать. Даже в лучшем случае это ставит его в положение "умненького мальчика" которым, разумеется, надо рулить. И которого не так уж сложно заменить. Не пиздит
Если у меня потребность так выразиться, то я пойду в румочную (их много открылось в нашей республике). Там гораздо более богатые возможности для самовыражения, можно дать в рыло (или получить). А на public форуме это совершенно ни к чему и капитально отбивает охоту с Вами общаться. Я опять же повторюсь - вы постоянно входите в конфликт с самим собой. Вам бы пункт 2 переместить на первое место, а первый убрать. "Хех, я с вами не разговариваю, но скажу!"
|
|
|
|
|