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 :

accès à un membre d'un structure dans une union avec vc++


Sujet :

C

  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 340
    Par défaut accès à un membre d'un structure dans une union avec vc++
    Le code suivant compile bien avec gcc (c'est apparemment du C99):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #include <stdlib.h>
     
    union foo
    {
      struct {
        int l;
        void *d;
      } pool;
      struct {
        int min;
        int max;
      } minmax;
    };
     
    int main ()
    {
      union foo f1 = { .minmax = { 1, 2 } };
     
      return 0;
    }
    Mais pour vc++ (Visual Studio 2008), il y a une erreur dans la définition de f1, à cause du '.' devant minmax .

    J'aimerais savoir s'il y a une autre syntaxe similaire pour vc++ (i.e. je veux définir f1 lors de sa déclaration). Donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    union foo f1;
    f1.minmax.min = 1;
    f1.minmax.max = 2;
    n'est pas ce que je demande.

    merci

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Je pense que la seule solution est d'inverser les membres pool et minmax :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    union foo
    {
      struct {
        int min;
        int max;
      } minmax;
      struct {
        int l;
        void *d;
      } pool;
    };
     
    int main ()
    {
      union foo f1 = {1, 2};
      return 0;
    }

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 340
    Par défaut
    et si je veux utiliser la partie 'pool' ?

    Il faut que ca marche pour l'un ou l'autre

  4. #4
    Membre éprouvé
    Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2002
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 121
    Par défaut
    Bonjour,

    tu n'aura pas de probleme normalement.

    Il faut savoir qu'une union n'est qu'une representation différente d'un meme espace memoire, dont la taille est déterminée par le plus grand élèment de l'union.


    Normalement tant que ta declaration correspond a un des cas, tu ne devrais pas être embêté.

    De mémoire
    sizeof(int) => 4 bytes
    sizeof(void *) => 8 bytes


    Donc normalement si tu fais un sizeof de ton union tu devrais avoir
    12 bytes.


    et quand tu vas interroger
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    f1.minmax.min = les 4 premier bytes de la strucutres
    f1.minmax.max = les 4 suivant
     
    f1.pool.l = les 4 premier bytes de la strucutres
    f1.pool.d = les 8 suivant
    et ce quel que soit le contenu mémoire de ton union.
    Il faut donc bien faire attention a la validité des information contenues dans
    ton union.

    Tu dois donc pouvoir faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    union foo f1 = {1,2};
     
    //ou 
    union foo f1 = {1, &var};

    C'est peut etre pas tres clair, mais il y a plein d'explications sur le net.

    Cordialement

  5. #5
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    En dehors de la possibilité de champ nommé, on ne peut indifféremment initialiser une union tantôt avec un champ, tantôt avec un autre (lors de la définition d'instances différentes de l'union naturellement).
    C'est par l'intermédiaire du premier élément déclaré dans l'union qu'elle peut être initialisée. L'ordre de déclaration des champs d'une union n'est donc pas sans incidence.

    Cela n'affecte pas la question de l'accès à un membre ou à un autre de l'union.

Discussions similaires

  1. Réponses: 6
    Dernier message: 12/09/2007, 15h58
  2. structure dans une fonction
    Par isma92 dans le forum C
    Réponses: 14
    Dernier message: 03/12/2006, 23h47
  3. Acces aux attributs d'un bean dans une jsp
    Par mariemor64 dans le forum Struts 1
    Réponses: 2
    Dernier message: 02/06/2006, 10h32
  4. Passer une structure dans une fonction ...
    Par pilouface dans le forum C
    Réponses: 4
    Dernier message: 03/04/2006, 01h00
  5. [MFC] Passage d'une structure dans une method
    Par KPitN dans le forum MFC
    Réponses: 5
    Dernier message: 18/06/2004, 10h11

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