object-c nsarray a c array

Lo siento, ni siquiera estoy seguro de cómo preguntar, ya que soy un completo novato en C, punteros y cosas por el estilo. Hay una función que acepta un argumento: char **arg . Si escribo ese argumento así:

 char *cargs[] = {"blah", NULL}; 

Y pasarlo a la función:

 function(cargs); 

funciona. pero … Tengo una NSArray de NSStrings y necesito hacer esta matriz de valores de NSArray . Pensé que debería ser una cuestión de crear una matriz C del mismo número de elementos que NSArray y copiar las cadenas, convirtiéndolas con cStringUsingEncoding . Pero honestamente no tengo idea de cómo hacer esto, ya que me confunde con todos esos consejos y demás. Cualquier ayuda sería apreciada.

Bueno, los pasos aproximados pueden ser:

  1. use el método de conteo de NSArray para saber cuántas NSStrings hay en el NSArray.

  2. usa malloc para asignar memoria para cargs, algo como esto

     char **cargs = (char **) malloc(sizeof(char *) * count); 

    por su ejemplo, es posible que necesite un espacio más para NULL que estará al final de los cargs.

  3. use un bucle y objectAtIndex: de NSArray para obtener NSStrings, como NSString * nsstring = [array objectAtIndex: index];

  4. use el método cStringUsingEncoding: para obtener el c-string, mejor haga una copia

  5. poner estos punteros c-string en cargs

  6. Pasa cargs a tu función, limpia y libera las cosas que necesites.

Es mucho trabajo. Porque la mezcla de c y obj-c. Y un montón de manual malloc y cosas libres, desordenadas. ¿No puedes evitarlo?

–add código de ejemplo–

No estoy muy seguro de cuál es tu verdadera intención. Espero que esto ayude.

 void func(char **arg) { int i; for(i = 0; arg[i] != NULL; i++) { printf("%d=%s\n", i, arg[i]); } } int main(int argc, const char *argv[]) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSString *s1 = [NSString stringWithString:@"first"]; NSString *s2 = [NSString stringWithString:@"second"]; NSString *s3 = [NSString stringWithString:@"third"]; NSArray *array = [NSArray arrayWithObjects: s1, s2, s3, nil]; //by now, we have an NSArray of three NSStrings int count = [array count]; char **cargs = (char **) malloc(sizeof(char *) * (count + 1)); //cargs is a pointer to 4 pointers to char int i; for(i = 0; i < count; i++) { NSString *s = [array objectAtIndex:i];//get a NSString const char *cstr = [s cStringUsingEncoding:NSUTF8StringEncoding];//get cstring int len = strlen(cstr);//get its length char *cstr_copy = (char *) malloc(sizeof(char) * (len + 1));//allocate memory, + 1 for ending '\0' strcpy(cstr_copy, cstr);//make a copy cargs[i] = cstr_copy;//put the point in cargs } cargs[i] = NULL; func(cargs);//call the function to do something for(i = 0; i < count; i++) { free(cargs[i]); } free(cargs); [pool drain]; return 0; } 

@yehnan, tu respuesta es GRANDE , especialmente porque pensé que const ** cStyle[arrays] NO se pudieron crear dinámicamente … ( Desearía que hubiera algún lugar con información básica sobre punteros y variables C y basura … Encuentro que los “primitivos C” más básicos son mucho más desconcertantes que cualquier otra cosa … Aquí está su pequeño ejemplo “empaquetado” en una función … ” para los niños …

 char ** cArrayFromNSArray ( NSArray* array ){ int i, count = array.count; char **cargs = (char**) malloc(sizeof(char*) * (count + 1)); for(i = 0; i < count; i++) { //cargs is a pointer to 4 pointers to char NSString *s = array[i]; //get a NSString const char *cstr = s.UTF8String; //get cstring int len = strlen(cstr); //get its length char *cstr_copy = (char*) malloc(sizeof(char) * (len + 1));//allocate memory, + 1 for ending '\0' strcpy(cstr_copy, cstr); //make a copy cargs[i] = cstr_copy; //put the point in cargs } cargs[i] = NULL; return cargs; }