Russian Qt Forum
Апрель 20, 2024, 04:06 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 1 2 [3] 4 5 ... 761
31  Программирование / Общий / Re: Хранение selection : Январь 14, 2022, 16:11
в зависимости на внутреннюю реализацию QList.
спойлер - в qt6 все сломается
нужна стабильность - храните вектор юников
Хорошо, меняем QList<CInstance> на std::vector<CInstance *> или даже (извращенных) юников. Ну и какая разница? Индекс-то все равно не получить
32  Программирование / Общий / Re: Хранение selection : Январь 14, 2022, 15:59
это очень хреновый дизайн
В чем же его хреновость, "брат таланта" ?  Улыбающийся
33  Программирование / Общий / Re: Хранение selection : Январь 14, 2022, 12:18
В qt QList это вектор. Вставка в середину за O(n). В чём его преимущество?
https://doc.qt.io/qt-5/qlist.html
QList вектор для типов sizeof <= sizeof(void *), напр int, QString и др. Для остальных это аналог std::vector<T *>, т.е. хранится вектор указателей на неперемещаемые данные.

Ну вот, теплилась (слабая) надежда что-то услышать/почерпнуть, хоть какие-то "идеи", а все сразу сваливается в жевание (замшелой) матчасти Плачущий
34  Программирование / Общий / Хранение selection : Январь 14, 2022, 11:41
Добрый день

Класс имеет контейнер, размер может быть значителен. напр 100K. Эл-ты контейнера могут быть selected и подсвечиваться в UI. Недолго думая я сделал так
Код
C++ (Qt)
class MyClass {
...
 QList<CInstance> mInstances;
 QSet<CInstance *> mSelectedInst;
...
};
 
Правда сам CInstance не может сказать он selected или нет, нужен MyClass. Ну и ладно, зато операции с selection вполне удобны.

Но через какое-то время нарисовалась проблемка - ряд операций (напр запись undo) требует индексы selection. Заменить QList на вектор не могу, CInstance должен быть неперемещаемым. Приходится искать индексы перебором, что конечно "не украшает" на 100K и более.

Есть мысли как лучше организовать selection ?

Спасибо
35  Программирование / Общий / Re: Оптимизация работы с памятью : Январь 13, 2022, 15:03
Современная методология программирования использует концепцию бесконечной памяти. Когда надо выделяем память и забываем про неё. Размен времени на память везде где только можно. Везде кроме непрерывно вертящихся программ это лучший метод.
Пример
Код:
void DoSomething( ... )
{
  std::vector<double> dst;
  ...
  dst.push_back(value);
  ..
}
Ужасный код  Улыбающийся (по крайней мере с точки зрения рекомендации выше). Ведь push_back выделяет память, пусть не каждый раз, но многократно. И по завершении ф-ции вызывается деструктор вектора, а значит безумно медленное delete !

Тем не менее никто не стал бы тут чего-то "оптимизировать", такая мысль даже не зародилась бы. Просто потому что кроме "расходов памяти" и "скорости" есть еще мощнейший аргумент - расходы на написание кода. Даже предвычислить размер вектора часто непросто, это еще "проход". А как-то кешировать вектор такого же размера чтобы вообще избежать (пере)распределений - возможно, но скорее всего выльется не в один десяток строк. И код оптимизации станет источником новых ошибок. Да, исключения есть, но они лишь "подтверждают правило"

Зачем же давать рекомендации которым сами не следуем?  Улыбающийся
36  Программирование / Общий / Re: Оптимизация работы с памятью : Январь 13, 2022, 12:24
Есть у нас один человек на работе, которы любит все эти массивы завести в глобальной области, причем как статические заполненные данными так и массивы с результатами расчетов.
Эта "детская болезнь" обычно проходит, человек начинает понимать что глобальные массивы не имеют никакой гибкости. Невозможно изменить их размер или избавиться от уже ненужных

Но при выделении памяти внутри функции например используется ресурс на само выделение и удаление при выходе из функции и так каждые 500мс.
Никто не заставляет все время выделять, можно  это сделать один раз. Да и выделять не смертельно (тыкающий знаток выше злорадно шутит), эти затраты намного меньше 1 мс

Вопрос в том, что целесообразнее жертвовать памятью занятой все время работы программы или производительностью.
Здесь этой проблемы нет
37  Программирование / С/C++ / Re: Вложенные циклы : Январь 13, 2022, 12:05
Если у нас есть многомерный массив, скажем int a[5][3][4]
...
не знаю, как быть с итераторами, особенно, если они разной природы...
C массивом легко оформить ф-цией/методом, но это случай редкий, обычно перебираемые контейнеры самые разные.
38  Программирование / Общий / Re: Взаимодействие классов линейки времени : Декабрь 11, 2021, 13:45
KeyFrame знает своего соседа
А так и есть  Улыбающийся (оставлено для совместимости со старым кодом). Только что толку от знания соседей - они такие же KeyFrame(s). Менять надо данные (KeyFrame) принадлежащие др KeyList которым владеет др KeyChannel

Видимо очередной пост "для оживления форума"  Улыбающийся
39  Программирование / Общий / Re: Взаимодействие классов линейки времени : Декабрь 10, 2021, 09:09
Я вот не уверен, что из объяснений я правильно понял задачу.
Ну позиция "непонимающего" довольно удобна  Улыбающийся

Но если вкратце - я бы прикрутил ко всему этому сбоку некий ChannelsAndFramesManager, который и следит за целостностью всего описанного выше безобразия. И все запросы на изменения - строго через него.
Пример
Код
C++ (Qt)
void KeyList::CalcVelocity( ...)
{
 ..
 SetKeyTime(keyIndex, time);
 ...
}
Какие претензии к KeyList ? Он владеет всеми ключами (KeyFrames), знает что делать (CalcVelocity) - ну он время ключей считает и ставит, не вижу тут никакой  (архитектурной) ошибки. Проблема в том что KeyList никак не может связаться с др KeyList'ами что принадлежат др KeyChannel'ам.

ChannelsAndFramesManager - ну класс сбоку (припеку) никогда не выглядит хорошо  Улыбающийся Он ничем не владеет, ничего не имеет - как он может что-то решать? Ну допустим заменим SetKeyTime на ChannelsAndFramesManager::SetTime, що це дало? Связки как не было так и нет
40  Программирование / Общий / Re: Взаимодействие классов линейки времени : Декабрь 06, 2021, 08:24
Не вижу энтузиазма Улыбающийся Оно и понятно, вот "почитать", а еще лучше "собирать" - то да, а тут такая бяка... Ну ладно, покатаем очевидное

Вот класс самого верхнего уровня KeyChannel. Для него послать сигнал - без проблем, т.к. он имеет уникальный id, его видят в UI и.т.п. Попробуем так
Код
C++ (Qt)
void KeyChannel::SetNthKeyTime( int keyIndex, double time );
Но менять KeyFrame::m_time только так я не могу - есть еще KeyList что меняет m_time когда захочет. А нужен ли KeyList? Да, KeyChannel может иметь нулевой KeyList (типа нод дерева, контейнер др KeyChannel(s)). KeyList может свапаться и существовать сам по себе. Да и вообще, пусть KeyList занимается KeyFrame(s) - эл-тами своего контейнера, а всякие там m_name, m_id - это уже др уровень. (мухи отдельно и все такое)

Ладно, еще вариант
Код
C++ (Qt)
struct KeyFrame {
..
 double m_time;
 double m_value;
 KeyList * m_owner;
..
};
И аналогично для KeyList. Так получаю массу забот напр на операциях copy/paste - все время надо присматривать за m_owner что может оказаться хлопотно и ненадежно.

Что интересно - возникшая задача (реагировать на изменения времени ключа) - довольно скромная фича, неужели для нее надо менять так принципиально?
Цитировать
Это потому что корявая архитектура! Вот если бы изначально все было продумано.. и.т.п.
Ну так хорошо, предлагаем "некорявую". И тут ответ(отмазка) известен
Цитировать
Ну так надо же знать задааачу..
Что на деле означает "будет жрать std и ни хрена не делать"  Плачущий
41  Программирование / Алгоритмы / Re: Дополнить/обрезать контейнер "по образцу" : Декабрь 02, 2021, 10:07
наверное сумма квадратов разниц?
Не знаю, может квадраты будут лучше, может нет. Во всяком случае квадраты (дисперсия) устроит. Да, тогда напрашивается МНК, но как его зарядить - не знаю. Вообще "строго оптимального" решения не требуется, достаточно "разумного"
42  Программирование / Алгоритмы / Дополнить/обрезать контейнер "по образцу" : Декабрь 01, 2021, 11:20
Добрый день

Есть 2 контейнера сортированных int'ов, нужно добавить или удалить эл-ты второго так чтобы их число стало равно первому, и сумма разниц между эл-тами первого и второго контейнеров была минимальной. Значения одного контейнера не могут повторяться

Спасибо
43  Программирование / Общий / Взаимодействие классов линейки времени : Декабрь 01, 2021, 10:24
Добрый день

Предельно упрощенно - классы "линейки времени"

Само/собсно время + значение
Код
C++ (Qt)
struct KeyFrame {
..
 double m_time;
 double m_value;
..
};

KeyFrames хранятся в контейнере
Код
C++ (Qt)
struct KeyList {
..
Container<KeyFrame> m_keys;
..
};

И предъявляются в UI в виде "анимационного канала"
Код
C++ (Qt)
struct KeyChannel {
QString m_name;
int m_uniqueID;
..
QScopedPointer<KeyList> m_list;
..
};

И вот возникает задачка - когда юзер меняет время m_time одного (или нескольких) KeyFrame(s) (для заданного/специфичного канала)- нужно автоматычно пересчитать значение(я) в др канале. Варианты:

1) "Полный ручняк" - найти все места где меняется m_time и присобачить к ним if'ы. Однако мест таких ожидается по меньшей мере десятки. Да и латки if'ами не выглядят хорошо

2) "Полный автомат" - делать изменения в сеттере KeyFrame::SetTime. Но KeyFrame не знает кому он принадлежит, впрочем  KeyList тоже. Также "target" (кого надо менять) может отсутствовать (напр на загрузке)

3) "Месяги/Сигналы" - то же что в "2". Послать.. а кому? И что?

Что посоветуете?

Спасибо
44  Qt / Общие вопросы / Re: Опредение того, является ли каталог подкаталогом другого : Ноябрь 18, 2021, 06:03
Да, при условии что оба каталога существуют. Только использовать canonicalPath(), т.к. она резолвит симлинки.
У меня так не вышло (OSX), ни canonicalPath ни absolutePath "полного имени" не дают (или не гарантируют). Напр

/Volumes/Macintosh HD/...
/Users/igor/...

Для того же файла. Помогло QStorageInfo::displayName
45  Программирование / Алгоритмы / Re: Адаптивный Монте-Карло для размерности D > 1 : Ноябрь 06, 2021, 08:22
Опускаю часть ответов чтобы не "растекаться"
Какие то сложные конструкции и термины пошли.. Ну такая стратегия подразумевает запоминания о предыдущих точках? Или заранее определённой сетке? Дело в том, что когда я генерю случайные точки, понятие сетки (grid) теряет смысл..  
Если Вы хотите "адаптивно", то хранить просчитанные точки - обязон. Стандартная техника octree (вариант multi). Оно также позволяет находить ближайших, но с учетом их радиусов, это мощнее чем kd-tree, хотя и ресурсов тратится намного больше. Регулярная сетка плоха своей "корреляцией", грубо говоря кто-то может вклиниться между рядами/столбцами. Да и "сгущать" ее довольно геморно. Другая крайность - чистый рандом, дескать
Цитировать
Монте-Карло - ну просто пуляем случайные точки
Это совсем не так, просто случайными ничего не добиться. Да, случайную не обманешь как регулярную, но она очень слаба "на восстановление", заполнить "пустоты" не удается даже при громадном числе точек. Octree предоставляет удобное решение/баланс. Даже если перебирать исходные точки с постоянным шагом и радиусом - все равно получится достаточно "живописная" картина отобранных (для расчета) точек. Вот правда "разпоточивание" этого шага нетривиально.

Хотя у нас...
Будьте добры, удалите ту хрень что Вы дальше написали. Не лезьте в говно что называется политикой. Этот форум (слава богу) для этого не предназначен
Страниц: 1 2 [3] 4 5 ... 761

Страница сгенерирована за 0.181 секунд. Запросов: 23.