1

こんなマロック

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アドレスが保存され、データをロードすると正しいデータを指しなくなりますか? または、ドキュメントに記載されている「エンディアン」に問題がありますか?

アドレスの問題である場合、*intNSData に変換するために保存するときに for ループを配置し、それらをすべて保存して**int、別の for ループ/malloc で再作成する必要がありますか?

4

2 に答える 2

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];
于 2009-07-14T07:16:22.347 に答える
0

アーカイブする前に 2D 配列を NSArray に変換します。これにより手間が省けるからです。

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];
于 2009-07-21T23:05:30.237 に答える