2011-07-10 8 views
0

est-il possible de déclarer un tableau de longueur variable avec portée globale dans objectif-c?objectif-c longueur variable tableau portée globale

Je fais un jeu avec une classe mondiale, qui initialise la carte du monde comme un tableau d'entiers tridimensionnels. alors que c'est seulement un scroller latéral bidimensionnel, la troisième dimension de la liste indique qu'un peu de bloc va à la coordonnée donnée par les deux premières dimensions

après la fonction d'initialisation, une méthode nextFrame: est programmée (j'utilise cocos2d et la méthode de planification CCDirector). Je me demandais comment passer le tableau de cartes int [] [] [] de la fonction d'initialisation à la fonction nextFrame

J'ai essayé d'utiliser la déclaration globale (mot-clé statique), mais j'ai reçu une erreur disant que les tableaux globaux ne peuvent pas être de longueur variable

la ligne de code je fais référence est la suivante:

int map[xmax][ymax][3]; 

où xmax et ymax sont les plus éloignés coordonnées x et y dans la liste de coordonnées qui définissent la scène.

Je voudrais les passer en quelque sorte à nextFrame :, ce qui est prévu dans

[self schedule:@selector(nextFrame:)]; 

Je me rends compte que je peux utiliser NSMutableArray, mais NSMutableArray est un peu un casse-tête pour les listes 3 dimensions d'entiers (je utiliser les numéros d'emballage pour tout ...). est-il possible de le faire avec des tableaux entiers?

+2

Je ne suis pas un développeur de jeux, je ne comprends peut-être pas certains problèmes mais ne pouvez-vous pas créer une classe 'WorldMap' qui utilise NSMutableArray mais qui ne fait qu'abstraire son utilisation avec une API sympa? –

+0

c'est un bon point. Je suppose que je n'y ai jamais vraiment pensé. –

+0

vaut-il mieux être une sous-classe de NSMutableArray, ou juste avoir NSMutableArray comme variable d'instance? –

Répondre

0

Vous ne pouvez pas avoir de tableau global dynamique de dimensions dynamiques en C (dont Objective C est un sur-ensemble propre). Mais vous pouvez utiliser un tableau global de n'importe quelle longueur ou taille (jusqu'à la mémoire disponible) au moment de l'exécution en utilisant un arithmétique d'indexation de pointeur global, malloc et tableau.

static int *map = NULL; 

... 
map = malloc (dim1 * dim2 * dim3 * sizeof(int)); // in some initialization method 

if (map == NULL) { /* handle error */ } // before first array access 

... 
myElement = map[ index3 + dim2 * (index2 + dim1 * index1) ]; // some macro might be suitable here 

Ou vous pourriez faire getter Objectif C et les méthodes setter qui vérifie les limites du tableau et un tableau sur chaque accès, puisqu'une méthode peut renvoyer les types de données C simples. Une autre option, si vous connaissez les dimensions maximum que vous voulez avoir et que vous voulez utiliser (gaspillez) cette quantité de mémoire, est d'allouer statiquement le tableau max, et de lancer une exception si le programme essaye de définir quelque chose de plus grand que votre max autorisé.

+0

Si j'ai fait la méthode que vous avez indiquée, pourrais-je faire quelque chose de similaire à myElement = map [index1] [index2] [index3] ou cela ne fonctionnerait-il pas? –

+0

je suppose que ce ne serait pas le cas, mais je ne suis pas sûr exactement comment les tableaux multidimensionnels sont structurés en mémoire –

0

J'ai essayé d'utiliser (mot-clé statique) global de déclaration, mais nous avons eu une erreur en disant que les tableaux globaux ne peuvent pas être variable longueur

Mais mondial des pointeurs de tableau peuvent pointer vers des tableaux de longueur variable.

Questions connexes