2009-07-14 53 views
1

malloc的這樣保存/加載2D數組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)); 
} 

使用它。 轉換爲NSData的這樣節省

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

加載到NSData的再轉換回int**

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

有了這個代碼之前,是它節省了*int地址,然後當我加載數據就沒有指向更正確的數據? 還是我跟在 Documentation

中描述的「字節順序」一個問題,如果它是地址的問題,我應該把一個for循環保存到*int轉換爲NSData的然後保存所有這些,並重新創建**int與時另一個for循環/ malloc?

回答

1

我還沒有測試過這個,但我懷疑用malloc上面沒有保證你將有一個連續的內存分配區域。

你可以做的是單獨保存的數據字節的所有mapSize.x陣列:

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表示內存不在連續塊中。另外,Keith實際上是將這些指針與數據一起歸檔。您不應歸檔指針,因爲它們在未歸檔時都會出錯(指針每次都會有所不同)。 – 2009-07-21 22:57:22

0

我將二維數組轉換成NSArrays歸檔之前,因爲它會爲你節省很多的麻煩。

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];