Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 15 sur 15
  1. #1
    Membre du Club
    Inscrit en
    septembre 2007
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 27

    Informations forums :
    Inscription : septembre 2007
    Messages : 234
    Points : 64
    Points
    64

    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
    5 377
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : septembre 2007
    Messages : 5 377
    Points : 12 642
    Points
    12 642

    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 du Club
    Inscrit en
    septembre 2007
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 27

    Informations forums :
    Inscription : septembre 2007
    Messages : 234
    Points : 64
    Points
    64

    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
    Inscrit en
    mars 2006
    Messages
    838
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : mars 2006
    Messages : 838
    Points : 1 064
    Points
    1 064

    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 Confirmé Sénior
    Homme Profil pro Pierre
    Ingénieur développement logiciels
    Inscrit en
    juin 2007
    Messages
    1 967
    Détails du profil
    Informations personnelles :
    Nom : Homme Pierre
    Localisation : France

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

    Informations forums :
    Inscription : juin 2007
    Messages : 1 967
    Points : 4 146
    Points
    4 146

    Par défaut

    c'est pas clair votre explication.

    Un exemple du principe. Supposons l'union suivante:
    Code :
    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
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • La plus sotte des questions est celle qu'on ne pose pas.

    Pour faire des graphes, essayez yEd.

  6. #6
    Membre actif
    Avatar de Captain'Flam
    Profil pro anciennement "sopsag"
    Inscrit en
    février 2011
    Messages
    163
    Détails du profil
    Informations personnelles :
    Nom : anciennement "sopsag"

    Informations forums :
    Inscription : février 2011
    Messages : 163
    Points : 180
    Points
    180

    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 :
    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 :
    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.
    Captain'Flam
    anciennement Sopsag, aka Hadrien
    Win seven 64 / Visual 2010 / Python 2.7 / Eclipse

  7. #7
    Membre du Club
    Inscrit en
    septembre 2007
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 27

    Informations forums :
    Inscription : septembre 2007
    Messages : 234
    Points : 64
    Points
    64

    Par défaut

    ok, je n'ai plus qu'a étudier ce qu'est une adresse mémoire en C, et j'aurais compris à 100%

    je vous remercie pour vos réponses

  8. #8
    Expert Confirmé Sénior Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    23 920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2005
    Messages : 23 920
    Points : 31 965
    Points
    31 965

    Par défaut

    En gros, il y a deux usages principaux des unions:

    L'un est le "union-cast" montré par Captain'Flam, où l'on écrit en tant qu'un membre et on lit en tant qu'un autre. Il n'y a pas grand-chose ici qui soit garanti portable.

    L'autre usage est pour économiser de l'espace, ou un paramètre de fonction. Imagine une fonction qui peut prendre en paramètre soit un entier, soit une chaîne de caractères.
    Code C :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    /*
    Exemple de "tagged union"
    */
    #include <stdio.h>
     
    enum union_type
    {
    	U_STRING,
    	U_NUMBER
    };
     
    /* La structure contient deux membres:
    Une union et une valeur indiquant quel membre a été réglé. */
    typedef struct tagged_union
    {
    	enum union_type type;
    	union
    	{
    		char const * string;
    		int number;
    	} u;
    } TAGGED_UNION;
     
    void Afficher(TAGGED_UNION tu)
    {
    	switch(tu.type)
    	{
    	case U_STRING: puts(tu.u.string); break;
    	case U_NUMBER: printf("%d\n", tu.u.number); break;
    	}
    }
     
    int main(void)
    {
    	TAGGED_UNION tu;
    	tu.type = U_STRING;
    	tu.u.string = "Bonjour!";
    	Afficher(tu);
    	return 0;
    }
    Normalement, ce code devrait être safe et portable, vu qu'on lit toujours l'union par le même membre qu'à son écriture.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre du Club
    Inscrit en
    septembre 2007
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 27

    Informations forums :
    Inscription : septembre 2007
    Messages : 234
    Points : 64
    Points
    64

    Par défaut

    Ah, la je comprend moins bien ^^

    Est ce que ce que a dit leternel est correcte?

    Je viens de finir le tuto sur C, et je commence celui de C++
    Alors vous pourrez observer mes postes sur le forum C++ débuter à l'occasion.

    ciao bonsoir

  10. #10
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    septembre 2007
    Messages
    5 377
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : septembre 2007
    Messages : 5 377
    Points : 12 642
    Points
    12 642

    Par défaut

    Comme on te l'a dit plus haut, il s'agit simplement de faire en sorte que tous les membres d'une union partagent le même espace mémoire. Donc, quand tu remplis l'un d'eux, tu écrases forcément les autres.

    Une union est utile lorsque le type d'un paramètre à transmettre ou à renvoyer peut varier d'une situation à l'autre. Ça donne la possibilité au programme de choisir le champ adéquat en fonction des circonstances tout en permettant au compilateur de maintenir la contrainte de type, plutôt que de recourir à un transtypage « (void *) » jamais très propre.

    C'est déjà pratique en soi lorsqu'il s'agit de types natifs tels que float, int ou pointeurs, mais ça devient crucial lorsque les membres sont eux-mêmes d'autres structures ou unions : il est alors nécessaire qu'ils soient définis comme tels pour que le programme puisse se référer à leurs champs.

  11. #11
    Membre du Club
    Inscrit en
    septembre 2007
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 27

    Informations forums :
    Inscription : septembre 2007
    Messages : 234
    Points : 64
    Points
    64

    Par défaut

    ok, I understand now,

    Je vous remercie de vos réponses.
    Je vais essayer de placer quelque union dans mes ancien projet, pour voir ce que ca donne.

    je vous souhaite de bonne fêtes

  12. #12
    Expert Confirmé Sénior
    Homme Profil pro Pierre
    Ingénieur développement logiciels
    Inscrit en
    juin 2007
    Messages
    1 967
    Détails du profil
    Informations personnelles :
    Nom : Homme Pierre
    Localisation : France

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

    Informations forums :
    Inscription : juin 2007
    Messages : 1 967
    Points : 4 146
    Points
    4 146

    Par défaut

    merci, toi aussi!

    Par contre, la démarche "le C d'abord, le C++ après" n'est pas forcément la meilleure idée.
    Il y a des choses obligatoires en C qui sont à bannir en C++ (notamment dans la gestion de la mémoire).

    Cependant, oui, il vaut mieux comprendre les outils de bases en premier.

    A part la syntaxe, l'apport de l'objet en C++ fait de ce dernier un langage fondamentalement différent du C
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • La plus sotte des questions est celle qu'on ne pose pas.

    Pour faire des graphes, essayez yEd.

  13. #13
    Membre du Club
    Inscrit en
    septembre 2007
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 27

    Informations forums :
    Inscription : septembre 2007
    Messages : 234
    Points : 64
    Points
    64

    Par défaut

    Bin en fait dans le cours de C++ que voici :
    http://cpp.developpez.com/cours/polyCpp/

    L'auteur dit explicitement que le C doit etre acqui avant de se plonger dans son tuto, alors les tuto que j'étudie sont:

    Le langage C
    Le langage C++
    Le C++ pour les pros

  14. #14
    Expert Confirmé Sénior Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    23 920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2005
    Messages : 23 920
    Points : 31 965
    Points
    31 965

    Par défaut

    Ça dépend des cours. Un cours basé sur le C te fera prendre/gardr des mauvaises habitudes s'il n'est pas exceptionnellement bon et exceptionnellement clair sur les pratiques C à oublier en C++.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  15. #15
    Expert Confirmé Sénior
    Homme Profil pro Pierre
    Ingénieur développement logiciels
    Inscrit en
    juin 2007
    Messages
    1 967
    Détails du profil
    Informations personnelles :
    Nom : Homme Pierre
    Localisation : France

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

    Informations forums :
    Inscription : juin 2007
    Messages : 1 967
    Points : 4 146
    Points
    4 146

    Par défaut

    Quand, dans le cours, il parle du C, j'imagine qu'il parle des bases (que j'étudierais dans cet ordre):
    • syntaxe
    • types de base
    • compréhension du processus de compilation
    • la virgule flottante et son imprécision inhérente (pourquoi 1.0+0.1!=1.1)
    • fonctions
    • tableaux
    • le cas particulier de la chaîne de caractères
    • structures
    • pointeurs
    • un aperçu du préprocesseur
    • unions


    Les subtilités du C ne sont pas utiles, voire contre-productives, pour le C++.
    Je pense par exemple à toutes les fonctions de manipulation de chaînes (str...).
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • La plus sotte des questions est celle qu'on ne pose pas.

    Pour faire des graphes, essayez yEd.

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •