2010-08-15 8 views
1

I ont cette union:en c et tampons

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'entre eux et je vais toujours obtenir toutes les données dont j'ai besoin, mais je reçois un tampon de mon pilote et maintenant je veux le sérialiser dans le message.
Je sais déjà que le pointeur vers le tampon est faux car il ne sera pas corrélé avec mes structures, mais je ne peux pas avoir un tampon de taille fixe.
Quelque part le long de la façon dont je veux faire:

m->buffer = buff->payload; 

Et peu importe quel genre de type de données dont je dispose, il sera toujours sérialisation.
Comment cela 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; 

Répondre

2

son parce que les données contenues dans la mémoire tampon ne fait pas partie de l'Union. tampon

buffer_t * est un pointeur, de sorte que le pointeur fait partie de l'union, et non pas les données qu'il pointe à

vous voulez probablly faire quelque chose comme

m = (message*) buff->payload; 
+0

Je reçois seulement indésirable. Même si les valeurs que j'ai saisies sont correctes. –

+0

c'est difficile de savoir ce que vous faites, je fais juste quelques suppositions. vous avez un tampon de données qui est un "message", vous avez donc défini un message union (que je suis un peu méfiant, je ne suis pas sûr si tous ces champs sont censés être une union? Est-ce que cela devrait être une structure avec certains de ces syndicats?). par conséquent vos données dans votre tampon, le premier octet sera le premier octet dans tout ce qui est dans la base de message, et aussi ce sera le premier octet de reply_message, et aussi ce sera le premier octet de message_with paramètres. –

+0

@Keith Nicholas: Voir mes modifications pour mes structures. Le type de charge utile est void * au cas où vous poseriez –