IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Initialisation d'une union


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2010
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 7
    Par défaut Initialisation d'une union
    Bonjour,

    J'ai lu qu'on pouvait initialiser seulement le premier attribut d'une union.

    Pourtant si j'ai cette union :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    union machin
    {
       int entier;
       char *chaine;
    };
    et que je veux initialiser 'chaine', ceci fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    union machin m = { .chaine = "abc" };
    Est-ce qu'il y a un piège ?

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,
    Citation Envoyé par enclair Voir le message
    Est-ce qu'il y a un piège ?
    Oui, il y a un piège :
    chaine va bien pointer sur la chaine qui contient "abc", mais quelle sera la durée de vie de la chaine "abc" ?

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2010
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 7
    Par défaut
    quelle sera la durée de vie de la chaine "abc"
    C'est une donnée constante, donc elle dure pendant tout le programme non ? (mon union est une variable globale et est initialisée en dehors de toute fonction).

  4. #4
    Membre émérite
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Par défaut
    Citation Envoyé par enclair
    Citation Envoyé par mabu
    quelle sera la durée de vie de la chaine "abc"
    C'est une donnée constante, donc elle dure pendant tout le programme non ?
    Tout a fait !
    Mais ce n'est pas le cas du pointeur chaine qui peut être écrasé par entier.
    En ce cas la chaine pointée par chaine ne sera plus accessible.

  5. #5
    Membre du Club
    Inscrit en
    Septembre 2010
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 7
    Par défaut
    Ok, mais tout ça c'est un autre problème.
    Mon problème à moi, c'était que j'avais lu qu'on pouvait initialiser seulement le premier attribut, et que là j'arrive à initialiser le second. Alors soit ce que j'ai lu est faux, soit j'ai raté quelque chose.

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    union machin m = { .chaine = "abc" };
    Je ne connaissais pas cette syntaxe pour initialiser un membre d'union, c'est valide, ca compile ?

    En tout cas, mon compilateur (Visual Studio) m'envoie une bordée d'injures à ce sujet

    Citation Envoyé par Visual Studio 2005
    1>d:\raymond\developpement\programmes\main.cpp(42) : error C2143: erreur de syntaxe*: absence de '}' avant '.'
    1>d:\raymond\developpement\programmes\main.cpp(42) : error C2143: erreur de syntaxe*: absence de ';' avant '.'
    1>d:\raymond\developpement\programmes\main.cpp(42) : error C2143: erreur de syntaxe*: absence de ';' avant '.'
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  7. #7
    Membre émérite
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Par défaut
    Visual C++ n'en veut pas.

    Borland C++ n'en veut pas.

    Par contre CodeBlocks (Mingw) le compile .

  8. #8
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Et la norme, elle dit quoi ?
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  9. #9
    Membre du Club
    Inscrit en
    Septembre 2010
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 7
    Par défaut
    Ça doit être une "nouveauté" de la norme C99 :

    http://nicolasj.developpez.com/articles/c99/#LIII-D

    Ici, ils ne parlent que des structure.

    Mais là : http://www.open-std.org/jtc1/sc22/wg...docs/n1256.pdf

    On peut voir cet exemple paragraphe 6.7.8 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    EXAMPLE 13  Any member of a union can be initialized:
     
             union { /* ... */ } u = { .any_member = 42 };
    Merci à tous.

  10. #10
    Invité
    Invité(e)
    Par défaut
    Bonsoir,
    A mon avis, on confond initialisation et affectation.
    Etant donné que l'entier est le premier membre de l'union, la seule initialisation possible est
    L'écriture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpy(m.chaine,"abc");
    est une affectation.
    Ce qui me gène surtout, c'est la taille de l'union. La taille sera fixée entre la plus grande longueur entre un int et un char*.
    Quelle est la taille d'un char* ? C'est un pointeur, donc (je crois) 4 octets.
    Donc, il vaudrait mieux mettre
    Dans tous les cas, s'il y a une affectation pour chaine et ensuite une autre affectation pour entier, chaine sera modifié, c'est le principe de l'union, la même zone mémoire est réservée et le type utilisé est celui qui correspond au membre précisé.

  11. #11
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par Pierre Dolez Voir le message
    A mon avis, on confond initialisation et affectation.
    Etant donné que l'entier est le premier membre de l'union, la seule initialisation possible est
    Il n'y a pas de confusion (sauf peut être de ta part), dans le message initiale, il est bien question d'initialisation.

    Citation Envoyé par Pierre Dolez Voir le message
    L'écriture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpy(m.chaine,"abc");
    est une affectation.
    Quel est le rapport avec le sujet ? Nul part dans cette enfilade il a été question de copie de chaîne de caractères.

    Citation Envoyé par Pierre Dolez Voir le message
    Ce qui me gène surtout, c'est la taille de l'union. La taille sera fixée entre la plus grande longueur entre un int et un char*.
    Quelle est la taille d'un char* ? C'est un pointeur, donc (je crois) 4 octets.
    Donc, il vaudrait mieux mettre
    Tout d'abord, la taille d'un pointeur est peut être de 4 octets chez toi, mais la norme n'impose pas cette taille. Elle peut donc être différente ailleurs.

    Ensuite, pourquoi veux tu remplacer le pointeur par un tableau. Si on souhaite stocker l'adresse d'une chaîne, comme c'est visiblement le cas ici, le type adéquate est bel et bien un pointeur (même si, lorsqu'il s'agit de stocker des chaînes constantes, j'utiliserais plutôt const char*)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Initialisation exotique d'une union
    Par bber007 dans le forum Langage
    Réponses: 5
    Dernier message: 09/09/2009, 20h06
  2. Réponses: 10
    Dernier message: 24/09/2005, 19h19
  3. Initialisation d'une colonne par rapport à une autre colonne
    Par jeromesco dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 13/04/2005, 17h15
  4. Réponses: 1
    Dernier message: 29/08/2004, 19h45
  5. [Initialisation] Remplir une structure une fois
    Par Kimael dans le forum Langage
    Réponses: 14
    Dernier message: 08/06/2004, 15h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo