Как вернуть двумерный массив в стиле C из метода Objective C? - PullRequest
0 голосов
/ 31 августа 2011

У меня быстрый вопрос:

Как вернуть двумерный массив в стиле C из метода Objective C, содержащий указатели на различные объекты, к которым я могу обратиться, используя myArray [x] [y].someProperty или [myArray [x] [y] someMethodCall: myArgument]?Я предполагаю, что что-то вроде NSData нужно было бы использовать для «упаковки» возвращаемых данных, которые будут распакованы на другом конце.

Объекты, к которым необходимо обращаться таким образом, хранятся внутриКласс Objective C как одномерный NSMutableArray, который имеет емкость, равную width * height.Я знаю, что здесь должно произойти какое-то волшебство указателя для преобразования 2D-массива в стиле C и фактического 1-мерного NSMutableArray.

Возможно ли это?Keven Tipping

Ответы [ 4 ]

3 голосов
/ 31 августа 2011

Функция C (или Objective-C) не может вернуть массив. Однако он может вернуть структуру, содержащую массив:

struct array {
    int v[5][5];
};

struct array f() {
    struct array a;
    // fill 'a' here
    a.v[0][0] = 1;
    ...
    return a;
}
0 голосов
/ 31 августа 2011

Вы можете установить функцию obj-c для возврата NSArray.И внутри этого NSArray есть NSArray.Таким образом, это все равно, что возвращать массив NSArray.
yourNSArray = [self getArray]; //returns an array of array

После того, как у вас есть NSArray, вы можете затем перенести его в двумерный массив в стиле C:
c[0][0] = [[[yourNSArray objectAtIndex:0] objectAtIndex:0] intValue];
c[0][1] = [[[yourNSArray objectAtIndex:0] objectAtIndex:1] intValue];

0 голосов
/ 31 августа 2011

Если вам действительно нужно иметь возможность индексировать, например, [x] [y], и вы заботитесь об управлении памятью, возможно, вы могли бы создать класс-обертку, который при инициализации mallocs id ** (или соответствующий класс, еслиВы знаете заранее) длины x_max, и заполняет каждый x malloc длины y_max.Тогда, очевидно, все это нужно освободить в методе dealloc.Вы можете назвать это с помощью wrapper.array [x] [y].Вы можете даже хранить длины, чтобы вы могли спросить упаковщика, насколько велик его массив.

Одно: я не уверен, насколько хорошо malloc играет с Apple [Class alloc].Возможно, сначала стоит это проверить.

0 голосов
/ 31 августа 2011

Нет проблем с объявлением многомерного массива объектов Obj-C в стиле C и доступа

n = myArray[x][y].myProperty;

или do

[myArray[x][y] someMethod: someArgument];

Это похоже на использование одной переменной, вместо элемента массива.Но это простой массив в стиле C ссылок на объекты, а не объект.

Вы хотите что-то другое.Ваш массив - это массив внутри класса, и вы хотите получить доступ к элементам.Чтобы получить доступ к элементам, сделайте то же самое с одномерными массивами, но, например,

a = [my2DimArray objectAtIndexX: x indexY: y];

и

[my2DimArray replaceObjectAtIndexX: x indexY: y withObject: myObject];

или

[my2DimArray addRow: myNSArray];

и

RV2DimArray *my2DimArray = [RV2DimArray arrayWithX: 17 Y: 39];

Или, если вы собираетесь больше:

RVMultiDimArray *a = [[RVMultiDimArray alloc] initWithDimensions: 4, 4, 8, 0];

и т. Д. *

...