Fermer2
KochiseLe 17/07/2009 à 12:34
Erf, valà valà, j'ai un problème, fallait bien que ça arrive un jour, hein ? Bon ben je me suis donc attaqué au développement 64 bits (sur Atom 330, pour ceux qui ont suivis) et j'essaye -"autant-que-faire-se-peut"- à ce que mon build soit aussi bien compatible 32 bits que 64 bits (erf, je sais, je rêve éveillé). Je cherche à gommer AU MAXIMUM les différences, et j'y suis presqu'arrivé, sauf que :

  typedef struct{ // size, offset 32 bits, offset 64 bits
    int   nCount;    //  4,  0,  0
    short nMode;     //  2,  4,  4 <- ???
    sHue  sColor;    //  8,  8,  8
    char* pTest;     //  4, 16, 16
    char  aData[10]; // 10, 20, 24
  }sStack,*psStack;  // 28 (real) -> 32 (sizeof 32 bits), 40 (sizeof 64 bits)


Si on passe aData à 12, même si la struct ne fait 'que' 30, l'offset faisant la taille réelle passe à 32 (en 32 bits). En passant à 13, le sizeof passe à 36 (alignement de 4, version 32 bits). Bref voilà pour présenter le problème en général...

En particulier, je voudrais une struct de TOUJOURS la même taille, version 32 ou 64 bits, puisque je fais du message-passing. Donc derrière un client 32 bits il peut y avoir un serveur 64 bits, et inversement. Comme je ne veux PAS à connaître l'architecture en face (cliet ou serveur) il faudrait donc pouvoir fixer la taille des pointeurs à 8 octets. J'ai donc essayé ça :

#pragma pack(8)
  typedef struct{
[...]
  }sStack,*psStack;
#pragma pack()


Mais heu, ça marche pô : sur architecture 32 bits le compilateur 'caste' toujours les pointeurs sur 32 bits et le sizeof reste toujours à 32 :/ Non pas que je m'attende à ce qu'il passe à 40 (puisque nMode est encore 'casté' sur 4 octets -???-) mais au moins un sizeof à 36.

L'idée c'est de continuer à pouvoir utiliser ((psStack)buff)->pTest indifférement sur un build 32 bits ou 64 bits, sans avoir à caster, et surtout de pouvoir faire transiter une struct de toujours la même taille (le fameux buff qui reçoit un buffer quelconque). Les appels stdcall et cdecl doivent quand à eux rester les mêmes suivant la plateforme, donc proscription d'utiliser le switch /vmg par exemple. Je voudrais éviter le switch /Zp8 puisque je ne veux pas que toutes les struct soient affectées.

Bon je sais c'est pas forcément clair, mais si quelqu'un a une idée...

Kochise