Question

Je travaille en 64 bits 64 bits x_86 système OSX.

Je lis le fichier de base de données existante. Il est chargé dans un bloc de mémoire et à l'aide de décalages qu'il existait des structures. Il est écrit en mode 32 bits.

Ainsi, afin de lire correctement en mode 64 bits, Je veux ajouter n octets à l'adresse de base d'une structure.

Depuis incement pointeur

incrément ne me permet pas de le faire Comme il est en mode 64 bits chaque pointeur est b octets de long.

Cordialement, Dhana.

J'ai posté un code ici. Je suppose qu'il est juste ..

   struct CamNodeTag { 
          CamNodeTag  *nextCam; // next cam
          SInt32 numMake; 
          char  *menuMake; 
    }; 

    long pBaseAddr; // this is long so we an offset bytes from it.

    //Get the size of of the structure in 32 bit environment.//in 64 bit envi it is 20 bytes.
    int CamNodeTagSizeIn32BitMode = 12;


    //Do it in a while loop..
 int i=0;
 CamNodeTag * pNode = (CamNodeTag *)(pBaseAddr + i*CamNodeTagSizeIn32BitMode);

while(pNode !=NULL)
{
    //Do the cam stuff here..

// to get the next node, we add the base addr to the offset


//This will give next cam
 i++;
   pNode = (CamNodeTag *)(pBaseAddr + i*CamNodeTagSizeIn32BitMode);

}
Était-ce utile?

La solution

recommander à la place que vous avez lu le fichier à partir du disque en utilisant les fonctions que vous écrivez telles que read_uint32_whatever_endian(FILE*) et autres, et les conserver dans vos nouvelles 64bit structs en mémoire.

Ce nouveau code isole des choix du compilateur fait de la mise en page de la mémoire de vos structures.

Sur une machine moderne, le coût de la performance de cette analyse est tellement minime que je suis sûr que vous pouvez à peine mesurer.

Bien qu'il y ait un légère coin cas où les fichiers de base de données nmaped grandes qui stockent la même structure binaire comme la représentation en mémoire du compilateur est un plus, ce cas ne vaut pas beaucoup dans la pratique.

Les avantages d'un sérialisation différent sur le disque à la mémoire offrent beaucoup d'avantages pratiques:

  • il est portable - vous pouvez exécuter votre code sur différents processeurs avec différents mot-tailles et différentes Boutiens sans problèmes
  • vous pouvez étendre les structures à tout moment - vous pourriez faire en mémoire les structures en objets avec des méthodes et des méthodes telles, même C ++ virtuels, et d'autres avantages de la conception orientée objet; vous pouvez également ajouter des membres qui ne reçoivent pas sérialisé, tels que les pointeurs et d'autres domaines, et vous pouvez prendre en charge les nouvelles versions de fichiers de base de données facilement

Autres conseils

Pour faire avancer un pointeur par autre chose que sa taille d'origine, vous devez jeter char *.

Pour lire un fichier qui utilise des valeurs 32 bits comme « pointeurs » à l'aide d'un processeur 64 bits, vous devez redéfinir vos structures afin que les champs qui étaient autrefois des pointeurs sont encore 32 bits dans la taille.

typedef int Off32; // our "pointers" need to be 32 bit ints rather than pointers.

struct CamNodeTag { 
   Off32  nextCam; // next cam
   SInt32 numMake; 
   Off32  menuMake; 
}; 

char * pBaseAddr; // this is char * so we an offset bytes from it.

// set this to point to the first node.
CamNodeTag * pNode = (CamNodeTag *)(pBaseAddr + first_node_offset);

// to get the next node, we add the base addr to the offset
// in the structure.

pNode = (CamNodeTag *)(pBaseAddr + pNode->nextCam);

// assuming that the menuMake pointer is also an offset from the base
// use this code to get the actual pointer.
//
char * pMenu = (pBaseAddr + pNode->menuMake);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top