2d массивы целых в target-c - PullRequest
0 голосов
/ 08 мая 2009

Я работаю с двумерными массивами целых чисел в стиле C.

Это нормально в моем файле основного класса, и я могу передать свои массивы по ссылке на другие классы. У меня возникли проблемы, когда я пытаюсь получить указатель на массивы и работать с ним.

Мой вопрос: вместо использования 2-мерных массивов в стиле C, есть ли лучший способ сделать это? может быть, класс Какао, о котором я не знаю? Я заметил NSMatrix, но, похоже, он предназначен для ячеек, а не для простых целых.

У меня есть повсюду вызовы в этом формате: items[x][y], так что сокращенный способ ссылки на позиции массива был бы великолепен.

Более подробная информация:

Я настроил массивы как переменные экземпляра и попытался получить доступ к этому:

-(void) setItems: (int [15][24])items
{
    (*pitems)[24] = **items;
}

-(int) getItems
{
    return (*pitems)[24];
}

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

Ответы [ 2 ]

3 голосов
/ 08 мая 2009

Интересная дискуссия здесь: http://www.idevapps.com/forum/archive/index.php/t-244.html

По сути, было предложено превратить ваш 2D-массив в несколько одномерных массивов. Например:

int массив [20] [8] становится

int** array = (int*)malloc(20 * sizeof(int*));

unsigned int i = 0;
for (i = 0; i < 20; ++i)
{
    array[i] = (int)malloc(8 * sizeof(int));
}

and your method returns int** and variable is of type int**. 

Преимущество заключается в том, что обычная индексация двумерных массивов работает, как и ожидалось.

Другим вариантом, который не был предложен в ссылке, было использование NSMutableArray типа NSMutableArray. Это будет медленнее, чем стандартные массивы C, но легче передать и ссылаться.

1 голос
/ 08 мая 2009

Вы можете обойти 2D статические массивы, только если знаете точный размер первого измерения:

// OK, even though we don't know the size of the second dimension
- (void) doStuff: (int [15][])array { ... }
...
int array[15][24];
[self doStuff:array];

// ERROR: don't know size of first dimension (second dimension is irrelevant)
- (void) doStuff: (int [][])array { ... }

Конечно, тогда ваша функция работает только для одного определенного размера массива в первом измерении. Если вы не будете знать размер вашего первого измерения до времени выполнения, вам придется либо сгладить массив в одномерный массив, либо использовать динамически распределенный массив указателей на одномерные массивы, как в ответ KiwiBastard .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...