struct Cplayer
{
/*0x0000*/ WOWGUID GUID;
/*0x0008*/ DWORD Type;
/*0x000c*/ DWORD Entry;
//tons of other ....
/*0x03b0*/ QuestLog questLog[25];
/*0x04dc*/ VisibleItem visibleItem[19];
//others...
};
</sub>
Je rempli ma structure à l'aide de mon MemoryReader avec :
DWORD pos_rel_visibleitem = (DWORD) &(j->visibleItem) - pos_GUID;
ILogger::Log("relative adress QuestLog : %p", pos_rel_questlog);
ILogger::Log("normal position (should be) of visibleItem : %p", normal_position_visibleitem);
ILogger::Log("the value i get : %p", pos_rel_visibleitem);</sub>
Si je ne faisais aps d'erreur, je devrais avoir les même valeurs pour "normal_position_visibleitem" et "pos_rel_visibleitem" mais j'ai une différence de 4 bytes (1 DWORD?)
En calculant manuellement la taille de questLog je trouve (DWORD=4 *3 * 25) = 300 = 12C or 12C+3B0 = 4dc mais dans mon programme de test, ce n'est pas ce que je trouve.
Je ne comprend pas pourquoi j'ai une différence (ce qui décale les adresses de toute ma structure et toutes les autres membres sont donc faux.
Neo_Fr
Messages postés653Date d'inscriptionmardi 6 décembre 2005StatutMembreDernière intervention10 novembre 20142 22 juil. 2008 à 11:48
Salut regarde bien si ta structure est correctement alignée, si ce n'est pas le cas le compilateur peut rajouter des octets pour l'aligner a ta place, par defaut les structures sont alignés sur 4 octets, il est cependant possible de changer cette valeur grace a la directive pack: http://msdn.microsoft.com/en-us/library/2e70t5y1(VS.80).aspx Un peu de doc sur l'alignement des structures:
http://msdn.microsoft.com/en-us/library/71kf49f1(VS.80).aspx Cette doc s'applique pour les systemes 64bits donc les structures sont alignées sur 8 octets, mais le principe reste le meme..
hisoka56
Messages postés17Date d'inscriptionlundi 7 juillet 2003StatutMembreDernière intervention22 juillet 20081 22 juil. 2008 à 12:05
je te remercie, je ne connaissait rien en alignement, d'ailleurs, ça me semble toujours un peu flou mais j'ai réussi à corriger mon erreur, en ajoutant juste un pack(4).
Mais je vois pas trop pourquoi le compilateur fais ce type d'arrangement c'est pour gagner de la vitesse?