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 superposs en mmoire. Une union ne peut donc contenir qu'une seule valeur un instant donn.

 La syntaxe de la dfinition, 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 autoriss. Les proprits et les oprations nonces pour les structures s'appliquent galement l'union.

 La taille d'une union est l'espace mmoire ncessaire pour reprsenter le champ le plus large :

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

 Cette dclaration dfinit une variable u pouvant tre soit un entier, soit un rel :

u.e = 21; /* pour affecter un entier u */
u.r = 1.4; /* pour affecter un rel u */



 Il n'est pas possible de savoir quel composant a t modifi en dernier, si ce n'est en mmorisant l'tat de l'union. Par exemple, l'union peut tre place 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 cartsienne */
 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 prcis l'union ne sert qu' offrir des noms de champs explicites pour chacune des formes, puisque les deux membres car et pol sont composs des mmes types (float, float).



  Retour en haut de page Page suivante