Polymorphismus in c und Puffer
-
28-09-2019 - |
Frage
Ich habe diese Vereinigung:
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
hat eine message_base
als erstes Feld und reply_message
hat eine message_with_parameters
wie das erste Feld, die abwechselnd message_base
wie das erste Feld hat.
Also im Grunde kann ich einen von ihnen zugreifen, und ich werde immer noch alle Daten, ich brauche bekommen, aber ich bin einen Puffer von meinem Fahrer bekommen und jetzt will ich es in die Nachricht serialisieren.
Ich weiß schon, dass der Zeiger auf den Puffer falsch ist, da es nicht korreliert mit meinem structs aber ich kann nicht eine feste Größe Puffer haben.
Irgendwo auf dem Weg Ich möchte, dies zu tun:
m->buffer = buff->payload;
Und egal, welche Art von Daten vom Typ I haben, wird es noch serialize.
Wie kann es geschehen?
EDIT:
Hier sind meine structs:
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;
Lösung
sein, weil die Daten im Puffer nicht Teil der Vereinigung ist.
buffer_t * buffer ist ein Zeiger, so dass der Zeiger Teil der Union, nicht die Daten, die er zeigt auf
Sie wollen probablly etwas tun, wie
m = (message*) buff->payload;