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 :

Que fait le compilateur


Sujet :

C

  1. #1
    Membre régulier
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Octobre 2016
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2016
    Messages : 62
    Points : 101
    Points
    101
    Par défaut Que fait le compilateur
    Bonjour tous le monde,
    je suis en train de faire un interface pour la gestion des fontes de caractère,
    la structure à transmettre pour créer ou changer une fonte est la suivante:

    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
    typedef struct tagLOGFONTA {
      LONG lfHeight;
      LONG lfWidth;
      LONG lfEscapement;
      LONG lfOrientation;
      LONG lfWeight;
      BYTE lfItalic;
      BYTE lfUnderline;
      BYTE lfStrikeOut;
      BYTE lfCharSet;
      BYTE lfOutPrecision;
      BYTE lfClipPrecision;
      BYTE lfQuality;
      BYTE lfPitchAndFamily;
      CHAR lfFaceName[LF_FACESIZE];
    } LOGFONTA, *PLOGFONTA, *NPLOGFONTA, *LPLOGFONTA;
    Ma question:

    Que fait le compilateur quand il tombe sur BYTE, est-ce qu'il réserve juste un Byte (Octet) dans la mémoire ou est-ce qu'il réserve
    une structure de 4 octets consécutifs ou seul l'octet de poids faible est utilisé. ?

    Comme vous savez je ne programme pas en C++, mais j'ai besoin de ces infos pour interfacer mes affaires avec les fonctions Windows, je dois donc
    créer une structure similaire à celle crée par le compilateur C++
    Jusqu'à lfWeight ça marche impeccable c'est après que ça foire.

    Merci pour vos réponses
    Cordialement

    Ludwig

  2. #2
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 128
    Points : 33 049
    Points
    33 049
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Ludwig1 Voir le message
    Que fait le compilateur quand il tombe sur BYTE, est-ce qu'il réserve juste un Byte (Octet) dans la mémoire ou est-ce qu'il réserve
    une structure de 4 octets consécutifs ou seul l'octet de poids faible est utilisé. ?
    Il regarde comment ça a été défini : soit un typedef soit un define.
    Si c'est un typedef, le compilateur le considère et traite par son type réel.
    Si c'est un define, le pré-processeur remplace par ce qu'il définit avant de passer à l'étape de compilation.

  3. #3
    Membre régulier
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Octobre 2016
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2016
    Messages : 62
    Points : 101
    Points
    101
    Par défaut Que fait le compilateur
    Bonsoir, Merci pour la réponse- Entre temps j'ai procédé à quelques essais.


    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
    24
    25
    26
    27
    28
    29
    30
    typedef struct tagLOGFONTA {
      LONG lfHeight;
      LONG lfWidth;
      LONG lfEscapement;
      LONG lfOrientation;
      LONG lfWeight;
      BYTE lfItalic;
      BYTE lfUnderline;
      BYTE lfStrikeOut;
      BYTE lfCharSet;
      BYTE lfOutPrecision;
      BYTE lfClipPrecision;
      BYTE lfQuality;
      BYTE lfPitchAndFamily;
      CHAR lfFaceName[LF_FACESIZE];
    } LOGFONTA, *PLOGFONTA, *NPLOGFONTA, *LPLOGFONTA;
     
    Il semblerai que le compilateur construit le structure suivante en mémoire.
    hFont est le point d'entré. 
     
    Hfont 64 Dump 
      560604 50 00 00 00 28 00 00 00 00 00 00 00 00 00 00 00 P...(...........
      560614 64 00 00 00 FF FF 00 0D 00 00 00 40 73 63 72 69 d..........@scri
      560624 70 74 00 00 00 00 00 00 00 00 00 00 00 00 00 00 pt..............
      560634 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ ok
     
     
    DONC    
    LONG lfHeight;    COMPILE     50 00 00 00 
    BYTE  lfItalic;       COMPILE     FF
    Comme la structure ci-dessus fonctionne,
    j'ai la réponse, BYTE compile des octets les uns à la suite des autres.

    Merci à ceux qui se sont donné la peine de lire et/ou de répondre.
    Cordialement

    Ludwig

  4. #4
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Je pense que l'OP s'interroge sur la stratégie de packing de l'enregistrement.

    En C c'est à vérifier, mais je pense que cela est défini comme en C++, à savoir indéterminé : seuls l'ordre des membres en mémoire et l'adresse du premier membre sont garantis, le padding (la présence d'octets intermédiaires garantissant un alignement optimal) est laissé à la discrétion du compilateur.

    Dans le cas particulier de membres consécutifs de type char, tu as peut-être une garantie de contigüité. Faudrait relire la norme pour s'en assurer.

    Si tu as besoin d'un layout (disposition mémoire) bien déterminé, par exemple pour faire de l'interopérabilité comme tu l'évoques, alors tu as deux solutions :

    • définir tout ou partie du contenu de la structure comme packed avec une directive compilateur, exemple pour gcc (ou encore via un pragma) ;
    • utiliser des tableaux en lieu et place de membres consécutifs : c'est portable mais c'est moche et peu lisible.

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

Discussions similaires

  1. [ Eclipse3.0 ] Mais que fait le debogueur ?
    Par Bz dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 07/07/2005, 14h31
  2. Réponses: 9
    Dernier message: 27/03/2005, 23h29
  3. mais que fait upper_range() dans un multimap?
    Par porcher dans le forum C++
    Réponses: 7
    Dernier message: 18/02/2005, 22h21
  4. comment savoir ce que fait mon pointeur??
    Par elekis dans le forum C++
    Réponses: 9
    Dernier message: 30/11/2004, 12h42
  5. Mais que fait static ???
    Par elsargento dans le forum C
    Réponses: 4
    Dernier message: 25/09/2003, 09h55

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