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 :

typedef union en C++


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    �tudiant
    Inscrit en
    Novembre 2011
    Messages
    45
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Alg�rie

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 45
    Par d�faut typedef union en C++
    j'ai d�clar� une structure; un registre 48 bit accessible chaque 6 bits comme suit
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    typedef struct reg48 {
    	unsigned int   b7:6 ,b6:6 ,b5:6 ,b4:6, b3:6, b2:6, b1:6, b0:6;
    } reg48;
     
    typedef union reg48_6 {
    	unsigned __int64 reg;// pour un accés à toute la valeurs
        reg48 b;
    }reg48_6;
    Et quand j'utilise �a:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    s.reg=0x5bdadd934fad;
    	cout<<hex<<s.reg<<"\n";
        cout<<hex<<s.b.b0<<" "<<s.b.b1<<" "<<s.b.b2<<" "<<s.b.b3<<" "<<s.b.b4<<" "<<s.b.b5;
        cout<<" "<<hex<<s.b.b6<<" "<<s.b.b7<<"\n";
     
    s.reg=0x5bda5d934fad;
    	cout<<hex<<s.reg<<"\n";
        cout<<hex<<s.b.b0<<" "<<s.b.b1<<" "<<s.b.b2<<" "<<s.b.b3<<" "<<s.b.b4<<" "<<s.b.b5;
        cout<<" "<<hex<<s.b.b6<<" "<<s.b.b7<<"\n";
    �a me donne la m�me d�composition pour les 2 DIFFERENTS NOMBRES!!, et elle est fausse!!!.
    j'ai affich� en binaire, j'ai remarqu� que 2 bits aux milieu sont ignor�!!!

    je ne comprend pas pourquoi?
    COMMENT FAIRE UNE D�COMPOSITION DE MON REGISTRE?

  2. #2
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    Bonjour,

    �a ressemble � une "erreur" de padding.
    Le padding par d�faut est s�rement 8.

    #pragma pack(1) devrait corriger �a.
    Pensez � consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation r�seau ?
    Aucune aide via MP ne sera dispens�e. Merci d'utiliser les forums pr�vus � cet effet.

  3. #3
    Membre averti
    Femme Profil pro
    �tudiant
    Inscrit en
    Novembre 2011
    Messages
    45
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Alg�rie

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 45
    Par d�faut
    �a veut dire quoi �a?
    Ou est ce que je le rajoute ce "#pragma pack(1)"?

    en plus,ma d�composition marche pour quelques nombres et non pour d'autres!!!!!!!

  4. #4
    Membre chevronn�
    Inscrit en
    D�cembre 2010
    Messages
    290
    D�tails du profil
    Informations forums :
    Inscription : D�cembre 2010
    Messages : 290
    Par d�faut
    Comme dit Bousk �a peut �tre un probl�me de padding.
    Et effectivement, en ce cas, rajouter #pragma pack(1) avant la definition de ta structure devrait aider.

    Sinon une autre solution pour d�composer ton registre consiste � faire des d�calages (avec l'op�rateur >>) et des masks (avec l'op�rateur &).

  5. #5
    R�dacteur/Mod�rateur
    Avatar de JolyLoic
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    5 463
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, Yvelines (�le de France)

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

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 5 463
    Par d�faut
    D'apr�s la norme, si tu �cris dans un champ d'une union, tu n'as pas le droit de lire un autre champ.

    Apr�s, certains compilateurs permettent de faire ce que tu fais (je crois que visual C++ le permet sp�cifiquement, du moins dans certaines situations), mais c'est du comportement non standard (qui plus est, �a risque de marcher pendant longtemps, puis de planter juste � la veille d'une livraison, parce qu'une autre modif ailleurs change la mani�re dont le compilateur optimise son code).
    Ma session aux Microsoft TechDays 2013 : D�velopper en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage � la d�couverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'h�sitez pas � me contacter.

  6. #6
    R�dacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par d�faut
    Salut,

    Citation Envoy� par Bousk Voir le message
    #pragma pack(1) devrait corriger �a.
    Non. #pragma pack(1) ne concerne pas les champs de bits.

    Citation Envoy� par dida_plt Voir le message
    je ne comprend pas pourquoi?
    COMMENT FAIRE UNE D�COMPOSITION DE MON REGISTRE?
    Avec Visual C++2010, tu dois d�clarer ton champ de bits avec un type suffisant pour contenir l'ensemble de tes bits :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    typedef struct reg48 {
    	unsigned __int64   b7:6 ,b6:6 ,b5:6 ,b4:6, b3:6, b2:6, b1:6, b0:6;
    } reg48;
     
    typedef union reg48_6 {
       unsigned __int64 reg;// pour un accés à toute la valeurs
        reg48 b;
    }reg48_6;
    Mais cela ne fait que retarder d'�ventuels probl�mes...


    Outre la remarque de Lo�c sur l'union, j'en rajoute une sur les champs de bits pour d�courager leur utilisation.

    Lorsque tu as plusieurs champs de bits cons�cutifs (comme les tiens), l'organisation m�moire est la suivante :
    => L'ordre de rangement des bits (gauche � droite ou droite � gauche) est d�pendant de l'impl�mentation
    => Le premier champ de bits est rang� dans un espace du type sous-jacent.
    => Ensuite le champ de bits suivant est ajout� � la suite s'il rentre en entier.
    => Lorsque le champ de bits suivant chevauche plusieurs espace du type sous-jacent, le comportement est d�pendant du compilateur/plateforme cible qui peut soit mettre le nouveau champ enti�rement dans un nouvel espace du type sous-jacent, soit r�partir le champ de bit entre les deux �l�ments.
    Exemple en supposant un type sur un 1 octet :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    struct expl
    {
       unsigned char champ1 : 6;
       unsigned char champ2 : 6;
    };
    On peut avoir :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
     
                 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
    champ1 :                                           X   X   X  X   X  X
    champ2 :                  X   X  X  X   X   X
    ou
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
     
                 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
    champ1 :                                           X   X   X  X   X  X
    champ2 :          X  X  X   X  X   X
    Ce qui constitue un probl�me �vident � la portabilit� de ton code...

    Je te conseille donc d'utiliser plut�t des fonctions de manipulation de bits pour les lire et les �crire � partir d'un type sous-jacent que tu ma�trise.
    Si tu peux mapper l'int�gralit� des bits dans un seul objet du type sous-jacent alors fais le (ce qui est le cas ici en changeant unsigned int en unsigned __int64 (*)). Sinon, pr�f�res la manipulation de bits (d�calages et masques).

    (*) ceci dit cela n'enl�ve rien au probl�me soulign� par Lo�c.

Discussions similaires

  1. comment est la memoire avec typedef union
    Par gronaze dans le forum C
    R�ponses: 4
    Dernier message: 27/02/2007, 14h22
  2. UNION qui ne fonctionne pas
    Par r-zo dans le forum Langage SQL
    R�ponses: 7
    Dernier message: 21/07/2003, 10h04
  3. R�ponses: 6
    Dernier message: 26/01/2003, 13h45
  4. Cr�er une vue pour trier une requete UNION ?
    Par Etienne Bar dans le forum SQL
    R�ponses: 3
    Dernier message: 03/01/2003, 20h22
  5. Sortir un typedef d'une classe
    Par Theophil dans le forum C++Builder
    R�ponses: 13
    Dernier message: 03/07/2002, 17h21

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