Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Эффективно преобразовать эл-ты структуры в массив байт
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
alt3857
Привет! Есть структура, которая содержит различные элементы, общая сумма которых 8 байт, нужно их отобразить в массив. Просто копировать нельзя, какие способы есть, чтобы структуры packed не использовать?
zoddy
Цитата(alt3857 @ May 11 2011, 18:10) *
Привет! Есть структура, которая содержит различные элементы, общая сумма которых 8 байт, нужно их отобразить в массив. Просто копировать нельзя, какие способы есть, чтобы структуры packed не использовать?


Я в своих программах поступаю так...

CODE

union _Union_Struct
{
uint8_t Array[0x8]; // массив с данными структуры

struct _your_structure // структура
{
.........................................
}Your_Structure;
}Union_struct;
alt3857
zoddy, у меня элементы в структуре "растянуты" (я не использую packed структуры), т.е. размер суммы элементов структуры равен 8, а размер самой структуры в общем случае >=8, поэтому трюк с union не получится.
sergeeff
Ну можно такой огород нагородить:


Код
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;
}
Сергей Борщ
QUOTE (alt3857 @ May 11 2011, 15:10) *
какие способы есть, чтобы структуры packed не использовать?
В общем случае задача не решается. Можно вручную создать по массиву описателей полей для каждого типа структур и по этому описателю упаковывать/распаковывать структуру во время обмена. Что-то вроде:
CODE
#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. Простор для творчества.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.