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*缓冲区是指指针,因此指针是联合的一部分,而不是指向的数据
您可能想做类似的事情
m = (message*) buff->payload;
不隶属于 StackOverflow