2011-02-12 19 views
5

Estoy trabajando en la serialización de una clase que admita NSCoding. Configuré encodeWithCoder y initWithCoder, y todos los tipos de datos estándar de Objective C funcionan bien.Codificación de una matriz de estilo C de ints

Lo que estoy luchando es cómo codificar unas pocas matrices en C simples. Por ejemplo:

int bonusGrid[5]; 
int scoreGrid[10][10]; 
int solutionGrid[10][10]; 
int tileGrid[10][10]; 

corto de romperlos y codificar cada int uno por uno, no estoy seguro de cómo tratar con ellos. ¿Hay una forma "estándar" de manejar matrices en C?

Gracias!

+1

¿Estará utilizando los datos en otras computadoras? ¿Habrá problemas endian? – jswolf19

+0

iPhone y iPad solamente. Tal vez Mac algún día, pero eso no es una certeza. – Axeva

Respuesta

7

Una forma sería utilizar NSData para envolver las matrices.

- (void)encodeWithCoder:(NSCoder *)coder { 
    [coder encodeObject:[NSData dataWithBytes:(void*)bonusGrid length:5*sizeof(int)] forKey:@"bonusGrid"]; 
    [coder encodeObject:[NSData dataWithBytes:(void*)scoreGrid length:10*10*sizeof(int)] forKey:@"scoreGrid"]; 
    ... 
} 

- (id)initWithCoder:(NSCoder *)coder 
    if((self = [super initWithCoder:coder])) { 
     NSData *data = [coder objectForKey:@"bonusGrid"]; 
     int *temporary = (int*)[data bytes]; 
     for(unsigned char i = 0; i < 5; ++i) bonusGrid[i] = temporary[i]; 
     data = [coder objectForKey:@"scoreGrid"]; 
     temporary = (int*)[data bytes]; 
     for(unsigned char i = 0; i < 10; ++i) 
      for(unsigned char j = 0; j < 10; ++j) 
       scoreGrid[i][j] = temporary[i*10 + j]; 
     ... 
    } 
    return self; 
} 

También es posible usar memcpy() para mover los datos de nuevo en sus matrices, pero no es adecuada y no se garantiza que funcione en todos los sistemas (que funciona en el iPhone y Mac).

+0

Gracias por la respuesta. Tengo curiosidad por saber por qué estás usando la matriz temporal cuando recuperas la bonificaciónGrid en lugar de solo utilizar la bonificación de la red. – Axeva

+0

bonusGrid es una matriz, pero el método de bytes devuelve un puntero (que se liberará cuando se libere el objeto NSData). Intentar asignar un puntero a una matriz es ilegal y provocará una advertencia o un error (no recuerdo cuál, pero creo que es un error). Debe copiar el contenido del puntero a la ubicación de la matriz. – ughoavgfhw

+0

Gotcha. Tuyo es el enfoque que probablemente tomaré. Parece una pena que no haya una manera más fácil de hacerlo. Apple proporciona una forma de manejar los tipos C nativos, pero no las matrices de esos tipos? Eso es un descuido en mi libro. – Axeva

0

Ver la respuesta a la pregunta this. Detalla lo que necesitaría hacer para convertir la matriz C en un objeto NSArray.

+0

Pensé en este enfoque. Sin embargo, parece que puede llevar mucho tiempo. No estamos hablando de una tonelada de datos, sino de recorrer cada valor, crear un NSNumber y agregarlo a un NSMutableArray, parece mucho trabajo. – Axeva

Cuestiones relacionadas