Угу, ПМСМ, std::list из указателей на объекты столь-же "удобен" в использовании как и имеющаяся C-style реализация, а не-динамические объекты в нём держать - на копированиях разориться можно. Попробуйте свою реализацию ошаблонить, используя в качестве параметра тип хранимого объекта - разницы в производительности не будет, ну разве что программу кратно числу разных типов параметров шаблона раздует слегка. А позднее связывание на скорости скажется в худшую сторону.DX168B писал(а):Пробовал различные варианты. При большом количестве объектов жутко проседает FPS.
Вопросы по С/С++ (СИ)
- Сообщения: 353
- Зарегистрирован: Вс янв 19, 2014 22:41:55
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! 
- Реклама
Siarzhuk
Вот как раз ошаблонить этот класс я и собирался. А то, что его "раздует" на количество применяемых типов - так это некритично.
Правда, с шаблонами разбираться придется.
Вот как раз ошаблонить этот класс я и собирался. А то, что его "раздует" на количество применяемых типов - так это некритично.
Правда, с шаблонами разбираться придется.
I am DX168B and this is my favourite forum on internet!
- Сообщения: 353
- Зарегистрирован: Вс янв 19, 2014 22:41:55
Сделайте копию QLIST, работающую с одним из типов объектов, минимизируйте интерфейс либо поместив функции обработчики QLIST в отдельный модуль либо сделав их членами класса QLIST, а как всё соберётся и заработает - на основе этого модуля/класса сделайте шаблон и окончательно используйте его для других типов.DX168B писал(а):Правда, с шаблонами разбираться придется.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! 
Там всё просто.DX168B писал(а):Правда, с шаблонами разбираться придется.
Шаблон позволяет определять тип данных, используемых в объекте, во время объявления этого объекта.
Например:
Код: Выделить всё
struct Node{
...
...
type_data Data;
};
В таком случае, создаёте шаблон, типа :
Код: Выделить всё
template <typename type_data> struct Node{
...
...
type_data Data;
};
Например :
Код: Выделить всё
Node <int> node;
Шаблон огораживает создание вручную кучу одинаковых экземпляров с разными типами, создавая автоматически отдельный экземпляр со своим типом, при объявлении объекта.
Alex
ОК. Понял. Разберусь. Ошаблонивать придется и класс QLIST, чтобы выбросить из него void указатели. (некоторые методы имеют в принимаемых аргументах аналогичные указатели) Тогда я смогу смело
сносить привязанные данные в деструкторе класса QLIST, а за тем и сами ноды.
Более того, данные я смогу сносить прямо в деструкторе удаляемой ноды, таким макаром:
и оператор delete отработает нормально, так как тип определен шаблоном при инициализации.
То что надо. Спасибо за подсказки.
ОК. Понял. Разберусь. Ошаблонивать придется и класс QLIST, чтобы выбросить из него void указатели. (некоторые методы имеют в принимаемых аргументах аналогичные указатели) Тогда я смогу смело
сносить привязанные данные в деструкторе класса QLIST, а за тем и сами ноды.
Более того, данные я смогу сносить прямо в деструкторе удаляемой ноды, таким макаром:
Код: Выделить всё
~_tag_Node() { delete ptr; } То что надо. Спасибо за подсказки.
I am DX168B and this is my favourite forum on internet!
- Реклама
- Сообщения: 768
- Зарегистрирован: Вс янв 19, 2014 00:55:09
Здоровья всем! Вопрос по С.
Есть массив arr, забитый из ЕЕПРОМа и переменная tot.Эта переменная может иметь разные изменяемые значения от 2 до длины массива (16).
Подскажите, как более-менее равномерно распределить данные из этого массива, например в другой массив размером с tot? Понятно, когда 16 кратно значению tot. А в других случаях? И желательно по минимуму затрагивать arr[0].
Есть массив arr, забитый из ЕЕПРОМа и переменная tot.
Код: Выделить всё
uint_fast8_t arr[16]={0,45,8,120,18,24,32,64,90,126,147,168,200,255,33,56};
uint_fast8_t tot;Подскажите, как более-менее равномерно распределить данные из этого массива, например в другой массив размером с tot? Понятно, когда 16 кратно значению tot. А в других случаях? И желательно по минимуму затрагивать arr[0].
- Сообщения: 768
- Зарегистрирован: Вс янв 19, 2014 00:55:09
Аlex, прошу прощения.
К примеру, если tot==8, то из массива arr выбирается каждая вторая запись и копируется в другой массив, размерностью = 8 байт.
Если tot==4, то из массива arr выбирается каждая четвертая запись и копируется в другой массив, размерностью = 4 байт. Т.о. выборки из массива arr распределятся по всей его длине. И вопрос: как это дело(распределение выборок) поумнее схимичить, если tot получился, к примеру = 7 или там 11...?
К примеру, если tot==8, то из массива arr выбирается каждая вторая запись и копируется в другой массив, размерностью = 8 байт.
Если tot==4, то из массива arr выбирается каждая четвертая запись и копируется в другой массив, размерностью = 4 байт. Т.о. выборки из массива arr распределятся по всей его длине. И вопрос: как это дело(распределение выборок) поумнее схимичить, если tot получился, к примеру = 7 или там 11...?
Ну, в случае с 4 или 8, то тут понятно - делим просто на это число и всё.
А вот с "нестандартными" значениями - тут, как бы, и нам не понятно, что Вы хотите.
А вот с "нестандартными" значениями - тут, как бы, и нам не понятно, что Вы хотите.
- Сообщения: 768
- Зарегистрирован: Вс янв 19, 2014 00:55:09
Ну плин...
Аlex троллите что ли? Фуф. Попробую "на пальцах". Есть у Вас веревка/нитка... длиной = размерности(длине) массива arr. То бишь 16 условных метров. Нужно сложить ее в tot максимально одинаковых кусков. Значение tot может быть разным от 2 до 16. Так понятнее?
Вот как раскидать tot выборок по массиву, по возможности равномерно? С флоатом связываться не хочется, для 2 килобайт флеша это жирновато будет.
Не, не трлллю, честно 
Просто мне действительно не понятно, как выбирать значения, если, например, будет число 9.
Просто, для примера, назовите выборки для tot = 9.
Просто мне действительно не понятно, как выбирать значения, если, например, будет число 9.
Просто, для примера, назовите выборки для tot = 9.
- Сообщения: 768
- Зарегистрирован: Вс янв 19, 2014 00:55:09
Так и мне непонятно, оттого и спросил.))
Воот. Получается, в основном, выборка будет через одну ячейку массива(0,2,4...), а где-то указатель должен попасть и на следующую, за выбранной, ячейку. Что-то типа: 1,3,5,7,9,10,12,14,15. (Нулевую ячейку, по возможности, не трогать). Вот как схимичить эту автоматику?для примера, назовите выборки для tot = 9
ПрикольноMOHCTEP писал(а):Так и мне непонятно, оттого и спросил.))
Нельзя поделить 16-ти метровую верёвку на 9 одинаковых кусков, длиной, равной целому значению метров.
Ага, кажется я понял Вас.
Тут без флоата не обойтись. По крайней мере будет 2 переменные.
Одна будет равна размеру массива, делённому на tot.
Вторая - шаги. Обнуляем её и прибавляем к ней значение первой переменной tot раз. Целой частью от второй переменной при каждом шаге - будет индексом массива каждого шага.
ЗЫ. Ещё тут напрашивается алгоритм Брезенхема, но никак не могу сообразить, как его применить. Нужно думать...
Тут без флоата не обойтись. По крайней мере будет 2 переменные.
Одна будет равна размеру массива, делённому на tot.
Вторая - шаги. Обнуляем её и прибавляем к ней значение первой переменной tot раз. Целой частью от второй переменной при каждом шаге - будет индексом массива каждого шага.
ЗЫ. Ещё тут напрашивается алгоритм Брезенхема, но никак не могу сообразить, как его применить. Нужно думать...
- Сообщения: 768
- Зарегистрирован: Вс янв 19, 2014 00:55:09
Боюсь открывать "секрет", а то китайцы сопрут смеяться будете, а я, с горя, расфигачу макетку об пол и погибнет очередной "здравствуй мир" на светодиодах.
Вот и застрял на этой самой равномерности. На я.в.у. эта задачка решается в 5 секунд, через округление, скажем этакого "процентного" индекса.
ЗЫ. Увидел Ваш ответ, после отправки. Ну примерно так и делаю, только пытался обойтись целочисленной математикой. А она "забака такая" накапливает ошибку.
Все точно. Я ж и просил "по возможности равномерно". Т.е. пропуски могут немного и различаться. Важно распределиться по исходному массиву.Нельзя поделить 16-ти метровую верёвку на 9 одинаковых кусков, длиной, равной целому значению метров.
Вот и застрял на этой самой равномерности. На я.в.у. эта задачка решается в 5 секунд, через округление, скажем этакого "процентного" индекса.
ЗЫ. Увидел Ваш ответ, после отправки. Ну примерно так и делаю, только пытался обойтись целочисленной математикой. А она "забака такая" накапливает ошибку.
Только с целочисленной не обойтись, ибо нужно деление, т.к. известно только кол-во отрезков.
Можно сделать с фиксированной точкой, но тогда придётся делать бешеные умножения и деления на 10 в n-ной степени. Что тоже не айс.
И ещё. Какие вычисления (умножения, деления, ... ) допустимы в реализации ?
Можно сделать с фиксированной точкой, но тогда придётся делать бешеные умножения и деления на 10 в n-ной степени. Что тоже не айс.
А Вы на чём пишите ? Вроде вопрос задали в теме по СиНа я.в.у. эта задачка решается в 5 секунд
И ещё. Какие вычисления (умножения, деления, ... ) допустимы в реализации ?
- Сообщения: 768
- Зарегистрирован: Вс янв 19, 2014 00:55:09
На Си и пишу. Просто, после ООПешных, да скриптовых разгульных возможностей, здесь тяжеловато. Пытаю сейчас тиньку2313. Тут всего 2 к флеша и оперативы совсем ничего, так что с флоатом не разгуляться.
Хотел видео на ютуб закинуть, но 380 кило полчаса грузит, это - от души.
Так. А если умножать/делить на 2^n?придётся делать бешеные умножения и деления на 10 в n-ной степени.
Хотел видео на ютуб закинуть, но 380 кило полчаса грузит, это - от души.
Ну можно и на 2^n. Только нужно прикинуть минимальную точность для фиксированной точки.MOHCTEP писал(а):Так. А если умножать/делить на 2^n?
Можно взять 256, хорошо на него и делить и умножать.
- Сообщения: 768
- Зарегистрирован: Вс янв 19, 2014 00:55:09
Получится, куда оно денется.
16 (кол-во ячеек) умножаем на 256 (это запись 16-ти в старший байт и очистка младшего), получаем делимое. Далее делим его на tot, получаем шаг. Единственное громозкое вычисление.
Потом берём другую переменную, обнуляем её и с каждым шагом прибавляем результат деления на tot. Индексом в массиве будет - старший байт. Младший не трогаем, он будет некой дробной частью после точки.
Всё
16 (кол-во ячеек) умножаем на 256 (это запись 16-ти в старший байт и очистка младшего), получаем делимое. Далее делим его на tot, получаем шаг. Единственное громозкое вычисление.
Потом берём другую переменную, обнуляем её и с каждым шагом прибавляем результат деления на tot. Индексом в массиве будет - старший байт. Младший не трогаем, он будет некой дробной частью после точки.
Всё


