Domanda

Ho questa unione:

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 ha un message_base come il primo campo e reply_message ha un message_with_parameters come come il primo campo che a sua volta ha message_base come come il primo campo.
Quindi, in pratica posso accedere a qualsiasi di essi e io sarò ancora ottenere tutte le necessità di dati che, però io sono sempre un buffer dal mio autista e ora voglio serializzare nel messaggio.
So già che il puntatore al buffer è sbagliato in quanto non sarà correlato con le mie le strutture, ma non posso avere un buffer di dimensione fissa.
Da qualche parte lungo la strada che voglio fare questo:

m->buffer = buff->payload;

E non importa che tipo di tipo di dati che ho, lo farà ancora serialize.
Come si può fare?

EDIT:
Qui sono i miei le strutture:

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;
È stato utile?

Soluzione

la sua perché i dati nel buffer non è parte dell'unione.

buffer_t * buffer è un puntatore, in modo che il puntatore è parte dell'unione, non i dati che esso punti a

si probablly vuole fare qualcosa di simile

 m =  (message*) buff->payload;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top