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

Langage C++ Discussion :

bitfield anonyme plus large que son type ?


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 219
    Par défaut bitfield anonyme plus large que son type ?
    [excusez moi, clavier US]

    Bonjour a tous,

    Je travaille sur la realisation d'une bibliotheque de mathematique vectoriel pour simplifier les ecritures des calculs, et j'utilise des bitfields anonymes dans des templates de strutures dont le type est determiner en meta programing pour sauter un nombre d'octet bien precis dans une structure. Je m'explique ...

    Ici ce trouve la partie meta programming, simplement pour determiner un type integer a partir de son sizeof :
    github - /src/cmath_typedefs.h
    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
     
        template <int ADDRESS_SIZE>
        struct MetaTypedef
        {
            typedef int32_t intX_t;
            typedef uint32_t uintX_t;
            typedef float32_t floatX_t;
        };
     
        template <>
        struct MetaTypedef<1>
        {
            typedef int8_t intX_t;
            typedef uint8_t uintX_t;
        };
     
        // and so on ...
    Ensuite je fait dans un template par exemple :
    github - /src/cmath_vec3.subs.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        template <typename TYPE>
        struct vec_xnyz
        {
            TYPE x;
            typename MetaTypedef <sizeof(TYPE)>::uintX_t : sizeof(TYPE) * 8; // on saute sizeof(TYPE) octets
            TYPE y;
            TYPE z;
     
            // fonctions
        };
    Ce qui me permet l'ecriture de vec4_t
    github - /src/cmath_vec4.h
    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
     
        template <typename TYPE>
        struct vec4_t
        {
            union
            {
                struct
                {
                    TYPE x;
                    TYPE y;
                    TYPE z;
                    TYPE w;
                };
     
                // [ ... ]
     
                vec_xnyz <TYPE> xzw;
     
                // [ ... ]
            };
     
            // fonctions
        };
    Cela fonctionne a merveille lorsque je fait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    vec4_t <int32_t> a;
    vec4_t <double> b;
     
    a.zxy = vec3_t<int32_t> (b.xzw);
    Mais si sizeof(TYPE) > 8 octets comme par exemple pour une matrice 4x4 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    vec4_t <vec4_t <double> > matrix;
     
    // ...
    J'obtiens a la compilation sous clang :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    warning: size of anonymous bit-field (256 bits) exceeds size of its type; value will be truncated to 32 bits
    Ce qui est normal car je n'ai pas de specialisation de MetaTypedef pour ADDRESS_SIZE = sizeof(vec_xnyz <double>) = 32 car uint256_t n'existant pas. De plus ce message est tres bizar car dans mon cas, la valeur dans le bit field anonyme n'a aucune importance, donc qu'elle soit tronquee sur 32 bits a aussi aucune importance. Hors j'ai pour habitude de compiler en mode release avec un -Werror, donc je doit me debarasser de ce warning absolument.

    Quelqu'un aurait il une solution ?

    Merci bien !

    PS:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    > clang++ --version
    Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)
    Target: x86_64-apple-darwin13.0.0
    Thread model: posix

  2. #2
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Hello,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    template <>
        struct MetaTypedef<256/8>
        {
            typedef int8_t intX_t[256/8];
            typedef uint8_t uintX_t[256/8];
        };
    ? (Vraiment pas sur)

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 219
    Par défaut
    Salut Iradrille!

    Non ca ne fonctionne pas car les bitfield ne peuvent pas etre sur autre chose que des (unsigned) integers. Clang le confirme bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error: anonymous bit-field has non-integral type 'typename MetaTypedef<sizeof(vec4_t<double>)>::uintX_t' (aka 'uint8_t [32]')
    Mais merci beaucoup, je n'y avait pas penser !

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

    Informations professionnelles :
    Activité : aucun

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

    Pourquoi multiplies-tu sizeof(TYPE) par 8 la valeur renvoyée par sizof est, déjà une valeur correspondant au nombre de byte. Si tu multiplie encore cette valeur par 8, tu te trouves à une adresse qui correspond à 8 fois la taille du type envisagé. Je ne suis pas sur du tout que ce soit ce que tu souhaites faire
    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

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 219
    Par défaut
    Salut koala01,

    Et bien, les bit-field sont en bits et non en octets d'ou la multiplication par 8 pour creer un padding de sizeof(TYPE) octets et non sizeof(TYPE) bits.

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par LastSpear Voir le message
    Salut koala01,

    Et bien, les bit-field sont en bits et non en octets d'ou la multiplication par 8 pour creer un padding de sizeof(TYPE) octets et non sizeof(TYPE) bits.
    Oui, en effet, au temps pour moi... Je n'avais pas percuté sur le fait que c'était un bitfield un résidu des vapeurs de la saint sylvestre sans doute
    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

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

Discussions similaires

  1. Etat est plus large que le papier
    Par lebienestrare dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 04/09/2006, 20h55
  2. [DBCOMBOBOX] liste est plus large que le combo lui-même
    Par valoji dans le forum Bases de données
    Réponses: 3
    Dernier message: 18/05/2006, 16h59
  3. un tableau plus large que la fenêtre.
    Par maniaco_jazz dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 04/12/2005, 23h25
  4. [Datareport] Etat plus large que le papier
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 09/09/2002, 11h45

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