Calcul d'adresse [Résolu]

Signaler
Messages postés
551
Date d'inscription
jeudi 28 novembre 2002
Statut
Membre
Dernière intervention
26 mars 2016
-
BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
-
J'ai besoin de connaitre les adresses de chaque membre d'une structure.
le c++ fait un alignement sur celle la.

DWORD TestSize(STORAGE_PROPERTY_QUERY * essai)
{
essai.PropertyId * machin;
STORAGE_PROPERTY_QUERY * chose;

chose = essai;
machin = essai->PropertyId;/// ?????
return 0;
}

La taille de la structure est de 9,avec l'alignement elle devient douze.Ou sont mis les trois bytes ?.
En pseudo code je voudrais faire.
adresse de AdditionalParameters - adresse de chose(STORAGE_PROPERTY_ID)
Help.


typedef struct _STORAGE_PROPERTY_QUERY {
STORAGE_PROPERTY_ID PropertyId;
STORAGE_QUERY_TYPE QueryType;
BYTE AdditionalParameters[1];
} STORAGE_PROPERTY_QUERY, *PSTORAGE_PROPERTY_QUERY;

2 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
18
Il n'y a aucun besoin de macro cachée dans un fichier h.
Tout simplement:
offsetField = addrField - addrBase;

En l'absence de tout #pragma pack(xxx), un compilo C/C++ correct aligne les membres d'une structure selon leur taille.
J'espère n'étonner personne en rappelant qu'un:
mov eax, [rcx]
est très couteux si RCX non aligné sur 4. Si OS réglé pour ne pas rattraper ces erreurs, c'est une exception qui est générée.

Un simple regard permet de savoir combien et où seront les eventuels octets de cadrage.
Je mets les offsets en comment de chaque membre.
typedef struct _BIDON {
  BYTE b1;         // +0
  double dbl;      // +8
  DWORD d;         // +16
  BYTE b2;         // +20
  WORD w;          // +22
} BIDON, *PBIDON;

Cadrage:
- 7 octets entre b1 et dbl.
- 1 entre b2 et w.

ciao...
BruNews, MVP VC++
Messages postés
551
Date d'inscription
jeudi 28 novembre 2002
Statut
Membre
Dernière intervention
26 mars 2016
1
J'ai finalement trouvé la solution ailleurs


DWORD TestSize(STORAGE_PROPERTY_QUERY * essai)
{
int machin;
STORAGE_PROPERTY_QUERY * chose;
chose = essai;
machin = ((int)&essai->PropertyId - (int)&essai->AdditionalParameters );
//machin = 8 or -8
machin = offsetof( STORAGE_PROPERTY_QUERY,AdditionalParameters );
// machin = 8 need #include <stddef.h>
return 0;
}