我有这个联盟:

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;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top