cocoa - para - NSArray a C array
opengl standard (3)
La respuesta depende de la naturaleza de la matriz C.
Si necesita rellenar una matriz de valores primitivos y de longitud conocida, podría hacer algo como esto:
NSArray* nsArray = [NSArray arrayWithObjects:[NSNumber numberWithInt:1],
[NSNumber numberWithInt:2],
nil];
int cArray[2];
// Fill C-array with ints
int count = [nsArray count];
for (int i = 0; i < count; ++i) {
cArray[i] = [[nsArray objectAtIndex:i] intValue];
}
// Do stuff with the C-array
NSLog(@"%d %d", cArray[0], cArray[1]);
Este es un ejemplo en el que queremos crear una nueva matriz C desde una NSArray
, manteniendo los elementos de la matriz como objetos Obj-C:
NSArray* nsArray = [NSArray arrayWithObjects:@"First", @"Second", nil];
// Make a C-array
int count = [nsArray count];
NSString** cArray = malloc(sizeof(NSString*) * count);
for (int i = 0; i < count; ++i) {
cArray[i] = [nsArray objectAtIndex:i];
[cArray[i] retain]; // C-arrays don''t automatically retain contents
}
// Do stuff with the C-array
for (int i = 0; i < count; ++i) {
NSLog(cArray[i]);
}
// Free the C-array''s memory
for (int i = 0; i < count; ++i) {
[cArray[i] release];
}
free(cArray);
O bien, es posible que desee nil
-terminar la matriz en lugar de pasar su longitud:
// Make a nil-terminated C-array
int count = [nsArray count];
NSString** cArray = malloc(sizeof(NSString*) * (count + 1));
for (int i = 0; i < count; ++i) {
cArray[i] = [nsArray objectAtIndex:i];
[cArray[i] retain]; // C-arrays don''t automatically retain contents
}
cArray[count] = nil;
// Do stuff with the C-array
for (NSString** item = cArray; *item; ++item) {
NSLog(*item);
}
// Free the C-array''s memory
for (NSString** item = cArray; *item; ++item) {
[*item release];
}
free(cArray);
podemos convertir NSArray a c array. si no, ¿qué alternativas hay? [suponga que necesito alimentar la matriz c en las funciones opengl donde la matriz c contiene el puntero de vértice leído desde archivos plist]
Yo sugeriría convertirte, con algo como:
NSArray * myArray;
... // code feeding myArray
id table[ [myArray count] ];
int i = 0;
for (id item in myArray)
{
table[i++] = item;
}
NSArray
tiene un -getObjects:range:
para crear una matriz C para un subrango de una matriz.
Ejemplo:
NSArray *someArray = /* .... */;
NSRange copyRange = NSMakeRange(0, [someArray count]);
id *cArray = malloc(sizeof(id *) * copyRange.length);
[someArray getObjects:cArray range:copyRange];
/* use cArray somewhere */
free(cArray);