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 :

les structures de données en C


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Mars 2010
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 1
    Points : 1
    Points
    1
    Par défaut les structures de données en C
    bonjour tout le monde,
    j'ai quelques problèmes pour bien saisir les structures de données en C, à quoi peuvent servir les champs de bits exactement??les unions??
    merci de m'aider je débute en C et je compte bien y aller doucement mais surement
    merci

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Salut, bienvenue sur le forum. Je ne vais pas pouvoir t'aider car je ne connais pas la réponse précise à tes questions. En revanche, pour les unions, j'ai lu à plusieurs reprises que c'est à éviter.

    N'as-tu rien trouvé sur google ou sur la Faq C ?

  3. #3
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Hoe,
    Citation Envoyé par salseropom Voir le message
    Salut, bienvenue sur le forum. Je ne vais pas pouvoir t'aider car je ne connais pas la réponse précise à tes questions. En revanche, pour les unions, j'ai lu à plusieurs reprises que c'est à éviter.

    N'as-tu rien trouvé sur google ou sur la Faq C ?
    Je n'en dirais pas autant, ça peut servir parfois.

    Par contre, il est clair qu'il faut savoir ce que l'on fait (mais comme c'est toujours vrai ).
    Si les cons volaient, il ferait nuit à midi.

  4. #4
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    859
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 859
    Points : 714
    Points
    714
    Par défaut
    Les unions permettent à plusieurs structure de partager la même zone mémoire.
    Ceci peut être utile si:
    - l'on n'a pas beaucoup de mémoire.
    - l'on désire gérer sa structure en tant que buffer (afin de l'envoyer vers un fichier ou un périphérique). Dans ce cas on peut faire une union entre une structure et un tableau d'octet.
    - ...
    Si tu ne vis pas ce que tu penses alors tu penses ce que tu vis.

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 370
    Points : 23 625
    Points
    23 625
    Par défaut
    Citation Envoyé par octobre_22 Voir le message
    à quoi peuvent servir les champs de bits exactement? les unions ?
    Les champs de bit dans une structure sont le « seul » moyen de descendre en dessous du niveau de l'octet et de contrôler exactement, au bit près, la taille des champs de ta structure. Les champs de bits te permettent alors de « partitionner » l'intérieur d'un de tes membres. Par exemple, un « unsigned int » fait généralement 32 bits, soit 4 octets, sur les machines actuelles (32 bits elles aussi). Donc :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct _bit
    {
        unsigned int a : 3;
        unsigned int b : 5;
        unsigned int c : 24;
    };

    La structure ci-dessus contient exactement un seul « unsigned int », et mesure donc 4 octets. Cependant, le champ « a » ne concerne que les bits 0 à 2 de cet entier, le champ « b » les bit 3 à 7, et « c » les bits 8 à 31 (donc tous les autres).

    Il arrive fréquemment qu'une variable de type « entier non signé » serve en fait à recevoir des flags. Dans ce cas, l'approche la plus courante consiste à manipuler cette variable avec des symboles #define et des opérations logiques. Le faire avec les champs de bits te permet de manipuler ces flags directement et individuellement, sans gérer la logique toi-même. Ça devient surtout intéressant quand ces champs font plus d'un bit de large et que leur valeur a une signification arithmétique : tu n'es plus obligé de d'isoler les bits toi-même et de les ramener à la main vers la droite.



    En ce qui concerne les unions, ce n'est pas du tout un modèle à proscrire, bien au contraire. Il s'agit d'un modèle qui se comporte exactement comme une structure, mais dont tous les membres occupent la même position mémoire. Ça veut donc dire que tu ne peux utiliser qu'un seul membre à la fois (puisque son contenu écrase celui des autres) mais également que la taille de l'union se résume à celle du membre le plus grand.

    C'est extrêmement utile lorsque tu dois transmettre des informations dont le type peut être variable. Par exemple, on peut imaginer une fonction qui, selon les cas, te renvoie soit un entier, soit une chaîne de caractère. Tu ne peux pas déclarer une fonction qui soit des deux types à la fois. Par contre, elle peut être du type de ton union.

    Ça devient franchement utile lorsque tu as non pas, quatre ou cinq, mais des centaines de champs, ou lorsque ces champs sont eux-mêmes des structures. Le système X-Window (le système d'interface graphique des unixoïdes) utilise comme beaucoup d'autres, un système d'événements, chaque événement étant un message envoyé à qui veut l'entendre lorsque qu'il se passe quelque chose, tel qu'un mouvement de souris, un clic, la fermeture d'une fenêtre, etc.

    Chaque événement est une structure qui contient toutes les informations le concernant (par exemple, dans le cas d'un clic, tu auras le numéro du bouton et les coordonnées de la zone cliquée). Naturellement, chaque structure est propre à l'événement qu'elle décrit.

    On comprend alors qu'une fonction doit être capable de lire, d'émettre ou de recevoir en argument n'importe quel type d'événement. On comprend également qu'une « structure de structure » formerait un type immense et majoritairement vide. La solution la plus naturelle est donc l'union, puisque chaque événement n'est que d'un seul type à la fois :

    Code C : 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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    /*      The XEvent structure is a union of the individual structures declared for each event type : */
           typedef union _XEvent {
                int type;                /* must not be changed */
                XAnyEvent xany;
                XKeyEvent xkey;
                XButtonEvent xbutton;
                XMotionEvent xmotion;
                XCrossingEvent xcrossing;
                XFocusChangeEvent xfocus;
                XExposeEvent xexpose;
                XGraphicsExposeEvent xgraphicsexpose;
                XNoExposeEvent xnoexpose;
                XVisibilityEvent xvisibility;
                XCreateWindowEvent xcreatewindow;
                XDestroyWindowEvent xdestroywindow;
                XUnmapEvent xunmap;
                XMapEvent xmap;
                XMapRequestEvent xmaprequest;
                XReparentEvent xreparent;
                XConfigureEvent xconfigure;
                XGravityEvent xgravity;
                XResizeRequestEvent xresizerequest;
                XConfigureRequestEvent xconfigurerequest;
                XCirculateEvent xcirculate;
                XCirculateRequestEvent xcirculaterequest;
                XPropertyEvent xproperty;
                XSelectionClearEvent xselectionclear;
                XSelectionRequestEvent xselectionrequest;
                XSelectionEvent xselection;
                XColormapEvent xcolormap;
                XClientMessageEvent xclient;
                XMappingEvent xmapping;
                XErrorEvent xerror;
                XKeymapEvent xkeymap;
                long pad[24];
           } XEvent;

    Les différentes structures, individuellement, ont une taille qui peut aller de 20 octets (pour XAnyEvent ou XErrorEvent) à 68 octets (pour XCrossingEvent). On voit aussi que le champ « pad » sert à réserver de la place et à garantir une taille fixe. L'union XEvent fait donc 96 octets de long, alors qu'une structure de structure en ferait 1176 : douze fois plus gros !

    Mais une union n'a pas qu'un rôle économique : il est surtout sémantique. Une structure sert à définir un type composite, formé de chacun de ses membres. Une union sert à définir l'instance d'une variable dont le type peut être un de ceux listés dans l'union.

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Le problème des champs de bits, c'est qu'ils ne sont pas portables: La norme ne définit pas comment les champs sont effectivement organisés, tu ne peux donc pas t'en servir pour faire un pilote "universel" pour un certain matériel (par exemple, un pilote pour interface RS232 qui marcherait n'importe où).

    Pour ce genre de choses, les décalages de bits marchent mieux.
    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.

  7. #7
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Le problème des champs de bits, c'est qu'ils ne sont pas portables: La norme ne définit pas comment les champs sont effectivement organisés, tu ne peux donc pas t'en servir pour faire un pilote "universel" pour un certain matériel (par exemple, un pilote pour interface RS232 qui marcherait n'importe où).
    Typiquement, l'ordre de déclaration des éléments unitaires du bitfield sont inversés entre Visual Studio et un GCC pour machine big-endian...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

Discussions similaires

  1. Question sur les structures de données
    Par sliderman dans le forum Débuter
    Réponses: 8
    Dernier message: 16/07/2008, 20h40
  2. les structures de données
    Par nawal.02 dans le forum Débuter
    Réponses: 3
    Dernier message: 04/05/2008, 11h26
  3. Besoin d'aide pour les structures de données dynamiques
    Par aurelie689 dans le forum Pascal
    Réponses: 3
    Dernier message: 26/12/2007, 21h29

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