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

 
 
> Эффективно преобразовать эл-ты структуры в массив байт, избежать 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
Ответов
Сергей Борщ
сообщение May 11 2011, 16:51
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 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 Текстовая версия Сейчас: 23rd July 2025 - 16:30
Рейтинг@Mail.ru


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