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 :

déclaration de champs de bits


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Informatique Senior
    Inscrit en
    Juin 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Informatique Senior

    Informations forums :
    Inscription : Juin 2006
    Messages : 108
    Par défaut déclaration de champs de bits
    Bonjour,

    Je viens de rencontrer une déclaration en C que je vois pour la première fois et que je comprends pas.
    La déclaration est la suivante :

    -------------Exemple de code--------------------
    struct foo {
    signed char x: 2;
    unsigned char : 1; /* pour l'alignement */
    signed char y: 3;
    signed char z: 2;
    };
    -------------------------------------------------

    Ce qui est nouveau pour moi, ce sont les ": x" qu'on met à la fin de chaque ligne de la struct?

    Quelqu'un peut-il m'éclairer ?

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Il s'agit de champs de bits: On indique quel nombre de bits prend chaque champ de la structure.

    Sauf que ça ne sert pratiquement à rien parce que l'implémentation n'est pas portable: Rien dans la norme ne te garantit l'ordre des différents champs d'une telle structure, tout dépend de l'implémentation.
    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.

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Informatique Senior
    Inscrit en
    Juin 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Informatique Senior

    Informations forums :
    Inscription : Juin 2006
    Messages : 108
    Par défaut champs de bits
    Mais à quoi sert de déterminer le nombre de bits que chaque champ de la structure doit prendre étant donné que on a déjà défini un type pour chaque champ et que chque type a une taille fixe du genre, un char sera codé sur un octet (voire 2 octets chépa... ).

    Si je déclare un char de la sorte

    ============Exemple de code====================
    ....
    unsigned char x : 2;
    ....
    =============================================

    Est-ce que dans ce cas x sera codé sur 2 bits ou bien sur un octet vu que c'est un char ?

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Est-ce que dans ce cas x sera codé sur 2 bits ou bien sur un octet vu que c'est un char ?
    x sera codé dans la structure sur 2 bits .
    Mais pour l'accès à ce champ, sa valeur sera convertie en un unsigned char.
    Autrement dit, en interne à la structure, il occupe 2 bits et vu de l'extérieur de la structure c'est un unsigned char.

  5. #5
    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 Médinoc Voir le message
    l'implémentation n'est pas portable: Rien dans la norme ne te garantit l'ordre des différents champs d'une telle structure, tout dépend de l'implémentation.
    Veux tu dire que dans l'exemple ci dessous, la valeur de JOYSTICK_KEY_UP n'est pas garantie? C'est une façon de faire que j'utilise souvent sans avoir constaté de problème.

    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
    #define JOYSTICK_NO_KEY       0x00
    #define JOYSTICK_KEY_UP       0x01
    #define JOYSTICK_KEY_DOWN     0x02
    #define JOYSTICK_KEY_RIGHT    0x04
    #define JOYSTICK_KEY_LEFT     0x08
    #define JOYSTICK_KEY_FIRE     0x10
     
    typedef unsigned char UByte;
     
    typedef union
    {
        UByte allbits;
        struct
        {
            UByte up:1;
            UByte down:1;
            UByte right:1;
            UByte left:1;
            UByte fire:1;
            UByte dummy:3;
        };
    }JOYSTICK_Register;
    A+

    Pfeuh

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Citation Envoyé par pfeuh Voir le message
    Salut,

    Veux tu dire que dans l'exemple ci dessous, la valeur de JOYSTICK_KEY_UP n'est pas garantie? C'est une façon de faire que j'utilise souvent sans avoir constaté de problème.
    C'est exactement ce que je veux dire. Ça peut être garanti par certaines plate-formes ou certains compilateurs, mais ça n'est pas garanti par la norme.
    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
    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
    Citation Envoyé par Médinoc Voir le message
    Il s'agit de champs de bits: On indique quel nombre de bits prend chaque champ de la structure.

    Sauf que ça ne sert pratiquement à rien parce que l'implémentation n'est pas portable: Rien dans la norme ne te garantit l'ordre des différents champs d'une telle structure, tout dépend de l'implémentation.
    Ca peut toujours servir à économiser de la mémoire . Mais je suis d'accord, il faut être maniac pour ça. De plus, unsigned char : x c'est déjà pas portable. La norme dit que pour créer des données de taille spécifiée en bits, il faut utiliser un int, signed ou unsigned. Mais une implémentation peut (c'est précisé par la norme) supporter d'autres types (comme unsigned char ...).

  8. #8
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Je pense que les champs de bits ont été inventés pour permettre aux développeurs de se coller exactement avec les composants électroniques.

    Car les électroniciens eux sont (ou tout au moins étaient) avares de la mémoire.

    Par exemple, sur le circuit de gestion du port parallèle, il y a 4 ou 5 flags qui remontent sur un seul registre de 8 bits. La notion de champs de bits permet dans ce cas d'accèder directement au flag voulu sans avoir à s'embêter avec des masques de bits.

    L'autre possibilité, c'est justement d'utiliser les masque de bits mais bon.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if((value & 0x80) == 0x80) // par exemple
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Je pense que les champs de bits ont été inventés pour permettre aux développeurs de se coller exactement avec les composants électroniques.

    Car les électroniciens eux sont (ou tout au moins étaient) avares de la mémoire.

    Par exemple, sur le circuit de gestion du port parallèle, il y a 4 ou 5 flags qui remontent sur un seul registre de 8 bits. La notion de champs de bits permet dans ce cas d'accèder directement au flag voulu sans avoir à s'embêter avec des masques de bits.
    C'est ce qui parait logique, mais si ça avait été le cas, ça aurait été normalisé, non?
    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.

Discussions similaires

  1. Champs de bits de taille dynamique
    Par Chop_chop dans le forum C++
    Réponses: 5
    Dernier message: 13/07/2007, 15h16
  2. champs de bits
    Par Nico_stras dans le forum C++/CLI
    Réponses: 6
    Dernier message: 31/01/2007, 12h37
  3. enum et champs de bits
    Par FamiDoo dans le forum C++
    Réponses: 12
    Dernier message: 12/07/2006, 13h22
  4. Champs de bit et affectation
    Par the_ionic dans le forum C
    Réponses: 11
    Dernier message: 09/06/2006, 16h13
  5. lire un champ de bit a partir d'un fichier
    Par loupdeau dans le forum MFC
    Réponses: 5
    Dernier message: 09/08/2005, 12h53

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