I имеют сложную структуру данных (с большим количеством неполных типов массивов/гетерогенные массивы длины структур и указатель на структуры в массивы структур ...)Стратегия объявления сложных C-структурированных данных const?
Я хотел бы поставить тех, во флэш-памяти, так что я думал о том, чтобы поместить их в объекты const статического хранилища (они будут храниться на флэш-памяти), и пусть компилятор выполнит свою работу.
Я работаю над встроенной средой, где ROM == flash == данные, которые я не могу физически изменить. У меня мало оперативной памяти и, конечно, недостаточно для хранения всех моих данных. GCC можно сказать, чтобы статические данные const const хранить в ROM без проблем.
Данные не могут быть построены динамически, так как они должны оставаться во вспышке.
В настоящее время я использую C (не C++) с 4,8 gcc и не против использования GCCisms.
Однако я продолжаю encoutering сообщения об ошибках, как:
- инициализатор элемент не является постоянная
- несовместимых типов указателей
- ...
по-разному с разными самым последними релизами GCC, предлагая эта функциональность (смешанные литералы, назначенные инициализаторы, ...) является недавним или не основным.
Обратите внимание, что этот код генерируется программой (скриптом).
Помимо ошибок я продолжать делать (я мог бы быть более конкретным и попросить о помощи там), какую стратегию вы могли бы предложить:
- продолжать пытаться с помощью комплекса, вложенных буквенные структур с использованием составных литералов
- имеющие массовый типа соединение буквального
- , имеющие несколько типов соединений литералов, указывающего друг с другим
- строит много промеж (чтобы все это было совершенно нечитаемым)
создание большого uint32_t datablob [] и правильное распределение моих структур (с бонусной неспособностью не иметь возможности сохранять указатели между объектами, так как мой линкер укажет, где это будет в конечном итоге)
любые другие варианты?
(редактирование: добавлены особенности)
Ну, мой вопрос был больше о общей стратегии, но вот пример:
struct A
{
int id;
int codes[];
};
struct B
{
int b_member;
struct A *a[]; // array of ptr to A objects
};
struct C
{
int c_member;
struct B *objects[]; // array of ptrs on B
};
const struct A rom_data = { .id=4, .codes = {1,2,3,4}}; // this is in ROM
int main(void) {}
Я хотел бы заявить, что я сделал для Массив структур C. (Это означает, что я не хочу копировать данные, читать их с диска или malloc, просто объявлять константу с данными на месте.)
Все примеры, которые я имею о литералах, очень просты.
Специфика моей платформы - микроконтроллер ARM, но просто подумайте, хочу ли я объявить const.
Не видя какого-либо примера кода, сложно комментировать определенные ошибки, которые вы видите ... –
Предлагаю собрать упрощенный пример, демонстрирующий, что у вас проблемы. В его нынешнем виде вопрос слишком широк. – user3386109
уверен, что мой вопрос касался скорее стратегии использования, чем конкретных ошибок, но я мог бы предоставить специфику. – makapuf