standard para mac explained cocoa opengl

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