2009-12-02 5 views
3

Мне нужна хорошая старомодная 2-мерная массив целых чисел в моей программе, но как бы я ни старался объявить ее как ivar, а затем использовать @ property/@ synhesize, я получаю жалобу от компилятора или другую.Как использовать массив c-типа в качестве ivar?

Заявляю

int spotLocations[10] [10] 

как Ивар.

Это много работает, но тогда процесс @ property/@ synhesize никогда не проходит.

+0

Я думаю, вы должны указать, какой язык программирования вы говорите. – unwind

+0

Очевидно, Objective-C – Rudedog

+0

Это, очевидно, Objective-C для тех, кто знаком с Objective-C. –

ответ

4

Вы не можете этого сделать. Безразмерный массив никогда не может быть lvalues ​​в C, а это значит, что вы никогда не сможете объявить функцию, которая возвращает массив, потому что было бы невозможно назначить результат функции переменной массива (поскольку она не может быть lvalue).

Свойства - это всего лишь сокращенный способ объявления функции, возвращающей тип. Поскольку функции никогда не могут возвращать массивы, вы никогда не сможете объявить свойство, являющееся массивом.

Если вам абсолютно необходимо переместить матрицы вокруг, как это, вы могли бы обернуть его в структуры, которые могут быть lvalues:

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

...

@property matrix spotLocations; 

Конечно, доступ в места немного запутаны, вы должны использовать

spotLocations.value[x][y] 
2

Объявите переменную экземпляра как указатель, а затем динамически создайте массив в методе init. Используйте параметр назначения для объявления @property.

Распределение:

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

доступ столбец и строку, выполнив:

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

Не забудьте освободить() указатель, когда вы сделали с ним.