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 :

structures et unions ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de jbarreau-mainson
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    446
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 446
    Par défaut structures et unions ?
    Bonjour à tous,

    Peut on eclairer ma lenterne sur les unions s'il vous plait ?!

    J'ai fait le tour des cours sur le site mais je suis un peu dans le flou.

  2. #2
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    T'es sûr d'avoir bien cherché ?

    Structures, unions et énumérations.

  3. #3
    Membre chevronné Avatar de jbarreau-mainson
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    446
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 446
    Par défaut
    Citation Envoyé par jbarreau-mainson
    J'ai fait le tour des cours sur le site mais je suis un peu dans le flou.
    Oui c'est le cours que j'avais vu.
    Mais je ne vois pas trop à quoi cela sert ou plutot comment s'en servir...

  4. #4
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Tu ne sais pas t'en servir ou tu ne vois pas leurs utilités ? Dans le premier cas je ne vois pas ce que je pourrai faire pour toi car il y a déjà des exemples dans le cours il me semble. Dans le deuxième cas, tu n'as juste pas encore assez d'expérience pour te rendre compte de leur utilité. Ne brusque pas les choses, ça viendra avec le temps. Ou bien j'ai encore mal compris la question ?

  5. #5
    Membre chevronné Avatar de jbarreau-mainson
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    446
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 446
    Par défaut
    Eh bien en fait je ne voit pas la difference avec une structure, mis à part le fait que les champs d'une union partagent le même espace mémoire.

    J'ai en fait un long qui a une valeur forcée, j'affiche la valeur de ce long à travers ce code :

    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
     
     
    typedef unsigned char uchar;
     
    int main()
    {
        long lg;
        lg = 0x12345678;
        uchar *pc;
     
        write(1,"lg = ", 5);
        for(pc = (uchar *)(&lg);pc < (uchar *)(&lg + 1); pc++)
        {
            printf("%.2X ", 0xFF&(*pc));
        }
    }
    Et j'aimerais à partir de là pouvoir déterminer msw, lsw, lsb et msb.
    On m'impose d'utiliser struct et union mais je bloque un peu ...

    Je pensais me diriger vers 3 struct :

    1 long lng; // Mot entier
    2 short shrt; // MSW & LSW
    1 char tab[3]; // Tab de 4 éléments : (lsb et msb)*2

    Je ne sais pas si c'est très clair

  6. #6
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Eh bien en fait je ne voit pas la difference avec une structure, mis à part le fait que les champs d'une union partagent le même espace mémoire.
    Bin volià la différence ! Dans une structure, les champs ne se chevauchent pas. Dans une union, on ne peut "activer" qu'un champ à chaque utilisation de l'union.

    Pour ce qu'on te demande de faire, c'est ta méthode qui est la bonne car portable (mais dans tous les cas on ne peut savoir si le premier octet est le msb ou le lsb qu'en sachant la plateforme sur laquelle on est. sur un processeur x86, premier octet en mémoire = lsb). Tu peux faire une version non portable en utilisant les unions avec la méthode que je vais te montrer un peu plus bas. L'idée c'est d'aller faire quelque chose comme ceci :
    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
    typedef struct bbbb_s {
        unsigned char b0;
        unsigned char b1;
        unsigned char b2;
        unsigned char b3;
    } BBBB;
     
    ...
     
    long lg = 0x12345678;
    BBBB b;
     
    // Sachant qu'un long fait 4 octets et un BBBB tout de même,
    // on peut copier tous les bits de lg vers b et lire facilement
    // le msb, le lsb, etc.
     
    memcpy(&b, &lg, 4);
     
    printf("lsb = %.2x\n", b.b0);
    printf("msb = %.2x\n", b.b3);
    L'utilisation d'une union permet de ne pas avoir à faire un memcpy.

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    #include <stdio.h>
     
    typedef struct bbbb_s {
        unsigned char b0;
        unsigned char b1;
        unsigned char b2;
        unsigned char b3;
    } BBBB;
     
    typedef struct ww_s {
        unsigned short w0;
        unsigned short w1;
    } WW;
     
    union lng
    {
        long lg;
        BBBB b;
        WW w;
    };
     
    int main()
    {
        union lng u;
     
        u.lg = 0x12345678;
     
        printf("lsb = %.2x\n", u.b.b0);
        printf("msb = %.2x\n", u.b.b3);
        printf("lsw = %.2x\n", u.w.w0);
        printf("msw = %.2x\n", u.w.w1);
     
        return 0;
    }

  7. #7
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par jbarreau-mainson Voir le message
    Eh bien en fait je ne voit pas la difference avec une structure, mis à part le fait que les champs d'une union partagent le même espace mémoire.
    Pour la réponse à ton problème, voir plus haut.

    Pour l'utilité, en voici un mini-exemple..

    Soit une donnée que tu manipules, qui peut prendre n'importe quelle valeur int, long, float, double, char.

    Si tu veux faire un "objet" ayant cette valeur, et le manipuler de manière "transparente", tu as 2 choix..

    Structure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    typedef struct _pValue {
     
        int    i ;
        long   l ;
        float  f ;
        double d ;
        char   c ;
     
    } Value ;
    Union :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    typedef union _pValue {
     
        int    i ;
        long   l ;
        float  f ;
        double d ;
        char   c ;
     
    } Value ;

    Dans le premier cas, la taille sera la somme des tailles (au moins), dans le second la plus grande (sizeof(double) ).

    Si donc tu n'as pas besoin d'optimisation, ou que ta "modélisation" est peu importante, la structure marche bien.

    Si par contre tu as (auras) beaucoup d'objets en mémoire, et/ou que ta "modélisation" (objet) est importante, tu prendras l'union, qui demande beaucoup moins de mémoire et qui est plus "object-like"...


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

Discussions similaires

  1. Structure et Union
    Par Ryu2000 dans le forum Débuter
    Réponses: 2
    Dernier message: 12/02/2013, 11h27
  2. Structure et unions en C
    Par isildur37 dans le forum Débuter
    Réponses: 2
    Dernier message: 22/12/2009, 15h16
  3. structure, union et énumération
    Par ngalla dans le forum C
    Réponses: 3
    Dernier message: 14/03/2007, 10h34
  4. Structure, union et pointeur
    Par kikoo.plop dans le forum C
    Réponses: 10
    Dernier message: 18/12/2006, 19h21
  5. union de structure syntaxe
    Par al974 dans le forum C
    Réponses: 6
    Dernier message: 29/07/2006, 13h56

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