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 bit et affectation


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 40
    Par défaut Champs de bit et affectation
    Bonjour, voici le problème.
    je programme un composant qui peut prendre différents modes, ces modes étant tous compatibles entre eux. Je veux de manière efficace pouvoir gérer ça.
    Je me suis donc dis dans ma petite tête, utilise un champ de bit couplé à des typedef sur les différents modes en s'arrangeant pour que chaque mode ait une valeur qui puissent l'identifier immédiatement dans le champs de bit.
    Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #define MODE_1           0x00000001 
    #define MODE_2           0x00000002
    #define MODE_3           0x00000004
    #define MODE_4           0x00000008
    Donc voila, on voit bien que mes 4 modes ont des représentations binaires qui permettent d'identifier et de coupler chacun des modes dans un champ de bits.
    En effet,
    MODE_1 vaut 0000 0001
    MODE_2 vaut 0000 0010
    MODE_3 vaut 0000 0100
    MODE_4 vaut 0000 1000

    Donc je déclare mon champ de bits:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    typedef struct {
        unsigned int b0_1         : 1;
        unsigned int b1_2         : 1;
        unsigned int b2_3         : 1;
        unsigned int b3_4         : 1;
        unsigned int b4_5         : 1;
        unsigned int b5_6         : 1;
        unsigned int b6_7         : 1;
        unsigned int b7_8         : 1;
    } BITFIELD ;
    Et voilà, mais maintenant je suis comme un guignol, je n'arrive pas à savoir comment de manière simple affecter un mode à un champ de bit que je déclare.
    Donc si je fais:
    BITFIELD my_bitfieldmode;
    Comment je fais pour gérer de manière simple si je veux dire que my_bitfieldmode fait le mode 1 et le mode 2?
    my_bietfieldmode = MODE_1; ça marche pas bien évidemment.

    Si quelqu'un a une idée, et j'aimerais pouvoir gérer ça comme ça, même si ça vous parait bête, mais je suis ouvert à tous autres solutions (même si c'est mon maitre de stage qui m'a dis plus ou moins de faire comme ça donc ça m'arrangerait de partir dans ce sens là). Merci d'avance

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par the_ionic
    je programme un composant <...> utilise un champ de bit
    Pas portable.

    http://emmanuel-delahaye.developpez....s.htm#bitfield

    même si c'est mon maitre de stage qui m'a dis plus ou moins de faire comme ça
    Change de boite...

  3. #3
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 40
    Par défaut
    Change de boite...
    Oui, je viens de poser ma démission, motif, les champs de bits ne sont pas portable... :-)


    Non mais bon, le terme composant que j'ai choisi est peut être un peu pompeux... j'ai vraiment besoin de le faire comme ça, et peut importe la portabilité ou pas. L'utilisation que j'en fais est plutôt une utisation interne comme expliqué dans le lien que tu m'as fournit.

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par the_ionic
    Non mais bon, le terme composant que j'ai choisi est peut être un peu pompeux... j'ai vraiment besoin de le faire comme ça, et peut importe la portabilité ou pas. L'utilisation que j'en fais est plutôt une utisation interne comme expliqué dans le lien que tu m'as fournit.
    Dans ce cas, tu peux définir les valeur possibles pour un mode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    enum
    {
       MODE_A,
       MODE_B,
       MODE_C,
       MODE_D,
       MODE_NB
    };
    soit 4 valeurs de 0 à 3, c'est à dire 00 à 11 en binaire. Il faut donc 2 bits :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    struct config
    {
       unsigned mode:2;
    };
    Ensuite, ca s'utilise comme ça (par exemple):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    {
       struct config mycfg;
       ...
       mycfg.mode = MODE_C;
       ...
       if (mycfg.mode == MODE_B)
       ...
    }

  5. #5
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    enum
    {
       MODE_A,
       MODE_B,
       MODE_C,
       MODE_D,
       MODE_NB
    };
    Je rajouterais que MODE_NB n'est PAS à utiliser dans un champs de bits mais pour savoir combien d'éléments se trouve dans l'enum... C'est une technique assez courante qui est bien pratique...

    PS: Que dit la norme sur les enums? Le premier élément commence forcément à 0? J'avais entendu qu'il fallait mieux mettre un =0 sur le premier pour l'expliciter...

    Jc

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par fearyourself
    PS: Que dit la norme sur les enums? Le premier élément commence forcément à 0?
    Oui.

  7. #7
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 40
    Par défaut
    C'est un début mais ce n'est pas exactement ce que je veux... en fait, tu vois, les modes peuvent être combinables.
    Comment on fait dans ton cas pour combiner le mode A et le mode C? on peut imaginer qu'on ajoute 0 à 2, donc ça nous donne 2.
    Or 2 corresponds au mode C, alors que moi j'aimerais pouvoir combiner A et C.
    D'ou l'intérêt de prendre des valeurs comme j'ai montré dans mon exemple qui permettent en binaire de pouvoir combiner tout les modes et d'identifier quelles combinaisons de mode est sélectionnée à l'aide du champ de bits.
    En effet, vu que mes valeurs sont 0000 0001, 0000 0010, 00000 01000 et 0000 1000, en combinant le tout dans un champ de bit en selectionnant plusieurs modes, on obtient bien des trucs différents.
    Donc en combinant ça avec le champ de bit, on voit immédiatement dans quel mode on est. Mon problème intervient pour remplir mon champs de bit (qui pour moi doit être composé de 4 bits) automatiquement en fonction de la valeur de mon mode.
    Si j'ai MODE_A selectionné, il va me mettre mon bit de poids faible à 1, si c'est B, le bit d'après à 1, ainsi de suite...

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par the_ionic
    les modes peuvent être combinables.
    Dans ce cas, tu utilises des masques :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #define MODE_A (1u << 0) /* bit 0 */
    #define MODE_B (1u << 1) /* bit 1 */
    #define MODE_C (1u << 2)
    #define MODE_D (1u << 3)
    etc.
    que tu combines comme tu veux avec des |. Tu n'as pas besoin des champs de bits qui ne sont pas faits pour ça...

    http://emmanuel-delahaye.developpez..../ed/inc/bits.h

  9. #9
    Membre chevronné
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Par défaut
    Et pourquoi pas une bonne vieille bidouille...
    Tu as besoin de 4 bits, un caractère te suffit et selon ta combinaison de mode, tu le charges avec des OU
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char valeur;
    ...
    valeur = MODE_1 | MODE_2; /* combinaison des mode 1 et 2 */
    mais je ne sais pas si j'ai compris ton problème...

  10. #10
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 40
    Par défaut
    Disons que ça me semble plus carré avec un champ de bits... et que je peux avoir plus que 4 modes.
    En fait à y réfléchir, ma question serait plus, comment passer un entier en notation binaire dans un tableau...
    En effet, si je ne m'abuse, lorsque je fais:
    #define mode_A 0x0000 0001

    mode_A est donc un int... si je pouvais récupérer la valeur de cette int sous la forme d'un tableau de bit (de longueur 8), alors ça serait résolu. Une petite boucle pour faire l'affectation de mon champ de bit est c'est bon.

  11. #11
    Membre chevronné
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Par défaut
    Si tu veux quelque chose de standard sur 1 octet, je te propose de te faire ton propre outil:
    - une variable caractère val
    - des fonctions d'accès:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    char getBit0(char val){
    return (val & 1);
    }
    char getBit1(char val){
    return (val & 2);
    }
    char getBit2(char val){
    return (val & 4);
    }
    etc...
    - des fonctions de chargement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void setBit0(char *val){
    *val |= 1;
    }
     
    void setBit1(char *val){
    *val |= 2;
    }
    etc...
    ou pour faire plus simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char getBit(char val, char numBit)
    et 
    void setBit(char *val, char numBit)

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

Discussions similaires

  1. champ de bits adressés sur port
    Par pouypouy47 dans le forum C
    Réponses: 2
    Dernier message: 14/08/2007, 17h44
  2. Champs de bits de taille dynamique
    Par Chop_chop dans le forum C++
    Réponses: 5
    Dernier message: 13/07/2007, 15h16
  3. champs de bits
    Par Nico_stras dans le forum C++/CLI
    Réponses: 6
    Dernier message: 31/01/2007, 12h37
  4. enum et champs de bits
    Par FamiDoo dans le forum C++
    Réponses: 12
    Dernier message: 12/07/2006, 13h22
  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