alt3857 0 11 мая, 2011 Опубликовано 11 мая, 2011 · Жалоба Привет! Есть структура, которая содержит различные элементы, общая сумма которых 8 байт, нужно их отобразить в массив. Просто копировать нельзя, какие способы есть, чтобы структуры packed не использовать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zoddy 0 11 мая, 2011 Опубликовано 11 мая, 2011 · Жалоба Привет! Есть структура, которая содержит различные элементы, общая сумма которых 8 байт, нужно их отобразить в массив. Просто копировать нельзя, какие способы есть, чтобы структуры packed не использовать? Я в своих программах поступаю так... union _Union_Struct { uint8_t Array[0x8]; // массив с данными структуры struct _your_structure // структура { ......................................... }Your_Structure; }Union_struct; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alt3857 0 11 мая, 2011 Опубликовано 11 мая, 2011 · Жалоба zoddy, у меня элементы в структуре "растянуты" (я не использую packed структуры), т.е. размер суммы элементов структуры равен 8, а размер самой структуры в общем случае >=8, поэтому трюк с union не получится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 11 мая, 2011 Опубликовано 11 мая, 2011 · Жалоба Ну можно такой огород нагородить: typedef struct { char a; wchar_t b; char c; int d; }Your_Structure; #pragma pack(push, 1) typedef union { char Array[0x8]; struct { char a; wchar_t b; char c; int d; }PS; }Union_struct; #pragma pack(pop) int main(void) { Union_struct aa; Your_Structure bb = {1, 2, 3, 4}; aa.PS.a = bb.a; aa.PS.b = bb.b; aa.PS.c = bb.c; aa.PS.d = bb.d; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 11 мая, 2011 Опубликовано 11 мая, 2011 · Жалоба какие способы есть, чтобы структуры packed не использовать?В общем случае задача не решается. Можно вручную создать по массиву описателей полей для каждого типа структур и по этому описателю упаковывать/распаковывать структуру во время обмена. Что-то вроде:#include <stddef.h> #include <stddef.h> struct my_type { uint8_t Field_a; uint_fast8_t Field_b; // !!! uint16_t Field_c; uint32_t Field_d; }; struct field_descriptor { uintptr_t Offset; size_t Size; }; field_descriptor My_type_fields[] = { { offsetof(my_type, Field_a), 1 }, { offsetof(my_type, Field_b), 1 }, { offsetof(my_type, Field_c), 2 }, { offsetof(my_type, Field_d), 4 }, }; Можно по аналогии с offsetof() написать макрос определения размера поля. Но он не подойдет для типов вроде uint_fast8_t, для них придется указывать вручную. Можно написать макрос, заполняющий оба поля field_descriptor. Простор для творчества. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться