[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