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 :

union et struct ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Septembre 2007
    Messages : 267
    Par défaut union et struct ?
    Bonjour,
    J'étudie toujours le même tutorial : http://c.developpez.com/cours/poly-c/?page=page_2

    et union me pose un probleme.
    Si j'ai bien compris, l'attribut de union qui sera le seul à etre apelé est celui qui occupe le plus d'espace.

    Suis-je bon ou tout a fait en dehors de la plaque?

    ps : si mon intuition dit juste, a quoi bon utiliser union au lieu de struc?

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 483
    Par défaut
    et union me pose un probleme.
    Si j'ai bien compris, l'attribut de union qui sera le seul à etre apelé est celui qui occupe le plus d'espace.
    Pas tout-à-fait : une union est en fait une « structure » dont tous les membres occuperaient le même espace mémoire. La taille de l'union est donc égale à celle du membre le plus grand (modulo un éventuel bourrage).

    ps : si mon intuition dit juste, a quoi bon utiliser union au lieu de struc?
    L'idée est que tu n'utilises qu'un seul membre… à la fois ! C'est pratique lorsque, par exemple, une fonction doit retourner un objet dont le type n'est pas toujours le même selon la situation.

    Un cas typique est la transmision d'événements dans les interfaces graphiques, par exemple avec la XLib : tu peux définir un type « Event » qui est en fait l'union de tous les types d'événements possibles : MouseEvent, ButtonEvent, KeyboardEvent, etc. Dès lors que tu sais quel genre d'événement tu as reçu, tu peux directement aller chercher les informations qui lui sont propres.

  3. #3
    Membre éclairé
    Inscrit en
    Septembre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Septembre 2007
    Messages : 267
    Par défaut
    ok c'est plus claie maintenant, je te remercie

    comment plusieurs attribut peuvent occuper le meme espace. Un champ de mémoire serait subdivisable? j'arrive pas a m'imaginer ca

  4. #4
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Salut,

    Citation Envoyé par FoX_*D i E* Voir le message
    comment plusieurs attribut peuvent occuper le meme espace. Un champ de mémoire serait subdivisable?
    Il n'y a pas plusieurs attributs. Quand tu créées une union, c'est pour un objet d'un type précis choisi par toi dans l'union bien sûr, mais un seul à la fois. Dans un event de type click de souris, il ne faut pas s'attendre à trouver des infos valides sur un event clavier.

    A+

    Pfeuh

  5. #5
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    c'est pas clair votre explication.

    Un exemple du principe. Supposons l'union suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    union U {
    int alpha;
    long beta;
    char gamma;
    };
     
    union U u;
    alors, nous avons les propriétés suivantes.
    • u.alpha, u.beta et u.gamma ont la même adresse, qui est d'ailleurs l'adresse de u.
    • sizeof(u) = max( sizeof(u.alpha), sizeof(u.beta), sizeof(u.gamma))
    • comme les champs ont la même adresse, ils partagent le même contenu binaire

  6. #6
    Membre éclairé
    Avatar de Captain'Flam
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 273
    Billets dans le blog
    1
    Par défaut
    Si je puis me permettre d'en rajouter une couche,
    voici un petit code qui permet de regarder à quoi ressemble un double :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    union U 
        {
        double d ;
        unsigned char b [sizeof( double )] ;
        };
     
    int i ;
    U u ;
    u.d = 3.1415927 ;
    for ( i = 0 ; i < sizeof( double ) ; ++i )
        printf(" %02X",u.b[i] ) ;
    Bien sûr, tu pourrais faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    double x = 3.1415927 ;
    unsigned char * b = (unsigned char*)&x ;
    for ( i = 0 ; i < sizeof( double ) ; ++i )
        printf(" %02X",b[i] ) ;
    mais c'est moins classe !

    Une union, outre le gain de place, permet de faire des transtypages un peu moins crades.
    Mais attention, en règle générale, les unions sont dangereuses et à proscrire !
    Avoir 2 (ou +) variables au même emplacement mémoire, c'est un peu casse-gueule !
    Personnellement, depuis que la mémoire n'est plus une denrée rare, je ne m'en sers plus jamais.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 20/05/2015, 17h45
  2. Réponses: 16
    Dernier message: 26/06/2012, 16h57
  3. union versus struct
    Par gerald3d dans le forum C
    Réponses: 7
    Dernier message: 08/05/2012, 08h52
  4. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25

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