Сохранение / загрузка 2D C-массива с помощью NSKeyedArchiver - PullRequest
1 голос
/ 14 июля 2009

Маллок, как это

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, а затем, когда я загружаю данные, он больше не указывает на правильные данные? Или у меня есть проблема с "порядком байтов", как описано в Документация

Если это проблема с адресом, должен ли я сохранять цикл for при сохранении, чтобы преобразовать *int в NSData, затем сохранить все и воссоздать **int с другим для loop / malloc?

Ответы [ 2 ]

1 голос
/ 14 июля 2009

Я не проверял это, но я подозреваю, что с помощью вышеупомянутых 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 голосов
/ 22 июля 2009

Я бы преобразовал 2D-массив в 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];
...