Возвращение двумерного массива C типа id в Objective-C - PullRequest
0 голосов
/ 17 февраля 2012

Я использую массив идентификаторов 2D C в своем приложении для iOS. Можно ли вернуть это в методе Objective-C? В качестве альтернативного решения я попытался вернуть указатель на двумерный массив чисел C, но я не могу изменить массив 2D-int.

- (int (*)[8][8])board:(Piece *)piece
{

    int (*layout)[8][8] = malloc(8 * 8 * sizeof(int));

    //Cannot modify layout 2D C array

    return layout;
}

У меня есть некоторый опыт работы с Objective-C, но нет опыта в C. Могу ли я постоянно сталкиваться с проблемами при использовании двумерных массивов C, например, чтобы я создал класс Objective-C для двумерного массива? Какой типичный подход использует разработчик iOS?

Ответы [ 2 ]

1 голос
/ 17 февраля 2012
- (int **)board:(Piece *)piece
{

    int **layout = malloc(8 * sizeof(int *));
    for(int i=0; i<8; i++)
       layout[i] = malloc(8 * sizeof(int));


    return layout;
}

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

#define access(array, x, y) array[y * 8 + x]

В Objective-C теперь также есть класс многомерных массивов, но вы можете создать NSArray с другими NSArray внутри него или в Google, если это сделал кто-то другой (я помню в хотя бы одна реализация, но не может вспомнить ее название)

0 голосов
/ 17 февраля 2012

После того, как вы объявите int (*layout)[8][8] = malloc(8 * 8 * sizeof(int));, вы можете изменить значения как (*layout)[x][y]=val;. Но я рекомендую вам объявить int (*layout)[8], чтобы вы могли получить доступ к элементам просто layout[x][y]=val.

Edit: я не знаю о Objective-C, но в C функция, которую я предложил, будет выглядеть следующим образом:

int (*newarray())[8] {
 int (*l)[8]=malloc(64*sizeof(int));
 // You can do stuff like l[2][4]=15 here
 return l;
}
...