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;
Était-ce utile?

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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top