1

我有这个工会:

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将 amessage_base作为第一个字段,reply_message将 amessage_with_parameters作为第一个字段,然后将 a 作为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;
4

1 回答 1

2

这是因为缓冲区中的数据不是联合的一部分。

buffer_t* 缓冲区是一个指针,所以指针是联合的一部分,而不是它指向的数据

你可能想做类似的事情

 m =  (message*) buff->payload;
于 2010-08-15T23:33:02.673 回答