Как использовать массив c-типа в качестве ивара? - PullRequest
3 голосов
/ 02 декабря 2009

Мне нужен старый старомодный двумерный массив целых чисел в моей программе, но независимо от того, как я пытаюсь объявить его как ивар, а затем использовать @ property / @ synthesize, я получаю жалобу компилятора или другую.

Я заявляю

int spotLocations[10] [10] 

как ивар.

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

Ответы [ 2 ]

4 голосов
/ 02 декабря 2009

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

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

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

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

...

@property matrix spotLocations;

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

spotLocations.value[x][y]
2 голосов
/ 02 декабря 2009

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

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

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

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

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

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

...