Вопрос

У меня есть этот союз:

typedef union Message
{
    message_base            base;
    message_with_parameters  parameters;
    reply_message          reply;
    buffer_t                *buffer; // can't figure out what to put here
} message;

message_with_parameters имеет message_base как первое поле и reply_message имеет message_with_parameters как первое поле, которое по очереди имеет message_base как первое поле.
Так что в основном я могу получить доступ к любую из них, и я все равно получаю все необходимые данные, однако я получаю буфер от моего водителя, и теперь я хочу сериализовать его в сообщение.
Я уже знаю, что указатель на буфер неверно, так как оно не будет коррелировать со своими структурами, но у меня не может быть фиксированного размера буфера.
Где-то по тому, как я хочу сделать это:

m->buffer = buff->payload;

И независимо от того, какой тип данных у меня есть, он все еще будет сериализовать.
Как это можно сделать?

РЕДАКТИРОВАТЬ:
Вот мои структуры:

typedef struct MessageBase
{
    uint32_t    u32DeviceID;
    uint32_t    u32CoreID;
    uint16_t    u16Class;
    uint16_t    u16CRC;
    uint8_t     u8OpCode;

    void (*states [MAX_OPCODES]) (void *);
} message_base;

typedef struct MessageWithParameters
{
    message_base    base_class;
    uint8_t         u8Param1;
    uint8_t         u8Param2;
} message_with_parameters;

typedef message_with_parameters reply_message;

typedef union Message
{
    message_base            base;
    message_with_parameters parameters;
    reply_message           reply;
} message;
Это было полезно?

Решение

Это потому, что данные в буфере не являются частью объединения.

Buffer_T * Buffer является указателем, поэтому указатель является частью союза, а не данные, которые он указывает на

Вы, вероятно, хотите сделать что-то вроде

 m =  (message*) buff->payload;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top