podemos convertir NSArray en c array. . Si no lo alternativas existen [supongo que necesito para alimentar la matriz C en funciones de OpenGL, donde la matriz C contiene puntero del vértice leer de archivos plist]NSArray to C array
Respuesta
La respuesta depende de la naturaleza de la matriz C.
Si necesita rellenar una matriz de valores primitivos y de longitud conocida, se 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]);
He aquí un ejemplo en el que queremos crear un nuevo C-matriz a partir de una NSArray
, manteniendo los elementos de 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
termine los de la matriz en lugar de pasar su longitud alrededor:
// 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);
que sugeriría para convertir a sí mismo, 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 método -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);
Sin embargo, eso no convertirá los objetos NSNumber a un tipo numérico primitivo. El interlocutor necesita esa conversión para usar la matriz C con OpenGL; debido a eso, también podrían poblar por completo la matriz C ellos mismos, sin tener que poner NSNumbers en ella. –
ahhh! No vi el requisito de OpenGL para el problema. En ese caso sí, iterar la matriz manualmente sería apropiado. –
- 1. JSON to javaScript array
- 2. convert std: vector to NSArray
- 3. Word Array to String
- 4. object to string array
- 5. Numpy matrix to array
- 6. Scala: InputStream to Array [Byte]
- 7. String to Char array Java
- 8. Objeto Byte Array to Image
- 9. PHP Array to String equivalent
- 10. convert System :: array to std :: vector
- 11. Join Array from startIndex to endIndex
- 12. numpy array of chars to string
- 13. add element to ruby array return new array
- 14. Cast Dictionary KeyCollection to String array
- 15. Java: Casting Object to Array type
- 16. rvalue-reference to array: ¿puede suceder realmente?
- 17. Analizando muilti dimensional Json array to Python
- 18. C# Splitting An Array
- 19. Objective-C class -> string like: [NSArray className] -> @ "NSArray"
- 20. Cómo usar NSArray del objeto NSArray en el objetivo c?
- 21. Objetivo C - Subclase de NSArray
- 22. obteniendo NSArray longitud/recuento - Objetivo C
- 23. Tratar C cstyle array como std :: array
- 24. NSMutableArray a NSArray en C objetiva
- 25. php to C# converter
- 26. C++ Clasificación clase Array
- 27. C array a PyArray
- 28. Objetivo C Boolean Array
- 29. C# Vectorized Array Addition
- 30. C: array estático
Esta es una gran respuesta, me gustaría hasta pudiera votar más de una vez. Tengo una sugerencia que es que el uso del tipo 'NSString **' está un poco ofuscado. Sugiero usar '[NSData initWithBytesNoCopy: length: freeWhenDone:]' con el puntero que devuelve malloc y el tamaño de la matriz. – alfwatt
Probé el segundo enfoque que usa malloc, creo que requiere que se desactive el arco. Al menos, así es como lo hice funcionar. Tal vez el arco no existía cuando se formuló esta pregunta ... –