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 :

champs de structure


Sujet :

C++

  1. #1
    Membre confirmé Avatar de coax81
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 180
    Par défaut champs de structure
    bonjour,
    je comprend pas ce que veulent dire les :4 :2 devant les champs ?

    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
     
    struct OmTcData {
        // Byte 0:
        // Frame number (units):
        uint framesUnits:4;
        // Binary group 1:
        uint binaryGroup1:4;
        // Byte 1:
        // Frame number (tens):
        uint framesTens:2;
        // TRUE ==> drop-frame, FALSE ==> non-drop-frame, for FldRate59_94Hz;
        // reserved, for FldRate50Hz:
        uint dropFrame_59_94:1;
        // Color-frame marker:
        uint colorFrame:1;
        // Binary group 2:
        uint binaryGroup2:4;
        }

  2. #2
    Membre éprouvé Avatar de amaury pouly
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    157
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 157
    Par défaut
    Cela veut dire que tu créé un champ de bit, le indique que la variable tient sur x bit. Ainsi cela permet de *découper* un entier en plusieurs morceaux de y bits.

  3. #3
    Membre confirmé Avatar de coax81
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 180
    Par défaut
    mais quand je fais :
    ce la veu dire que framesUnits est de taille 4 bits , ou bien de taille 4* uint ??

  4. #4
    screetch
    Invité(e)
    Par défaut
    4 bits

    c'est un indice au compilateur, ce n'est pas forcement supporte il me semble, mais dans la mesure du possible il essayera d'allouer 4 bits pour ce champ et de laisser de la place pour le reste derriere.

  5. #5
    Membre éprouvé Avatar de amaury pouly
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    157
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 157
    Par défaut
    en fait quand tu fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TYPE var : TAILLE;
    Cela veut dire que var est un morceau de TYPE de taille TAILLE bits.
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    struct St
    {
      // commence un entier 32-bit que l'on va découper en deux morceaux pour simplifier son accès.
      uint partie1 : 16;
      uint partie2 : 16;
      // commence un entier 16-bit que l'on va découper
      ushort partie3 : 4;
      ushort partie4 : 12;
    };
    Je ne sais pas si c'est très clair...

  6. #6
    screetch
    Invité(e)
    Par défaut
    ca ne marche qu'avec (unsigned) int je crois.

    doc de PC-Lint :

    46 Field type should be int -- Bit fields in a structure
    should be typed unsigned or int. If your compiler allows
    other kinds of objects, such as char, then simply suppress
    this message.

  7. #7
    Membre éprouvé
    Inscrit en
    Mai 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2007
    Messages : 157
    Par défaut
    ca revient un peu a faire une union d'element dans le principe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    typedef union
    {
        struct {
            WORD IP_Dst_Cte_field;
            WORD IP_Dst_link;
        } detail;
        DWORD IP_Dst_Add;
    }IP_DEST_ADD;

  8. #8
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Et bien non justement, d'après ce que je comprends de ce qui a été dis plus haut, tous les champs de la structure seront utilisables en même temps, ce qui n'est pas vrai pour l'union. J'imagine par contre que cela engendre une petite perte de rapidité à l'utilisation, mais on gagne en espace mémoire ?

  9. #9
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut,

    A non, une union, c'est permettre à une même valeur d'être représentée de manière différente:

    Si on considère qu'un int (32 bits) fait quatre char (8 bit) et qu'un double en fait 8 (64 bits), on peut écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    union MyUnion
    {
        char caract;
        int entier;
        double reel;
    };
    Ce qui fera que, quand tu déclarera une variable de de type MyUnion, sa taille sera la taille nécessaire à la représentation de l'élément le plus grand (ici, la taille d'un double ) mais que tu peux envisager de ne mettre que les 8 bits d'un char ou que les 16 d'un int (en "perdant" l'espace restant) et que tu accepte d'envisager le fait que l'on puisse convertir n'importe quel type en un autre, en perdant une information si la taille du type d'origine est plus importante que celle du type de destination.

    Par contre, le bitfield va permettre au compilateur d'organiser un peu mieux la mémoire:

    Si tu n'a besoins que de, mettons, 8 fois 2 bits - ce qui, l'un dans l'autre, en fait 16, soit la taille (sur mon architecture) d'un int:

    Si tu crées une structure du genre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    struct MaStruct
    {
        int /* ou char, car deux bits tiennent dans un char*/ var1;
        int var2;
        int var3;
        int var4;
        int var5;
        int var6;
        int var7;
        int var8;
    };
    la taille totale de la structure sera de... 8* la taille d'un int =8*16 bits=128bits (ou 8 fois la taille d'un char= 8 * 8 bits=64 bits)... tout cela pour n'en utiliser... que 16

    Ca fait pas mal de place perdue

    Par contre, si tu travaille avec un bitfield, sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    struct Mastruct2
    {
        int var1:2;
        int var2:2;
        int var3:2;
        int var4:2;
        int var5:2;
        int var6:2;
        int var7:2;
        int var8:2;
    };
    le compilateur saura qu'il doit "découper" la mémoire en tranche de deux bits, et donc, qu'il peut faire tenir les 8 variables... sur la taille d'un int comme le montre le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int main()
    {
        cout<<"taille de Mastruct "<<sizeof(MaStruct)<<endl
            <<"taille de MaStruct2 "<<sizeof(Mastruct2)<<endl
            <<"taille d'un int "<<sizeof(int )<<endl;
        return 0;
    }
    si tu déclares les deux structures ci-dessus
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. erreur de segmentation sur affectation champ enum structure
    Par marion5515 dans le forum Débuter
    Réponses: 9
    Dernier message: 24/02/2010, 11h51
  2. Changer les variables d'un champ de structure
    Par elemarec dans le forum MATLAB
    Réponses: 2
    Dernier message: 14/08/2009, 17h18
  3. Enregistrement d'un champ de structure
    Par Bktero dans le forum MATLAB
    Réponses: 2
    Dernier message: 31/07/2009, 11h50
  4. Réponses: 8
    Dernier message: 13/11/2008, 21h28
  5. Réponses: 2
    Dernier message: 18/12/2006, 18h03

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