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_parametersmessage_base最初のフィールドとして a を持ち、最初のフィールドとして asをreply_message持ち、最初のフィールドとして as を持ちます。 したがって、基本的にはそれらのいずれにもアクセスでき、必要なすべてのデータを取得できますが、ドライバーからバッファーを取得しているので、それをメッセージにシリアル化したいと考えています。 構造体と相関しないため、バッファーへのポインターが間違っていることは既に知っていますが、固定サイズのバッファーを持つことはできません。 途中のどこかでこれをやりたい: message_with_parametersmessage_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 に答える