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 :

problème de structure définie


Sujet :

C++

  1. #1
    Nouveau membre du Club
    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
    Points : 34
    Points
    34
    Par défaut problème de structure définie
    bonjours;
    j'ai besoin d'un registre 48 bit, mais accessible par 6 bits, et en entier.

    je l'ai défini 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;  //pour traiter chaque 6 bits à part
    }reg48_6;
    puis j'utilise cela:

    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
     
    reg48_6  s;
    int i;
     
        s.reg=0;
        s.b.b0=1;
        s.b.b1=2;
        s.b.b2=3;
        s.b.b3=4;
        s.b.b4=5;
        s.b.b5=6;
        s.b.b6=7;
        s.b.b7=8;
    for(i=0;i<8;i++)
        {   cout<<hex<<s.b.b0<<"\n";
             s.reg=s.reg<<6;
            cout<<"\n";
        }
    normalement je devrais avoir 1,2,3,...8
    MAIS il m'affiche: 1,2,3,1,1,11,21,32............je ne comprend pas pourquoi.?
    merci de me dire comment je fais pour retrouver les s.b.bi dans le s.b.b0 quand je fais des decalage.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    je comprends pas tout.
    Mais en voyant ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    s.reg=0;
    s.b.b0=1;
    s.b.b1=2;
    s.b.b2=3;
    s.b.b3=4;
    s.b.b4=5;
    s.b.b5=6;
    s.b.b6=7;
    s.b.b7=8;
    for(i=0;i<8;i++)
    { cout<<hex<<s.b.b0<<"\n";
    s.reg=s.reg<<6;
    cout<<"\n";
    }
    je m'attends à avoir en sortie
    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
    1
     
    1
     
    1
     
    1
     
    1
     
    1
     
    1
     
    1
    retrouver les s.b.bi dans le s.b.b0 quand je fais des decalage.
    la seule affectation que tu effectues c'est dans s.reg, comment veux-tu faire un décalage dans s.b.b0 ? Et encore, tu lui assignes sa propre valeur (nulle) décalée de 6 bits.

    edit: merci j'avais pas vu union; n'ayant jamais réellement manipulé ces bêbêtes-là, j'ignore ce que ça fera. Par contre l'affichage des 1 ne me semblerait pas anormale.
    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 éclairé
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Points : 719
    Points
    719
    Par défaut
    Citation Envoyé par Bousk Voir le message
    la seule affectation que tu effectues c'est dans s.reg, comment veux-tu faire un décalage dans s.b.b0 ? Et encore, tu lui assignes sa propre valeur (nulle) décalée de 6 bits.
    Fais attention, c'est une union, pas une structure, du coup reg n'est pas nul, il vaut le contenu de s.b.
    Toutefois, moi, à voir ce code, je ne m'attends pas à voir :
    1,2,3,...8
    puisque tu décales à chaque fois le contenu, mais affiche toujours s.b.b0;

  4. #4
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Points : 719
    Points
    719
    Par défaut
    Citation Envoyé par Bousk Voir le message
    edit: merci j'avais pas vu union; n'ayant jamais réellement manipulé ces bêbêtes-là, j'ignore ce que ça fera. Par contre l'affichage des 1 ne me semblerait pas anormale.
    Les membres d'une union partagent le même espace mémoire. Ainsi, s.reg & s.b occupent le même emplacement : écrire dans s.reg modifie AUSSI s.b, et inversement.
    Ici, initialement la valeur de s.reg est énorme (je n'ai pas le courage de la calculer).
    Ensuite le programme fait un décalage de 6 bits vers la gauche de s.reg, ce qui fait que s.b.b0 ne contient plus qu'un 0. J'avoue ne pas comprendre pourquoi on obtient pas en sortie :
    1, 0, 0, 0, 0, 0, 0, 0

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Merci pour les informations .
    Du coup, le problème ne peut-il pas être un problème de padding de la structure 8*6 ?
    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.

  6. #6
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Points : 719
    Points
    719
    Par défaut
    Effectivement, les bitfields contribuent à causer des problèmes de padding.
    Mais là, ce que veut l'OP, c'est avoir une succession 1,2,3,...
    donc plutôt que faire :
    s.reg=s.reg<<6
    il devrait faire
    s.reg=.sreg>>6
    puisqu'on veut décaler vers le poids faible.

    Edit:
    ce qui d'ailleurs s'écrit plus proprement :
    s.reg>>=6;

  7. #7
    Nouveau membre du Club
    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
    Points : 34
    Points
    34
    Par défaut
    merci les amis; je comprend toujours pas pourquoi mais j'ai trouvé une autre approche:

    je définie une fonction qui me fais de simples affectations pour faire le décalage à gauche comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void decalage_6bits_gauche(reg48_6 &s)
    {
        s.r48.b0=s.r48.b1;
        s.r48.b1=s.r48.b2;
        s.r48.b2=s.r48.b3;
        s.r48.b3=s.r48.b4;
        s.r48.b4=s.r48.b5;
        s.r48.b5=s.r48.b6;
        s.r48.b6=s.r48.b7;
        s.r48.b7=0;
    }
    et à chaque fois que je veux faire un décalage j'appelle ma fonction.
    cela va m'aider à généraliser; faire le même traitement sur chaque 6bits ( s.b.bi) . j'écris le programme en fonction de s.b.b0; et je fait un décalage à gauche(avec ma fonction) et je reboucle ..et le tour est joué.

    merci tout le monde.

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

Discussions similaires

  1. Problème d'instanciation d'une structure défini dans un OCX
    Par aikidoka13 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 27/04/2009, 15h07
  2. Réponses: 16
    Dernier message: 21/08/2006, 14h12
  3. [Structures]Problème sur structures
    Par kendras dans le forum C++
    Réponses: 5
    Dernier message: 07/06/2006, 10h20
  4. Transformation d'une structure(définie en xml) en formulaire
    Par boniface dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 06/07/2005, 07h39
  5. [OCaml] Problème de structure/parser
    Par marv1 dans le forum Caml
    Réponses: 4
    Dernier message: 09/05/2005, 12h16

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