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 397
    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 397
    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 397
    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 397
    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