2009-07-14 7 views
1

Malloc ähnlicheSpeichern/Laden eines 2D-Array mit C NSKeyedArchiver

int **terrain; 
terrain = malloc(sizeof(int*) * mapSize.x); 
for (int i = 0; i < mapSize.x; i++) { 
    terrain[i] = malloc(mapSize.y * sizeof(int)); 
} 

sie verwenden. wie diese NSData konvertieren, bevor

NSData *data=[NSData dataWithBytes:terrain length:(30*sizeof(int*) +30*30*sizeof(int))]; 
[rootObject setValue:data forKey:@"terrain"]; 
[NSKeyedArchiver archiveRootObject: rootObject toFile: path]; 

Laden in NSData dann Umwandlung zurück zu int**

rootObject = [NSKeyedUnarchiver unarchiveObjectWithFile:path]; 
NSData *data = [rootObject valueForKey:@"terrain"]; 
terrain =(int**) [data bytes]; 

Mit diesem Code speichern, wird es die *int Adressen dann Speichern, wenn ich die Daten laden ist es nicht zeigen auf die richtigen Daten mehr? Oder muss ich ein Problem mit dem „Endian“ haben, wie in Documentation

beschrieben Wenn die Adresse Problem ist, sollte ich für Schleife a setzen beim Speichern *int zu NSData konvertieren dann all jene, speichern und neu erstellen die **int mit ein anderer für loop/malloc?

Antwort

1

Ich habe das nicht getestet, aber ich vermute, dass bei den obigen mallocs keine Garantie dafür besteht, dass Sie einen durchgehenden Speicherbereich zugewiesen bekommen.

was könnten Sie tun, ist, die Daten speichern separat für alle mapSize.x Array von Bytes:

int **terrain; 
terrain = malloc(sizeof(int*) * mapSize.x); 
for (int i = 0; i < mapSize.x; i++) { 
    terrain[i] = malloc(mapSize.y * sizeof(int)); 
} 

... 

for (int j = 0; j < mapSize.x; j++) 
{ 
    NSData *data=[NSData dataWithBytes:terrain[j] length:(mapSize.y * sizeof(int))]; 
    [rootObject setValue:data forKey:[NSString stringWithFormat:@"terrain%i", j]]; 
} 

[rootObject setValue:mapSize.x forKey:@"terrain"]; 
[NSKeyedArchiver archiveRootObject:rootObject toFile:path]; 
+0

+1 für den Speicher nicht in einem kontinuierlichen Block. Außerdem archiviert Keith die Zeiger zusammen mit den Daten. Sie sollten Zeiger nicht archivieren, da sie alle falsch sind, wenn sie nicht archiviert werden (die Zeiger werden jedes Mal anders sein). –

0

Ich würde das 2D-Array in NSArrays vor der Archivierung konvertieren, weil es Ihnen eine Menge Ärger sparen.

NSMutableArray* terrainForArchiving = [NSMutableArray arrayWithCapacity:mapSize.x]; 
for(int col = 0; col < mapSize.x; ++col){ 
    NSMutableArray* terrainCol = [NSMutableArray arrayWithCapacity:mapSize.y]; 
    for(int row = 0; row < mapSize.y; ++row){ 
     [terrainCol addObject:[NSNumber numberWithInt:terrain[col][row]]]; 
    } 
    [terrainForArchiving addObject:terrainCol]; 
} 

[NSKeyedArchiver archiveRootObject:terrainForArchiving];