реклама на сайте
подробности

 
 
> Эффективно преобразовать эл-ты структуры в массив байт, избежать unalignment и упакованных структур
alt3857
сообщение May 11 2011, 12:10
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 94
Регистрация: 21-04-10
Пользователь №: 56 794



Привет! Есть структура, которая содержит различные элементы, общая сумма которых 8 байт, нужно их отобразить в массив. Просто копировать нельзя, какие способы есть, чтобы структуры packed не использовать?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
zoddy
сообщение May 11 2011, 13:31
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 4-12-05
Из: Екатеринбург
Пользователь №: 11 773



Цитата(alt3857 @ May 11 2011, 18:10) *
Привет! Есть структура, которая содержит различные элементы, общая сумма которых 8 байт, нужно их отобразить в массив. Просто копировать нельзя, какие способы есть, чтобы структуры packed не использовать?


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

CODE

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

struct _your_structure // структура
{
.........................................
}Your_Structure;
}Union_struct;
Go to the top of the page
 
+Quote Post
alt3857
сообщение May 11 2011, 14:00
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 94
Регистрация: 21-04-10
Пользователь №: 56 794



zoddy, у меня элементы в структуре "растянуты" (я не использую packed структуры), т.е. размер суммы элементов структуры равен 8, а размер самой структуры в общем случае >=8, поэтому трюк с union не получится.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение May 11 2011, 16:07
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Ну можно такой огород нагородить:


Код
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;
}
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 11 2011, 16:51
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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. Простор для творчества.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 17:58
Рейтинг@Mail.ru


Страница сгенерированна за 0.01371 секунд с 7
ELECTRONIX ©2004-2016