Help and Support

Numéro d'article: 47693 - Dernière mise à jour: mardi 5 juillet 2005 - Version: 2.1

INFO : initialisation syndicats initialise le premier membre de l'Union

Sommaire

Agrandir tout | Réduire tout

Résumé

Lors de l'initialisation une union, la valeur d'initialisation est appliquée au premier membre de l'Union même si le type de la valeur correspond à un membre suivant. Comme indiqué dans la norme ANSI, section 3.5.7 :
   A brace-enclosed initializer for a union object initializes the
   member that appears first in the declaration list of the union
   type.
				
car vous ne pouvez pas initialiser la valeur de n'importe quel membre d'une union autre que la première, vous devez affecter leurs valeurs dans une instruction distincte. L'initialisation d'une union avec une valeur destinée à un membre suivant provoque cette valeur à convertir en le type du premier membre.

Plus d'informations

L'exemple suivant illustre le problème :

Exemple de code

/* Compile options needed: none
*/ 

#include <stdio.h>
union { int   a;
        float b;
      } test = {3.6};    /* This is intended to initialize 'b'      */ 
                         /* however, the value will be converted    */ 
                         /* (first to a long and then to an int)    */ 
                         /* in order to initialize 'a'.             */ 

void main (void)
{
   float dummy = 0.0;            /* This causes the floating point  */ 
                                 /* math package to be initialized.  */ 
                                 /* Not necessary with VC++ for     */ 
                                 /* Windows NT.                      */ 

   printf ("test.a = %d,  test.b = %f\n", test.a, test.b);
}
				
La sortie de l'exemple, bien que pas ce qui est destiné, soit comme suit :
   test.a = 3, test.b = 0.00000
				
pour associer une valeur à « b », vous pouvez inverser l'ordre des membres, comme dans les opérations suivantes :
union {
        float b;
        int a;
      } test = {3.6};
				
ou, vous pouvez conserver l'ordre des éléments et affecter la valeur dans une instruction distincte, comme dans les opérations suivantes :
   test.b = 3.6;
				
deux de ces méthodes crée la sortie suivante :
   test.a = 26214, test.b = 3.600000
				
sous Windows NT, le résultat serait comme suit :
   test.a = 1080452710, test.b = 3.600000
				

Références

Pour les exemples et explication du erreurs du compilateur possibles et des avertissements générés lorsqu'il tente d'initialiser un élément union non principal, consultez l'article suivant dans la Base de connaissances Microsoft. :
39910  (http://support.microsoft.com/kb/39910/EN-US/ ) MODÈLE : initialisation non principal élément Union produit des erreurs

Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft C Professional Development System 6.0a
  • Microsoft Visual C++ 1.0 Édition Professionnelle
  • Microsoft Visual C++ 1.5 Édition Professionnelle
  • Microsoft Visual C++ 1.51
  • Microsoft Visual C++ 1.52 Édition Professionnelle
  • Microsoft Visual C++ 2.0 Édition Professionnelle
  • Microsoft Visual C++ 2.1
  • Microsoft Visual C++ 4.0 Édition Standard
  • Microsoft Visual C++ 5.0 Édition Entreprise
  • Microsoft Visual C++ 6.0 Édition Entreprise
  • Microsoft Visual C++ 5.0 Édition Professionnelle
  • Microsoft Visual C++ 6.0 Édition Professionnelle
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
Mots-clés : 
kbmt kbcode kbinfo kblangc KB47693 KbMtfr
Traduction automatiqueTraduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 47693  (http://support.microsoft.com/kb/47693/en-us/ )
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Traductions disponibles