[C con Clase] Array de cadenas de caracteres y p aso de paráme tros en C.

srd4121 en njit.edu srd4121 en njit.edu
Vie Dic 5 18:52:34 CET 2008


Hola GMH,

Mensaje citado por: gmh2000 <helder1986 en gmail.com>:

> Hola. Aclaro que los nombres de las funciones y variables NO son las de
> mi programa. He puesto esos nombres para que lo entedais mejor y que
> pueda servir para todo el mundo. ¿No es eso lo que se pretende en esta
> web?
> 

Cierto, pero el problema está en que no nos dices todos los tipos de los datos 
que usas ni tampoco la implementación para lo que estás haciendo lo cual te da 
error.

> Bien. No existe tal función. En realidad es una cadena de un registro
> desde donde hago la asignación. Sin más ahí van los trozos de código:
> 
> NOTA: he puesto una florecita donde el compilador da el error. Donde
> pone "error" no da problemas. Eso es para tratar las excepciones en otro
> momento.
> 
> 

Veamos el código fuente.

> 
> struct strings_list
> {
>   char (*string_pointers)[40];
>   unsigned int number_of_strings;
> };
> 
> struct strings_list file_names;
> 
> 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) 
> 		{
> 		  file_names->string_pointers = d->d_name; /*@->-*/

Obviamente, esto es un error, porque los tipos de los operandos no concuerdan. 
Tenemos lo siguiente,

<char (*)[40]> = <char *>

Esto sería lo siguiente:
file_names->string_pointers = &d->d_name;

Si esto no funcionare, entonces intenta con un "cásting":
file_names->string_pointers = (char (*)[40]) d->d_name;


El gran problema es que no creas memoria para esta lista de cadenas de 
caracteres que quieres crear. Deberías usar 'malloc()' y posiblemente 'realloc
()' para ir adjudicando memoria en cada iteración.

El otro problema es que no estás copiando cadenas. Deberías usar la 
función 'strcpy()' o incluso 'strncpy()'. Por ejemplo,

strncpy( file_names->string_pointers[number_of_strings], d->d_name, 40 );


Espero haber aclarado el asunto.

Steven





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