Les unions constituent un autre type de structure. Elles sont déclarées avec le mot clé union, qui a la même syntaxe que struct. La différence entre les structures et les unions est que les différents champs d'une union occupent le même espace mémoire. On ne peut donc, à tout instant, n'utiliser qu'un des champs de l'union.
Exemple 1. Déclaration d'une union
union entier_ou_reel
{
int entier;
float reel;
};
union entier_ou_reel x;
x peut prendre l'aspect soit d'un entier, soit d'un réel. Par exemple :
x.entier=2;
affecte la valeur 2 à x.entier, ce qui détruit x.reel.
Si, à présent, on fait :
x.reel=6.546;
la valeur de x.entier est perdue, car le réel 6.546 a été stocké au même emplacement mémoire que l'entier x.entier.
Les unions, contrairement aux structures, sont assez peu utilisées, sauf en programmation système où l'on doit pouvoir interpréter des données de différentes manières selon le contexte. Dans ce cas, on aura avantage à utiliser des unions de structures anonymes et à accéder aux champs des structures, chaque structure permettant de manipuler les données selon une de leurs interprétations possibles.
Exemple 2. Union avec discriminant
struct SystemEvent
{
int iEventType; /* Discriminant de l'événement.
Permet de choisir comment l'interpréter. */
union
{
struct
{ /* Structure permettant d'interpréter */
int iMouseX; /* les événements souris. */
int iMouseY;
};
struct
{ /* Structure permettant d'interpréter */
char cCharacter; /* les événements clavier. */
int iShiftState;
};
/* etc. */
};
};
/* Exemple d'utilisation des événements : */
int ProcessEvent(struct SystemEvent e)
{
int result;
switch (e.iEventType)
{
case MOUSE_EVENT:
/* Traitement de l'événement souris... */
result = ProcessMouseEvent(e.iMouseX, e.iMouseY);
break;
case KEYBOARD_EVENT:
/* Traitement de l'événement clavier... */
result = ProcessKbdEvent(e.cCharacter, e.iShiftState);
break;
}
return result;
}
2017-10-15 16:10:36 / mazoughou@magoe.gn
0 commentaires
Votre impression compte aussi