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 :

alignement parasite dans une structure !


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de - Robby -
    Inscrit en
    Juillet 2003
    Messages
    266
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 266
    Par défaut alignement parasite dans une structure !
    Bonjour,
    j'ai déclaré une structure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    typedef struct  _xDTR
    {
        short int  limit ;  
        int  base ;
    }
    IDTR , GDTR , *PIDTR , *PGDTR ;
    .....
    IDTR  idtr  ;
    Mais le compilateur "aligne" et réserve physiquement 32 bits pour mon "short int". Physiquement, " idtr . base " se trouve à " offset idtr + 4 ". Bon ... si on ne "parle" que C, ça ne pose pas de soucis, le compilateur s'y retrouve. Mais j'ai crée cette structure pour mémoriser les données fournies par l'instruction asm " SIDT " !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    __asm
    { ...
    SIDT  idtr
    ...
    }
    Et là, soucis ! car SIDT place le contenu du registre IDTR sur 6 bytes à l'emplacement spécifié (limit, sur 16 bits, et base sur 32 bits) ... de façon linéaire. Et quand je fais référence à "idtr . base" ... je ne retrouve pas la valeur correcte ... normal ... physiquement, le compilateur n'a pas réservé réellement 1 short + 1 long ... mais 2 long !
    Comment faire pour indiquer au compilateur qu'il doit réserver l'équivalence physique de la déclaration de la structure, et de façon physiquement contigue (je ne sais pas si le compilateur "pourrait" physiquement scinder la structure).
    J'espère vous avoir expliquer clairement, et merci à tous.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    [/list:u:d9f6411c66]
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre confirmé Avatar de - Robby -
    Inscrit en
    Juillet 2003
    Messages
    266
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 266
    Par défaut
    Ta réponse m'intéresse beaucoup Médinoc.
    Mais pourrais-tu développer un peu s'il te plaît.
    #Pragma pack (1) ou 2 ?
    J'ai déjà croisé cette directive, sans m'en servir ... quel est l'action exact de cette directive ? et pourquoi ce choix de "1 ou 2" ?
    Pour ta dernière solution ... quel est le rôle de ces deux fichiers ".h", avant et après la déclaration de ma structure ? Merci d'accepter de m'expliquer un peu plus Médinoc. Oui ... sous Delphi, il y avait aussi l'option "packed" ... Mais je dois développer en C maintenant.
    Merci à toi.

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    le #pragma pack donne la taille sur laquelle doit être alignée une structure. (par défaut, c'est généralement 4 ou 8 ).

    Si on n'utilise rien de plus petit que des shorts, on ne voit pas de différence entre pack(1) et pack(2): il faut utiliser des chars pour qu'il y ait une différence.

    Les headers <pshpackX.h> et <poppack.h> renferment des définitions portables d'un VC++ à l'autre qui utilisent le pragma pack comme une pile: Ainsi, <pshpack2.h> règle le pack à 2 et poppack.h restaure l'ancienne valeur.

    Ces headers-là sont très utilisés dans les headers Windows, quand il y a des fichiers en jeu (BITMAPFILEHEADER et BITMAPINFOHEADER sont en pack(2), par exemple).
    Par conséquent, je te conseille d'utiliser les headers pour ta structure, plutôt que directement le pragma.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre confirmé Avatar de - Robby -
    Inscrit en
    Juillet 2003
    Messages
    266
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 266
    Par défaut
    J'ai un peu regardé tes diverses solutions ... Je trouve la solution des fichiers header un peu "lourde" pour une seule structure ... mais je te remercie de m'en avoir parlé également. j'utilise "pragma pack (2), et j'obtiens ce que je désirais. Merci pour tes réponses et explications ... sympa !

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

Discussions similaires

  1. Alignement verticale dans une cellule td de tableau table
    Par Longrais dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 16/09/2005, 11h37
  2. aligner verticalement dans une cellule
    Par mic79 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 28/12/2004, 10h52
  3. Enlver un noeud dans une structure XML
    Par Sharingan dans le forum ASP
    Réponses: 4
    Dernier message: 20/12/2004, 08h08
  4. donée de plusieur vecteur dans une structure ??
    Par lipczynski dans le forum C++
    Réponses: 5
    Dernier message: 13/08/2004, 08h17
  5. type void* dans une structure
    Par barbapapaz dans le forum C
    Réponses: 3
    Dernier message: 16/07/2004, 16h11

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