[C con Clase] Array de cadenas de caracteres y paso de parámetros en C.

David fire ddfire en gmail.com
Mie Dic 10 15:03:11 CET 2008


usa una lista  de punteros a cadenas.
cada vez que tenes una nueva cadena haces



lista.add(new cadena());

cadena es un tipo definido por vos que seria char [tamanio];


si lo estas haciendo en C seria
punetro=malloc(sizeof(cadena))

lista.add(puntero)

lista seria una estructura con una funcion como miembro, puntero a funcion.

no me acuerdo el uso exacto de malloc.



David

El 10 de diciembre de 2008 10:40, gmh2000 <helder1986 en gmail.com> escribió:

> Gracias a todos. Me he comido bien el coco pero parece que cada vez la
> solución va a peor.
>
> Da un warning y desde luego no funciona:
> file_names->string_pointers = &d-> d_name;
>
> No da errores pero la salida son cientos de caracteres sin sentido:
> file_names->string_pointers = (char (*)[11]) d-> d_name;
>
> Sin errores de compilación pero el programa casca y se cierra solo:
> strncpy(file_names->string_pointers[file_names->number_of_strings++], d->
> d_name, 11 );
>
> Todas estas soluciones son SIN usar malloc(). Lo he intentado con esta
> función pero me da el error de siempre sobre los tipos en las asignaciones
> (en el código  he puesto mi intento más lógico).
>
> Por otra parte no entiendo para que hay que reservar memoria con malloc()
> y/o cuando y porqué hay que liberarla con free().
>
> Recuerdo que la versión en la que asignaba memoria de la forma "facil" con
> un array medio-funcionaba. Me explico: cuando pedía que me mostrara las
> cadenas algunas veces mostraba lo deseado, y otras veces algunas cadenas
> correctamente y otras en chino. Haber si esto ayuda algo para que me
> ayudeis. ¿Esto puede ser debido a que la cadenas las copiaba por referencia
> y no por valor?
>
> Otra pregunta: ¿al hacer la copia por referencia el recolector de basura no
> elimina el resto de la estructura donde está contenido d->d_name?
>
> Haber si me podeis echar el vigésimo-noveno cable. Quizás sea mejor partir
> de la solución que medio funcionaba, pero supongo que sería muy bueno
> quedarme con todos estos conceptos claros para un futuro, en cualquier
> caso...
>
> Otra duda conceptual es que cuando pongo a las cadenas una longitud de 11,
> como se ve en el código, es porque la inmensa mayoría tienen 10 caracteres.
> Reservo 11 porque creo recordar que el último caracter es el /0. ¿Esto lo
> hago bien? ¿Puede ser el causante de los problemas esto?
>
> Ahí va el resumen del código, con el intento de malloc:
>
>
>
>
> struct strings_list
> {
>  char (*string_pointers)[11];
>   unsigned int number_of_strings;
> };
>
> struct strings_list file_names;
>
> get_file_names("/usr/lib/locale/", &file_names);
>
> /* Acceso a las cadenas */
> for (i = 0, i < file_names.number_of_strings; i++)
> {
>  muestra_cadena(file_names.string_pointers[i])
> }
>
>
>
>
>
> void get_file_names(const char *directory, struct strings_list *file_names)
> {
>   struct dirent *d;
>   struct stat buf;
>   DIR *dir;
>   file_names-> number_of_strings = 0;
>   if ((dir=opendir(directory)) == NULL)
>   {
>      /* error */
>   }
>
>   while ((d=readdir(dir)) != NULL)
>   {
>      /* The above line avoid infinite loop */
>      if (strcmp(d->d_name,".")!=0 && strcmp(d-> d_name, "..")!=0)
>      {
>       /* la línea de abajo da mi error preferido: incompatible types in
> assignment */
>      file_names->string_pointers[file_names->number_of_strings] = (char *)
> malloc(11* sizeof(char));
>
>  strncpy(file_names->string_pointers[file_names->number_of_strings++], d->
> d_name, 11 );
>
>      }
>
>   }
>
>   closedir(dir);
>
> }
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>



-- 
(\__/)
(='.'=)This is Bunny. Copy and paste bunny into your
(")_(")signature to help him gain world domination.
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20081210/05894fd5/attachment.html>


Más información sobre la lista de distribución Cconclase