2012-04-06 8 views
-1

(Edit: put mögliche Lösung am Ende) erstellenmalloc Unter Verwendung ein 2D-C-Stil-Array meiner Klasse

Ich bin ein C/C++ Programmierer, Objective C lernen iPhone-Apps zu entwickeln. Die Programme, die ich schreiben werde, befassen sich mit großen 2-D-Arrays von Objekten. Ich habe gelesen, dass ich NSArray's von NSArray benutze und über funktionierenden Code verfüge, aber ich versuche zu verstehen, wie man C-Stil-Arrays benutzt, um Overhead zu sparen und zu lernen, was man tun kann und was nicht.

In diesem Fragment enthält MapClass nur zwei Eigenschaften int x und int y. Ich habe das folgende Codefragment, das mit einem statisch definierten Array von 10 x 10 arbeitet.

MapClass *arr[10][10]; 

arr[2][3] = [[MapClass alloc] init]; 
arr[2][3].x = 2; 
arr[2][3].y = 3; 

NSLog(@"The location is %i %i", arr[2][3].x, arr[2][3].y); 
// Output: "The location is 2 3" 

Dies ist ein Beispiel davon mit einem eindimensionalen Array tun und Berechnung, wo die Zelle auf der X- und Y-basiert:

MapClass **arr = (MapClass**) malloc(10 * 10 * sizeof(MapClass *)); 

arr[3 * 10 + 2] = [[MapClass alloc] init]; 
arr[3*10 + 2].x = 2; 
arr[3*10 + 2].y = 3; 

NSLog(@"The location is %i %i", arr[3*10 + 2].x, arr[3*10 + 2].y); 
// Output: "The location is 2 3" 

Meine Frage dies ist: Wie kann ich malloc mein Array als zweidimensionales Array, damit ich die arr [2] [3] Style-Notation verwenden kann, um darauf zuzugreifen?

Alles, was ich versuche, erzeugt verschiedene Fehler wie "Tiefgestellt erfordert die Größe von [Ihrer Klasse], die in nicht zerbrechlichen ABI nicht konstant ist".

Kann mir jemand einen Tipp geben, wie man das macht? Ich habe gelesen und experimentiert und kann es nicht herausfinden. Kann ich mit meinem eindimensionalen Array etwas falsch machen?

Antwort?

Nach herumalbern mit Xzgyb's Antwort, habe ich den folgenden Block arbeiten. Irgendetwas stimmt nicht damit? Vielen Dank!

int dimX = 20; 
int dimY = 35; 

MapClass ***arr = (MapClass***) malloc(dimX * sizeof(MapClass **)); 
for (int x = 0; x < dimX; ++x) 
{ 
    arr[x] = (MapClass **) malloc(dimY * sizeof(MapClass*)); 

} 

for (int x = 0; x < dimX; ++x) 
{ 
    for (int y = 0; y < dimY; ++y) 
    { 
     arr[x][y] = [[MapClass alloc] init]; 
     arr[x][y].x = x; 
     arr[x][y].y = y; 

    } 
} 

for (int x = 0; x < dimX; ++x) 
{ 
    for (int y = 0; y < dimY; ++y) 
    { 
     NSLog(@"%i %i is %i %i", x, y, arr[x][y].x, arr[x][y].y); 

    } 
} 

// Cleanup 
for (int x = 0; x < dimX; ++x) { 
    for (int y = 0; y < dimY; ++y) { 
     [arr[x][y] release]; 
    } 
} 

for (int x = 0; x < dimX; ++x) 
{ 
    free(arr[x]); 
} 

free(arr); 
+0

Das ist keine Antwort auf Ihre Frage, aber ich möchte beachten, dass Sie nicht verwendet haben 'malloc' hier zu beginnen. –

+0

Ja, das Fragment ist statisch zugewiesen und funktioniert. Ich möchte wissen, wie man es mit malloc dynamisch zuordnet. – user1316642

+0

Oh, ich verstehe. Danke für die Klarstellung! –

Antwort

1

Versuchen den gefolgten Code:

MapClass ***arr = (MapClass***) malloc(10 * 10 * sizeof(MapClass *)); 

for (int row = 0; row < 10; ++row) { 
    arr[ row ] = (MapClass **)&arr[ row * 10 ]; 
} 

arr[0][1] = [[MapClass alloc] init]; 
arr[1][2] = [[MapClass alloc] init]; 
+0

Das funktioniert, wenn ich einen arr [0] [x] benutze, aber sobald ich arr [1] [x] oder höher versuche stürze ich mit einer bad_access Ausnahme ab. Ich experimentiere jetzt aber damit, danke. – user1316642

+0

Ich denke, ich habe etwas funktioniert, fügte es zum ersten Post hinzu. Vielen Dank! – user1316642

1

Getestet und es funktioniert gut mit NSMutableString-Klasse und einer Vielzahl von String-Methoden. Ich würde wahrscheinlich empfehlen, die standardmäßigen sendenden Klammern zu verwenden, anstatt die neuere Punktoperatorsyntax zu verwenden, nur um dem Compiler das zu vereinfachen, was Sie eigentlich erreichen wollen.

Die Größe von (ClassName ) sollte die gleiche wie sizeof ([ClassName Klasse]) sein (und Int oder ID für diese Angelegenheit), wenn ich Ihre Bedeutung verstehe. Der Code, den Sie gepostet haben, sollte keinen solchen Fehler verursachen, da alle Zeiger die gleiche Größe haben. Nun, wenn Sie etwas wie sizeof (* someInstanceOfAClass) versucht haben, dann stoßen Sie auf einige Probleme, weil Sie versuchen, genug Speicher zu mallozieren, um 10 * 10 * (die tatsächliche Größe Ihres Objekts) zu passen, was nicht beabsichtigt ist machen. (Und klingt wie das, was Ihre Warnung für soll.)

Verwandte Themen