2009-05-12 8 views
1

J'ai une union qui est défini comme suit:Comment accéder aux membres internes d'un syndicat?

typedef union { 
    enum { 
    REVISION = 0, 
    CURRENT_VERSION = REVISION 
    }; 

    enum FLAGS{ 
    FLAG_DEFAULT    = 0x00000000, 
    FLAG_EOD     = 0x00000001, 
    FLAG_OUTOFORDER   = 0x00000002 
    }; 

    CHAR _filler[32]; 

    struct INTERNAL_STRUCTURE { 
    UINT16 type; 
    UINT16 flags; 
    }; 
}CORRHDR 

Comment puis-je accéder de mon code de INTERNAL_STRUCTURE de membre?

J'ai pensé que je pouvais le faire:

CORRHDR hdr; 
hdr.INTERNAL_STRUCTURE.type = 1; 

je me trompe. Je peux voir les enums dans l'union, mais rien d'autre. Quelqu'un pourrait-il expliquer la structure (ou le bénéfice) de ce type pour moi?

Répondre

5

Vous avez déclaré le de type appelé INTERNAL_STRUCTURE, mais pas une instance réelle de ce type. Essayez ceci:

typedef union { 
    //... 
    CHAR _filler[32]; 
    struct { 
    UINT16 type; 
    UINT16 flags; 
    } INTERNAL_STRUCTURE; 
}CORRHDR; 

ensuite pour accéder au champ:

CORRHDR ch; 
printf("%u\n", ch.INTERNAL_STRUCTURE.type); 
+0

[Je suis le portage d'un système unix aux fenêtres]. La définition d'une structure de cette manière (à l'intérieur de l'union sans nom d'instance) peut-elle être simplement une référence de développeur pour les données binaires contenues dans l'union? – scottm

+0

Oui, avec la déclaration comme donnée, vous pouvez accéder aux données à l'intérieur en utilisant quelque chose comme: reinterpret_cast (ch._filler) -> type mais cela semble bizarre. –

1

Vous devez définir un objet de type INTERNAL_STRUCTURE avant de pouvoir essayer d'y accéder. Votre syndicat à partir de maintenant n'en a pas. Essayez:

struct INTERNAL_STRUCTURE { 
    UINT16 type; 
    UINT16 flags; 
    }; 
struct INTERNAL_STRUCTURE is; 

...

0

Vous avez défini un type nommé INTERNAL_STUCTURE

pas une instance nommée INTERNAL_STRUCTURE.

typedef union { 
    enum { 
    REVISION = 0, 
    CURRENT_VERSION = REVISION 
    }; 

    enum FLAGS{ 
    FLAG_DEFAULT    = 0x00000000, 
    FLAG_EOD     = 0x00000001, 
    FLAG_OUTOFORDER   = 0x00000002 
    }; 

    CHAR _filler[32]; 

    struct { 
    UINT16 type; 
    UINT16 flags; 
    } INTERNAL_STRUCTURE; 
}CORRHDR; 
0

De plus, vous définissez votre structure mais ne l'utilisez pas!

Vous devez définir une variable de ce type struct:

union Blob 
{ 
    CHAR _filler[32]; 

    struct INTERNAL_STRUCTURE { 
    UINT16 type; 
    UINT16 flags; 
    } myStruct; 
}; 

CORRHDR hdr; 
hdr.myStruct.type = 1; 
Questions connexes