Exood4 Studio - Video Game Development, Toulouse (France)
Exood4 Studios Exood4 Tutorials

   
L a n g a g e   C

L e s   u n i o n s






 Le type union est composé de plusieurs champs superposés en mémoire. Une union ne peut donc contenir qu'une seule valeur à un instant donné.

 La syntaxe de la définition, de l'initialisation et de l'utilisation est similaire à celle de la structure, si ce n'est que les champs de bits n'y sont pas autorisés. Les propriétés et les opérations énoncées pour les structures s'appliquent également à l'union.

 La taille d'une union est l'espace mémoire nécessaire pour représenter le champ le plus large :

union donnee
{
 int e;
 float r;
} u;

 Cette déclaration définit une variable u pouvant être soit un entier, soit un réel :

u.e = 21; /* pour affecter un entier à u */
u.r = 1.4; /* pour affecter un réel à u */



 Il n'est pas possible de savoir quel composant a été modifié en dernier, si ce n'est en mémorisant l'état de l'union. Par exemple, l'union peut être placée dans une structure dont un champ indique son composant actif :

enum Forme { cartesienne, polaire };

stuct Complex
{
 enum Forme forme; /* indicateur de la forme courante */
 union
 {
 struct { float re, img; } car; /* forme cartésienne */
 struct { float rho, theta; } pol;   /* forme polaire */
 } valeur;
};

struct Complex z;

z.forme = cartesienne;
z.valeur.car.re = 10.0;
z.valeur.car.im = 0.5;

z.forme = polaire;
z.valeur.pol.rho = 10.0;
z.valeur.pol.theta = 3.14159;

 Le module d'un complexe est alors calculé par la fonction :

float module (struct Complex z)
{
 float result;

 switch ( z.forme )
 {
 case cartesienne :
 result = sqrt (z.valeur.car.re*z.valeur.car.re + z.valeur.car.im*z.valeur.car.im);
 break;

 case polaire :
 result = z.valeur.pol.rho;
 break;

 default :
 erreur ();
 }

 return result;
}

 Notons que dans ce cas bien précis l'union ne sert qu'à offrir des noms de champs explicites pour chacune des formes, puisque les deux membres car et pol sont composés des mêmes types (float, float).



  Retour en haut de page Page suivante