полиморфизм в ц и буферах - PullRequest
1 голос
/ 16 августа 2010

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

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;

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

EDIT:
Вот мои структуры:

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;

1 Ответ

2 голосов
/ 16 августа 2010

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

buffer_t * buffer - указатель, поэтому указатель является частью объединения, а не данных, на которые он указывает

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

 m =  (message*) buff->payload;
...