2012-06-14 5 views
2

У меня есть, например, этот формат структурыКак перебрать все элементы в структуре?

typedef struct{ 
    tMY_STRUCT2 my_struct2; 
    u16 item1; 
    u8 item2[20];  
    u32 item3; 
}tMY_STRUCT; 

Как я могу получить через структуру? Из-за выравнивание его не очень легко, и я не могу рассчитать смещение от начала структуры с SIZEOF (item).

Есть ли способ?

Причина: Мне нужно инициировать большую структуру, для этого есть некоторые условия, поэтому мне нужно сделать это в цикле FOR.

+2

[Что вы пытались?] (Http://whathaveyoutried.com) – sczizzo

ответ

5

Не делайте этого. Точкой структуры является то, что вы не может обрабатывать свои элементы данных равномерно. Структура - это гетерогенные данные, так как массив является однородным.

Инициируйте каждое поле по одному в коде или инициализируйте всю структуру до нуля. Это единственные варианты хорошей практики. Выравнивание, в частности, будет зависеть от архитектуры машины, компилятора и т. Д., Поэтому подход, который использует это, скорее всего, будет нарушен, если вы сделаете кажущиеся тривиальными изменения в вашем коде, такие как переупорядочение полей в декларации или запуск на другой ОС или компиляция в другом месте ,

Варианты:

memset(mystruct, 0, sizeof(mystruct)); 

или (я думаю, что это C99) mystruct_t foo = {0};

Или просто инициализировать каждое поле.

+0

Memset для всей структуры недостаточно для меня, поскольку я сказал, что мой Init сложнее, чем это решение. В моем случае определяется длина каждого элемента (перед выравниванием) в специальном массиве. Поэтому я должен сделать функцию для сериализации этой структуры в байтовый массив и использовать этот массив для моего цикла init. – Meloun

+0

Затем вам нужно инициализировать каждое поле отдельно в коде. – djechlin

+0

550 элементов, для каждого поля проверяют некоторые условия и чем init? – Meloun

0

Я не совсем понимаю, как цикл for поможет вам здесь ... однако нет хорошего способа перебора структуры.

Вы можете настроить структуру указателей на объекты в своей структуре, а затем пропустить это через sizeof (ptr), но это было бы ужасно, и ваши сотрудники будут линчевать вас.

Смежные вопросы