У меня есть этот союз:
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;