2012-01-07 12 views
6

chcę zrobić coś osiągnąć takiego w Objective-CZwracanie tablicy 2D C z funkcją Objective-C

+(int[10][10])returnArray 
{ 
    int array[10][10]; 
    return array; 
} 

Jednak daje to „tablica inicjator musi być lista inicjator” błąd kompilatora. Czy to w ogóle możliwe?

Odpowiedz

8

Nie można zwrócić tablicy (dowolnego wymiaru) w C lub w Objective-C. Ponieważ tablice nie są wartościami l, nie można przypisać wartości zwracanej do zmiennej, więc nie ma sensu, aby coś takiego się wydarzyło. Możesz jednak obejść to. Musisz zwrócić wskaźnik, lub ciągnąć trick jak oddanie swoją tablicę w strukturze:

// return a pointer 
+(int (*)[10][10])returnArray 
{ 
    int (*array)[10][10] = malloc(10 * 10 * sizeof(int)); 
    return array; 
} 

// return a structure 
struct array { 
    int array[10][10]; 
}; 

+(struct array)returnArray 
{ 
    struct array array; 
    return array; 
} 
+0

Patrząc na ten kod, wydaje się, że używam 'tablica' w wielu różnych przestrzeniach nazw. Sprzątnę to, jeśli uważasz, że to jest mylące. –

+0

Podczas korzystania z metody struct, w jaki sposób uzyskać dostęp do struct jako tablicy 2d? Na przykład, gdy robię 'int i = array [0] [1]' otrzymuję "wartość subskrybowana nie jest tablicą, wskaźnikiem ani wektorem" – RSH1

+0

Musisz uzyskać dostęp do elementu struktury. 'int i = array.array [0] [1]' powinno zrobić to za Ciebie. –

1

Innym sposobem można zrobić to z obiektywnego C++, jest zadeklarować tablicę następująco:

@interface Hills : NSObject 
{ 


@public 
    CGPoint hillVertices[kMaxHillVertices]; 
} 

Oznacza to, że tablica jest własnością instancji klasy Hills - tj. Zniknie, gdy ta klasa to zrobi. Następnie można uzyskać dostęp z innej klasy w następujący sposób:

_hills->hillVertices 

Wolę technik Carl Norum opisują, ale chciałem przedstawić to jako opcja, która może być przydatna w niektórych przypadkach - na przykład do przekazywania danych do OpenGL od A klasa konstruktora.