polimorfismo in C e tamponi
-
28-09-2019 - |
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;
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;