Полиморфизм в C и буфера
-
28-09-2019 - |
Вопрос
У меня есть этот союз:
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;