polymorphisme à c et des tampons
-
28-09-2019 - |
Question
J'ai cette union:
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
a une message_base
que le premier champ et reply_message
a une message_with_parameters
que comme premier champ qui à son tour a message_base
en tant que le premier champ.
Donc, fondamentalement, je peux accéder à l'un d'eux et je vais toujours obtenir toutes les données dont j'ai besoin, mais je reçois un tampon de mon chauffeur et maintenant je veux sérialisation dans le message.
Je sais déjà que le pointeur sur le buffer est erroné car il ne sera pas en corrélation avec mes struct mais je ne peux pas avoir un tampon de taille fixe.
Quelque part le long du chemin que je veux faire ceci:
m->buffer = buff->payload;
Et peu importe quel type de données de type I ont, il sera toujours serialize.
Comment peut-il être fait?
EDIT:
Voici mes struct:
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;
La solution
est parce que les données dans la mémoire tampon ne fait pas partie de l'Union.
* buffer_t tampon est un pointeur, alors le pointeur fait partie de l'union, non pas les données qu'il points à
vous voulez probablly faire quelque chose comme
m = (message*) buff->payload;