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 :

Mots typedef et struct


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 Mots typedef et struct
    Bonjour,

    Je ne connais pas bien le C++
    Dans le language que j'utilise, je peux créer toute sortes de structures en mémoire.
    Dans une application que je suis en train de développer, j'ai besoin de savoir avec précision
    quelle structure mémoire l'expression suivante va créer

    MOUSEINPUT Structure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
     
    typedef struct tagMOUSEINPUT {
      LONG      dx;
      LONG      dy;
      DWORD     mouseData;
      DWORD     dwFlags;
      DWORD     time;
      ULONG_PTR dwExtraInfo;
    } MOUSEINPUT, *PMOUSEINPUT;
    Par structure mémoire j'entends ceci:

    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
     
    4037FA 03 44 55 50 06 83 ED 04 89 5D 00 C3 00 00 00 00 .DUP.....]......
      40380A 00 00 00 00 00 65 01 04 00 00 00 00 00 FF 00 04 .....e..........
      40381A 53 57 41 50 08 8B 45 00 89 5D 00 8B D8 C3 00 00 SWAP..E..]......
      40382A 00 00 00 00 00 6B 01 04 00 6C F1 FF FF FF 00 04 .....k...l......
      40383A 4F 56 45 52 09 83 ED 04 89 5D 00 8B 5D 04 C3 00 OVER.....]..]...
      40384A 00 00 00 00 70 01 04 00 40 EF FF FF FF 00 05 54 ....p...@......T
      40385A 48 49 52 44 09 83 ED 04 89 5D 00 8B 5D 08 C3 00 HIRD.....]..]...
      40386A 00 00 00 75 01 04 00 00 00 00 00 FF 00 06 46 4F ...u..........FO
      40387A 55 52 54 48 09 83 ED 04 89 5D 00 8B 5D 0C C3 00 URTH.....]..]...
      40388A 00 00 00 00 00 00 7A 01 04 00 00 00 00 00 FF 00 ......z.........
      40389A 03 52 4F 54 0E 8B CB 8B 5D 04 8B 45 00 89 45 04 .ROT....]..E..E.
      4038AA 89 4D 00 C3 00 82 01 04 00 00 00 00 00 FF 00 04 .M..............
      4038BA 2D 52 4F 54 0E 8B CB 8B 45 04 8B 5D 00 89 45 00 -ROT....E..]..E.
      4038CA 89 4D 04 C3 00 8A 01 04 00 DC EB FF FF FF 00 04 .M..............
      4038DA 54 55 43 4B 0C 8B 45 00 83 ED 04 89 5D 04 89 45 TUCK..E.....]..E
      4038EA 00 C3 00 00 00 91 01 04 00 11 F1 FF FF FF 00    ...............
    l'objectif étant de construire
    les fonctions typedef et struct avec la même syntaxe que celle du C++, afin de pouvoir les intégrer dans mon système à l'aide du copier coller.
    Ce que j'ai compris est que ça doit générer un INPUT Array, mais je ne sais pas comment je dois
    structurer cet Array c.a.d. que fabriquent les mots réservés typedef et struct en mémoire?

    Merci par avance

    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
    Je n'ai pas compris la moitié de ce que tu demandes... mais cette syntaxe est la déclaration d'une structure en C.
    Et bien que valide en C++, en C++ tu devrais écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    struct MOUSEINPUT { ... };
    using PMOUSEINPUT = MOUSEINPUT*;
    Si c'est l'alignement mémoire qui t'intéresse
    - pourquoi t'en soucies-tu ?
    - chaque élément sera aligné sur 4 octets dans ton cas il me semble
    - tu peux récupérer la taille de la structure avec sizeof
    - si tu as une instance tu peux simplement récupérer l'adresse de chaque membre, et la comparer avec l'adresse de l'instance
    - tu peux modifier cet alignement avec des directives #pragma pack

  3. #3
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 195
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 195
    Points : 17 163
    Points
    17 163
    Par défaut
    La représentation en mémoire est "implementation defined", c'est à dire dépend de ton compilateur, de l'os cible, et possiblement d'autres détails.
    Les choses certaines sont:
    • Les variables membres sont à des adresses deux à deux distinctes.
    • La première variable membre est à la même adresse que l'objet lui-même.
    • Les variables membres sont en mémoire dans le même ordre que déclaré.
    • Chaque variable membre est à une adresse multiple de sa taille. (on parle d'alignement)

    Ainsi, il peut y avoir des trous entre deux membres, si le deuxième doit être aligné plus loin.
    Par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct bidule {
        int i;
        char c;
        int j;
    }
    Comme les adresses seront correctement alignée, je vais seulement parler du décalage de chaque variable par rapport à la structure entière.
    i est forcément au décalage +0, il occupe sizeof(int), ce qui vaut généralement 4 ou 8. Supposons 4 pour la suite.
    c au moins au décalage +4, il occupe sizeof(char), qui vaut toujours 1, et doit être aligné dessus, donc +4 devrait convenir
    j se trouve au moins après +4 +1, et à un décalage multiple de sizeof(int) = 4. Il ne peut être qu'au mieux en +8 et les positions entre +5 et +7 sont du "bourrage" ("padding")


    Attention, le détail qui tue est: l'unité de sizeof n'est pas forcément l'octet. Du moins, la norme prévoit que ca puisse être plus grand.
    Concrêtement, pour un ordinateur classique, c'est bien un octet.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    La réponse à ta question dépend d'une chose qui n'est, à ma connaissance, pas documentée sur MSDN (mais présente dans les headers de Windows qui déclarent ladite structure).
    Ce facteur inconnu est:
    La structure utilise-t-elle les contraintes d'alignement par défaut, ou son alignement est-il réduit?

    Sous Windows 32 bits, ça ne pose pas de soucis, car tous ses six champs ont la même taille: Ils font tous 32 bits.
    Sous Windows 64 bits, le sixième champ dwExtraInfo est sur 64 bits, ce qui signifie que selon les contraintes d'alignement spécifiques à Windows, il peut être immédiatement après time ou séparé par 4 octets de bourrage.

    Pour moi, le plus simple serait de faire un programme en C sous Windows 64 bits et d'afficher offsetof(MOUSEINPUT, dwExtraInfo) (en plus de sizeof(((MOUSEINPUT*)NULL)->dwExtraInfo) pour s'assurer qu'on est bien en 64 bits).
    • Avec l'alignement par défaut, ça devrait être 24.
    • Avec un alignement réduit, ça devrait être 20.

Discussions similaires

  1. typedef et struct paramétrée
    Par coda_blank dans le forum Langage
    Réponses: 1
    Dernier message: 04/09/2010, 13h43
  2. Questions sur Typedef Struct
    Par pinto_armindo dans le forum C
    Réponses: 6
    Dernier message: 26/11/2007, 20h22
  3. Réponses: 2
    Dernier message: 27/09/2006, 10h37
  4. typedef struct
    Par moon93 dans le forum C
    Réponses: 3
    Dernier message: 10/05/2006, 11h22
  5. Réponses: 6
    Dernier message: 31/08/2005, 13h25

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