Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

DX168B писал(а):Пробовал различные варианты. При большом количестве объектов жутко проседает FPS.
Угу, ПМСМ, std::list из указателей на объекты столь-же "удобен" в использовании как и имеющаяся C-style реализация, а не-динамические объекты в нём держать - на копированиях разориться можно. Попробуйте свою реализацию ошаблонить, используя в качестве параметра тип хранимого объекта - разницы в производительности не будет, ну разве что программу кратно числу разных типов параметров шаблона раздует слегка. А позднее связывание на скорости скажется в худшую сторону.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение DX168B »

Siarzhuk
Вот как раз ошаблонить этот класс я и собирался. А то, что его "раздует" на количество применяемых типов - так это некритично.
Правда, с шаблонами разбираться придется.
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

DX168B писал(а):Правда, с шаблонами разбираться придется.
Сделайте копию QLIST, работающую с одним из типов объектов, минимизируйте интерфейс либо поместив функции обработчики QLIST в отдельный модуль либо сделав их членами класса QLIST, а как всё соберётся и заработает - на основе этого модуля/класса сделайте шаблон и окончательно используйте его для других типов. ;)
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

DX168B писал(а):Правда, с шаблонами разбираться придется.
Там всё просто.
Шаблон позволяет определять тип данных, используемых в объекте, во время объявления этого объекта.
Например:

Код: Выделить всё

struct Node{
   ...
   ...
   type_data   Data;
};
тип type_data изначально не определён, а будет известен только когда Вы будете использовать структуру.
В таком случае, создаёте шаблон, типа :

Код: Выделить всё

template <typename type_data> struct Node{
   ...
   ...
   type_data   Data;
};
а потом, когда объявляете структуру, используете любой свой тип.
Например :

Код: Выделить всё

Node <int> node;
Теперь у Вас есть структура типа Node с именем node и типом данных поля Data - int.

Шаблон огораживает создание вручную кучу одинаковых экземпляров с разными типами, создавая автоматически отдельный экземпляр со своим типом, при объявлении объекта.
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение DX168B »

Alex
ОК. Понял. Разберусь. Ошаблонивать придется и класс QLIST, чтобы выбросить из него void указатели. (некоторые методы имеют в принимаемых аргументах аналогичные указатели) Тогда я смогу смело
сносить привязанные данные в деструкторе класса QLIST, а за тем и сами ноды.
Более того, данные я смогу сносить прямо в деструкторе удаляемой ноды, таким макаром:

Код: Выделить всё

~_tag_Node() { delete ptr; } 
и оператор delete отработает нормально, так как тип определен шаблоном при инициализации.
То что надо. Спасибо за подсказки. :)
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Реклама
Опытный кот
Сообщения: 768
Зарегистрирован: Вс янв 19, 2014 00:55:09

Сообщение MOHCTEP »

Здоровья всем! Вопрос по С.
Есть массив 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;
Эта переменная может иметь разные изменяемые значения от 2 до длины массива (16).
Подскажите, как более-менее равномерно распределить данные из этого массива, например в другой массив размером с tot? Понятно, когда 16 кратно значению tot. А в других случаях? И желательно по минимуму затрагивать arr[0].
Реклама
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Какие то мысли вслух, а не вопрос. Ничего не понятно...
Опытный кот
Сообщения: 768
Зарегистрирован: Вс янв 19, 2014 00:55:09

Сообщение MOHCTEP »

Аlex, прошу прощения.
К примеру, если tot==8, то из массива arr выбирается каждая вторая запись и копируется в другой массив, размерностью = 8 байт.
Если tot==4, то из массива arr выбирается каждая четвертая запись и копируется в другой массив, размерностью = 4 байт. Т.о. выборки из массива arr распределятся по всей его длине. И вопрос: как это дело(распределение выборок) поумнее схимичить, если tot получился, к примеру = 7 или там 11...?
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Ну, в случае с 4 или 8, то тут понятно - делим просто на это число и всё.
А вот с "нестандартными" значениями - тут, как бы, и нам не понятно, что Вы хотите.
Опытный кот
Сообщения: 768
Зарегистрирован: Вс янв 19, 2014 00:55:09

Сообщение MOHCTEP »

Ну плин... :))) Аlex троллите что ли? Фуф. Попробую "на пальцах". Есть у Вас веревка/нитка... длиной = размерности(длине) массива arr. То бишь 16 условных метров. Нужно сложить ее в tot максимально одинаковых кусков. Значение tot может быть разным от 2 до 16. Так понятнее? :) Вот как раскидать tot выборок по массиву, по возможности равномерно? С флоатом связываться не хочется, для 2 килобайт флеша это жирновато будет.
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Не, не трлллю, честно :)
Просто мне действительно не понятно, как выбирать значения, если, например, будет число 9.
Просто, для примера, назовите выборки для tot = 9.
Опытный кот
Сообщения: 768
Зарегистрирован: Вс янв 19, 2014 00:55:09

Сообщение MOHCTEP »

Так и мне непонятно, оттого и спросил.))
для примера, назовите выборки для tot = 9
Воот. Получается, в основном, выборка будет через одну ячейку массива(0,2,4...), а где-то указатель должен попасть и на следующую, за выбранной, ячейку. Что-то типа: 1,3,5,7,9,10,12,14,15. (Нулевую ячейку, по возможности, не трогать). Вот как схимичить эту автоматику?
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

MOHCTEP писал(а):Так и мне непонятно, оттого и спросил.))
Прикольно :)) Т.е. Вы делаете что-то, что известно только Вам, а мы должны понять это :))

Нельзя поделить 16-ти метровую верёвку на 9 одинаковых кусков, длиной, равной целому значению метров.
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Ага, кажется я понял Вас.
Тут без флоата не обойтись. По крайней мере будет 2 переменные.
Одна будет равна размеру массива, делённому на tot.
Вторая - шаги. Обнуляем её и прибавляем к ней значение первой переменной tot раз. Целой частью от второй переменной при каждом шаге - будет индексом массива каждого шага.

ЗЫ. Ещё тут напрашивается алгоритм Брезенхема, но никак не могу сообразить, как его применить. Нужно думать...
Опытный кот
Сообщения: 768
Зарегистрирован: Вс янв 19, 2014 00:55:09

Сообщение MOHCTEP »

Боюсь открывать "секрет", а то китайцы сопрут смеяться будете, а я, с горя, расфигачу макетку об пол и погибнет очередной "здравствуй мир" на светодиодах. :))
Нельзя поделить 16-ти метровую верёвку на 9 одинаковых кусков, длиной, равной целому значению метров.
Все точно. Я ж и просил "по возможности равномерно". Т.е. пропуски могут немного и различаться. Важно распределиться по исходному массиву.
Вот и застрял на этой самой равномерности. На я.в.у. эта задачка решается в 5 секунд, через округление, скажем этакого "процентного" индекса.

ЗЫ. Увидел Ваш ответ, после отправки. Ну примерно так и делаю, только пытался обойтись целочисленной математикой. А она "забака такая" накапливает ошибку. :(
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Только с целочисленной не обойтись, ибо нужно деление, т.к. известно только кол-во отрезков.
Можно сделать с фиксированной точкой, но тогда придётся делать бешеные умножения и деления на 10 в n-ной степени. Что тоже не айс.
На я.в.у. эта задачка решается в 5 секунд
А Вы на чём пишите ? Вроде вопрос задали в теме по Си :dont_know:
И ещё. Какие вычисления (умножения, деления, ... ) допустимы в реализации ?
Опытный кот
Сообщения: 768
Зарегистрирован: Вс янв 19, 2014 00:55:09

Сообщение MOHCTEP »

На Си и пишу. Просто, после ООПешных, да скриптовых разгульных возможностей, здесь тяжеловато. Пытаю сейчас тиньку2313. Тут всего 2 к флеша и оперативы совсем ничего, так что с флоатом не разгуляться.
придётся делать бешеные умножения и деления на 10 в n-ной степени.
Так. А если умножать/делить на 2^n?

Хотел видео на ютуб закинуть, но 380 кило полчаса грузит, это - от души.
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

MOHCTEP писал(а):Так. А если умножать/делить на 2^n?
Ну можно и на 2^n. Только нужно прикинуть минимальную точность для фиксированной точки.
Можно взять 256, хорошо на него и делить и умножать.
Опытный кот
Сообщения: 768
Зарегистрирован: Вс янв 19, 2014 00:55:09

Сообщение MOHCTEP »

Спасибо! :beer: Попробую, авось что-то да получится. :)
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Получится, куда оно денется.
16 (кол-во ячеек) умножаем на 256 (это запись 16-ти в старший байт и очистка младшего), получаем делимое. Далее делим его на tot, получаем шаг. Единственное громозкое вычисление.
Потом берём другую переменную, обнуляем её и с каждым шагом прибавляем результат деления на tot. Индексом в массиве будет - старший байт. Младший не трогаем, он будет некой дробной частью после точки.
Всё :)
Ответить

Вернуться в «Разные вопросы по МК»