Quelles sont quelques techniques pour gérer en toute sécurité les deux pointeurs 32bits et 64bits sans une macro conditionnelle?

StackOverflow https://stackoverflow.com/questions/1533986

Question

Je mise à jour du code dans une bibliothèque parce que je l'ai découvert mon code d'origine pointeurs 32 bits pris en charge. J'ai mes reflexions sur la façon de le fixer, mais la rigueur, je veux demander quelles sont les techniques que vous utilisez pour faire fonctionner ce code pour 32 bits et 64 bits sans macro?

char *argList = (char *)malloc(sizeof(id *) * argumentsCount);

sizeof (id *) est de 4 à 32 bits, 8 à 64 bits. J'utilise char * argList pour construire un tableau de pointeurs vers des objets, puis en utilisant la méthode getObjects de NSArray:

[myNSArray getObjects:(id *)argList];

fonctionne en 32 bits, les accidents dans 64bit (pour des raisons évidentes)

Était-ce utile?

La solution

Bien que je n'ai pas tout le contexte, je pense que ce n'est pas vraiment un problème de 32/64 bits. Ce que vous voulez sans doute quelque chose le long des lignes de:

id *argList = malloc(sizeof(id) * argumentsCount);

En fonction de la situation, j'aime parfois allouer des blocs de mémoire comme celui-ci avec l'allocation déjà zero'd sur:

id *argList = calloc(1UL, sizeof(id) * argumentsCount);

Ces deux allouent une partie de la mémoire capable de contenir le numéro de argumentsCount de pointeurs vers des objets. Vous pouvez accéder aux pointeurs individuels comme ceci:

argList[0] = [[NSString alloc] initWithUTF8String:argv[0]];
argList[1] = [[NSString alloc] initWithUTF8String:argv[1]];
NSLog(@"Argument 0 is: %@", argList[0]);

Lorsque vous déclarez argList comme pointeur vers char type que vous avez fait dans votre exemple, l'indexation des éléments individuels (c.-à-argList[0], argList[1]), accèdera aux octets individuels de la mémoire allouée pour argList, pas les pointeurs individuels que vous êtes probablement attendre. Lorsque vous déclarez argList comme id, comme je l'ai fait dans ce qui précède, l'indexation des éléments individuels étapes à travers la mémoire allouée pour argList par des octets sizeof(id). Le compilateur compensera automatiquement la taille du pointeur correct pour l'architecture cible.

Si l'on suppose que le pointeur retourné par malloc() est 0x1000, voici une table des adresses qui seraient calculées pour le mode 32 et 64 bits pour les déclarations de char * et id *:

    32-bit: char *  id *     64-bit: char *  id *
argList[0]: 0x1000  0x1000           0x1000  0x1000
argList[1]: 0x1001  0x1004           0x1001  0x1008

Je ne sais pas pourquoi cela vous a déjà travaillé en mode 32 bits.

Autres conseils

Pourquoi gardez-vous ids dans un tableau C au lieu de l'une des classes de collection disponibles dans la Fondation?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top