2009-12-02 4 views
3

J'ai besoin d'un bon tableau bidimensionnel d'entiers dans mon programme, mais peu importe comment j'essaie de le déclarer comme ivar, puis d'utiliser @ property/@ synthesize, je reçois une plainte de compilateur ou autre.Comment utiliser un tableau de type c en tant que ivar?

Je déclare

int spotLocations[10] [10] 

comme Ivar.

Cela fonctionne beaucoup, mais le processus @product/@ synthesize ne passe jamais en revue.

+0

Je pense que vous devriez spécifier le langage de programmation dont vous parlez. – unwind

+0

C'est évidemment Objective-C – Rudedog

+0

Ce n'est évidemment que l'Objective-C à quelqu'un qui est familier avec Objective-C. –

Répondre

4

Vous ne pouvez pas faire cela. Array variabless ne peut jamais être lvalues ​​en C, ce qui signifie que vous ne pouvez jamais déclarer une fonction qui retourne un tableau, car il serait impossible d'assigner le résultat de la fonction à une variable array (puisqu'elle ne peut pas être lvalue). Les propriétés ne sont qu'une manière abrégée de déclarer une fonction qui retourne un type. Puisque les fonctions ne peuvent jamais retourner des tableaux, vous ne pouvez jamais déclarer une propriété qui est un tableau.

Si vous avez absolument besoin de se déplacer autour des matrices comme celui-ci, vous pouvez l'envelopper dans un struct, qui peut être lvalues:

typedef struct { 
    int value[10][10]; 
} matrix; 

...

@property matrix spotLocations; 

Bien sûr, l'accès à la emplacements est un peu plus compliqué, vous devez utiliser

spotLocations.value[x][y] 
2

Déclarez la variable d'instance en tant que pointeur, puis créez dynamiquement le tableau dans votre méthode init. Utilisez le paramètre assign pour la déclaration @property.

Allocation:

spotLocations = malloc(100 * sizeof(int)); 

Accédez à une colonne et la ligne en faisant:

int aValue = spotLocations[x + y * 10]; 

Souvenez-vous de libérer() le pointeur lorsque vous avez terminé avec elle.

Questions connexes