Calcul d'adresse

Résolu
ToutEnMasm Messages postés 590 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 18 septembre 2021 - 6 sept. 2012 à 17:07
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 7 sept. 2012 à 09:25
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

BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 20
7 sept. 2012 à 09:25
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++
3
ToutEnMasm Messages postés 590 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 18 septembre 2021 3
6 sept. 2012 à 20:53
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;
}
0