Структура с изменяющимся размером массивов.
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.84] |
|
|
Структура с изменяющимся размером массивов.
|
Сообщ.
#1
,
|
|
|
|
Имеется структура с массивами, скажем, такая:
![]() ![]() struct Ris_No_podlogka { uint16_t info[][]; uint16_t Color_Nabor[]; uint8_t N_Pix_N_Color[]; }; Размерность массивов намеренно не определил, поскольку она может быть разная. Планирую иметь несколько файлов *.h, в которых будут находится конкретные данные в соответствии этой структурой, но разные по размерности. Эти данные нигде не подвергаются изменениям, просто используются. Далее в main.c будет находиться функция, работающая с этими данными. Если бы данные были одинакового размера, то и этой бы темы не было, а иначе мне не понятно как организовать такую работу, в основном это касается упомянутой функции, имеется ввиду передача в неё данных конкретной структуры. |
|
Сообщ.
#2
,
|
|
|
|
Невозможно иметь структуру неопределённого размера. Как и у любого типа данных, sizeof() структуры должен быть чётко определён. Если нужны разные структуры, это должны быть и разные типы данных. Иначе... внимание, вопрос: попробуй создать экземпляр своей структуры. Два раза, с разными размерами.
На Cях, это может быть достигнуто динамическими массивами: ![]() ![]() struct Ris_No_podlogka { uint16_t **info; size_t sz1info; size_t sz2info; uint16_t *Color_Nabor; size_t szColor_Nabor; uint8_t *N_Pix_N_Color; size_t szN_Pix_N_Color; }; |
|
Сообщ.
#3
,
|
|
|
|
Спасибо за ответ. Главное, что узнал что "Невозможно иметь структуру неопределённого размера." Остальное, что Вами изложено, с моим уровнем знания СИ, в меня не вмещается. Пока выход вижу один. В функции кейсами выбирать нужную структуру.
|
|
Сообщ.
#4
,
|
|
|
|
Цитата Yuriy48 @ Пока выход вижу один. В функции кейсами выбирать нужную структуру. Возможны варианты. Напрмер, используем один тип и размер структуры. Для этого для всех массивов назначаем максимально возможный размер. В структуру добавляем параметры, указывающие размеры используемой части массивов. При таком алгоритме работы можно будет легко менять размеры в пределах допустимого. |
|
Сообщ.
#5
,
|
|
|
|
Цитата Yuriy48 @ а иначе мне не понятно как организовать такую работу Массивы в указатели и динамическое выделение с записью размера выделенной памяти в поле структуры. |
|
Сообщ.
#6
,
|
|
|
|
Цитата Qraizer @ Невозможно иметь структуру неопределённого размера. Если речь про Си, то условно можно. По крайней мере с C99 (да и до того делали, но чуть иначе). Это называется flexible array member ![]() ![]() struct A { size_t len; int data[]; }; Ну и дальше malloc'ом или аналогом выделяем нужную память под объект такой структуры и элементы массива Добавлено Цитата Yuriy48 @ Пока выход вижу один. В функции кейсами выбирать нужную структуру. Я думаю, что это будет неудачный дизайн. Лучше использовать динамическое выделение памяти для массивов и хранить отдельно размер. Это если Си. Если плюсы, то std::vector или другой подходящий контейнер |
|
Сообщ.
#7
,
|
|
|
|
В любом случае все сводится к хранению указателей или ссылок на другие структуры. Будь то void** или std::vector<std::variant>
Думаю надо сначала определиться с теми данными которые предстоит хранить. А уж потом думать КАК их хранить. |
|
Сообщ.
#8
,
|
|
|
|
Цитата D_KEY @ Если речь про Си, то условно можно. По крайней мере с C99 (да и до того делали, но чуть иначе). Это называется flexible array member Не очень решение. Есть куча ограничений: На Си самый вменяемый вариант - это вариант Qraizer'а. Цитата sharky72 @ Думаю надо сначала определиться с теми данными которые предстоит хранить. А уж потом думать КАК их хранить. Вот это - золотые слова (#d4af37). Только вот слёту рекомендовать std::variant (наверное в связке с std::visit) - имхо, слишком самоуверенное решение Из постановки задачи не ясно чо надо в итоге. На шаблонах имеем статический полиморфизм и скорость, на наследовании и использования виртуальных функций - имеем меньшую скорость, но большую гибкость. Например, создание плагинов без необходимости полной пересборки проекта. Ибо рантайм тоже рулид! |
|
Сообщ.
#9
,
|
|
|
|
Цитата Majestio @ Не очень решение. Да, согласен. Просто немного дополнил/поправил утверждение о невозможности. |
|
Сообщ.
#10
,
|
|
|
|
Цитата D_KEY @ Цитата Majestio @ Не очень решение. Да, согласен. Просто немного дополнил/поправил утверждение о невозможности. Ааа ... ну так-то, да. |