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 :

Variables dans une structure


Sujet :

C++

  1. #1
    Membre habitué Avatar de Kromagg
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2008
    Messages : 275
    Points : 198
    Points
    198
    Par défaut Variables dans une structure
    Bonjour,

    Je suis tombé sur ce bout de code et je ne comprend pas ce que signifie le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    struct Color565
    {
    	uint16 B:5;
    	uint16 G:6;
    	uint16 R:5;
    };
    A quoi est-ce que ça sert ?
    C'est dans ses rêves que l'homme trouve la liberté cela fut, est et restera la vérité! (John Keating - Le cercle des poètes disparus)

  2. #2
    Membre éclairé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2007
    Messages : 373
    Points : 764
    Points
    764
    Par défaut
    Bonjour,

    Il s'agit d'un bitfield : voir ce cours C++ de Développez, ou pour plus d'info ce cours C.
    Dans ton cas, ça permet de définir un format de couleur dans lequel le bleu et le rouge ne sont codés que sur 5 bits, alors que le vert est codé sur 6 bits. La couleur est donc codée au total sur 16 bits, soit seulement 2 octets. Sans les bitfields, tu ne pourrais avoir que des canaux de 8 bits (donc le type std::uint8_t, généralement unsigned char), donc une couleur codée sur 24 bits (3 octets). L'alternative serait de déclarer la couleur comme un entier de type std::uint16_t (généralement short) et de gérer manuellement les bits :
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    #include <iostream>
    #include <cstdint>
     
    struct Color565 {
        std::uint16_t B:5; // maximum: 2^5 - 1 = 31 = 0x1f
        std::uint16_t G:6; // maximum: 2^6 - 1 = 63 = 0x3f
        std::uint16_t R:5; // maximum: 2^5 - 1 = 31 = 0x1f
    };
     
    void print_color(Color565 c) {
        std::cout << c.B << ", " << c.G << ", " << c.R << std::endl;
    }
     
    using ManualColor565 = std::uint16_t;
     
    void print_manual_color(ManualColor565 mc) {
        std::cout <<
            (mc & 0x1f) << ", " <<
            ((mc >> 5) & 0x3f) << ", " <<
            ((mc >> (5+6)) & 0x1f) << std::endl;
    }
     
    int main(int argc, char* argv[]) {
        std::cout << sizeof(Color565)       << std::endl;
        std::cout << sizeof(ManualColor565) << std::endl;
     
        Color565 c;
        c.B = 12;
        c.G = 52;
        c.R = 30;
     
        print_color(c);
     
        ManualColor565& mc = *reinterpret_cast<ManualColor565*>(&c);
     
        print_manual_color(mc);
     
        mc = 0;
        mc |= 20 << 0;
        mc |= 15 << 5;
        mc |= 2  << (5+6);
     
        print_manual_color(mc);
        print_color(c);
     
        return 0;
    }

  3. #3
    Membre habitué Avatar de Kromagg
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2008
    Messages : 275
    Points : 198
    Points
    198
    Par défaut
    Merci c'est plus clair maintenant
    C'est dans ses rêves que l'homme trouve la liberté cela fut, est et restera la vérité! (John Keating - Le cercle des poètes disparus)

  4. #4
    Membre éclairé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2007
    Messages : 373
    Points : 764
    Points
    764
    Par défaut
    Ah zut, tu as été trop rapide. J'ai ajouté quelques explications plus spécifiques à ton cas dans mon premier post.

  5. #5
    Membre habitué Avatar de Kromagg
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2008
    Messages : 275
    Points : 198
    Points
    198
    Par défaut
    Citation Envoyé par Kalith Voir le message
    Ah zut, tu as été trop rapide. J'ai ajouté quelques explications plus spécifiques à ton cas dans mon premier post.
    Je reviens sur les lieux du crime
    Les liens que tu m'as donné m'ont permis de bien comprendre mon exemple mais je te remercie pour cette précision
    C'est dans ses rêves que l'homme trouve la liberté cela fut, est et restera la vérité! (John Keating - Le cercle des poètes disparus)

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

Discussions similaires

  1. Ordre en mémoire des variables dans une structure
    Par guillaume-13015 dans le forum C
    Réponses: 8
    Dernier message: 12/03/2013, 16h52
  2. Réponses: 4
    Dernier message: 06/03/2008, 12h57
  3. Réponses: 2
    Dernier message: 30/11/2007, 14h14
  4. Réponses: 4
    Dernier message: 31/07/2007, 22h52
  5. [syntaxe] Gerer les variables dans une requete
    Par rastapopulos dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 15/04/2003, 13h53

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