Discussion:
Sigo guerreando con los punteros a char
(demasiado antiguo para responder)
Han Solo
2003-08-25 10:39:58 UTC
Permalink
Hola a todos de nuevo.

Pues eso, sigo con la guerra de punteros a char. Supongamos lo
siguiente

#include <stdio.h>
#include <stdlib.h>

int main (void){

char aux[80];
char **nom_fich_mod_E;
FILE f_datos;
int nmat,i;

f_datos=fopen("datos.dat","r");

fscanf(f_datos,"%s",aux);
nmat=atoi(aux);
nom_fich_mod_E=(char **)malloc(nmat*sizeof(**nom_fich_mod_E));
for (i=0;i<nmat;i++){
fscanf(f_datos,"%s",aux);
nom_fich_mod_E[i]=(char *)calloc(1,strlen(aux));
strcpy(nom_fich_mod_E[i],aux);
}
fclose(f_datos);

}

Siendo datos.dat:

2
aaaaaa
bbbbbbbbb


El caso es que iba a poner que no funciona, pero he probado a
compilarlo y no da errores. Ejecuntándolo con el depurador, veo que
asigna los punteros correctamente. El caso es que algo parecido que
tengo no funciona. Sólo reserva memoria para un elemento, con
lo que en el segundo bucle pega un segfault. Lo que no acabo de ver es
por qué (aunque en algún momemto llegó a funcionar; pura chiripa,
supongo...). He escrito esto copiando y pegando, así que debe haber
algún error de concepto que el programa "grande" no cuela.

Gracias a todos.

Un Saludo
- --
Han Solo
The Rebel Alliance

Emacs is not on every system

So what? [...] Do you tell your administrative people to stick with
notepad.exe? Do you tell your fat kids they can only have the crummy
games that come with their video games or plain dress that comes with
Barbie?
Martin J. Sanchez
2003-08-25 12:15:56 UTC
Permalink
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Hola a todos de nuevo.
Pues eso, sigo con la guerra de punteros a char. Supongamos lo
siguiente
#include <stdio.h>
#include <stdlib.h>
int main (void){
char aux[80];
char **nom_fich_mod_E;
FILE f_datos;
int nmat,i;
f_datos=fopen("datos.dat","r");
fscanf(f_datos,"%s",aux);
nmat=atoi(aux);
nom_fich_mod_E=(char **)malloc(nmat*sizeof(**nom_fich_mod_E));
for (i=0;i<nmat;i++){
fscanf(f_datos,"%s",aux);
nom_fich_mod_E[i]=(char *)calloc(1,strlen(aux));
strcpy(nom_fich_mod_E[i],aux);
}
fclose(f_datos);
}
2
aaaaaa
bbbbbbbbb
El caso es que iba a poner que no funciona, pero he probado a
compilarlo y no da errores. Ejecuntándolo con el depurador, veo que
asigna los punteros correctamente. El caso es que algo parecido que
tengo no funciona.
...
Deberias haber puesto el codigo original.

Aqui en lugar de
fscanf(f_datos,"%s",aux);
nmat=atoi(aux);
yo habria usado
if(fscanf(f_datos, "%d", &nmat)!=1)
nmat=0;
nom_fich_mod_E[i]=(char *)calloc(1,strlen(aux));
deberia ser:
nom_fich_mod_E[i]=(char *)calloc(1,strlen(aux)+1);
Recuerda que hay que reservar espacio paa el nul.

Para obtener las cadenas individuales, es mucho mas seguro utilizar
fgets y luego si es necesario sscanf.

Un saludo,
Martin.
Han Solo
2003-08-25 12:13:59 UTC
Permalink
Post by Han Solo
nom_fich_mod_E[i]=(char *)calloc(1,strlen(aux));
la he cambiado por

nom_fich_mod_E[i]=(char *)calloc(1,strlen(aux)+1);

y ahora funciona. Hay que dejar sitio para el "\0" del final del
array. Si sigo metiendo la pata, que allguien me lo diga, porque ahora
parece que funciona, pero tampoco estoy seguro de que fuera eso :-]

Un Saludo
- --
Han Solo
The Rebel Alliance

Emacs is not on every system

So what? [...] Do you tell your administrative people to stick with
notepad.exe? Do you tell your fat kids they can only have the crummy
games that come with their video games or plain dress that comes with
Barbie?
FR
2003-09-01 12:35:57 UTC
Permalink
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Post by Han Solo
nom_fich_mod_E[i]=(char *)calloc(1,strlen(aux));
la he cambiado por
nom_fich_mod_E[i]=(char *)calloc(1,strlen(aux)+1);
igual digo una barbaridad, pero si eso lo haces en un for,
estás reservando 2 unidades de memoria por posición en el char[]...

no seria mejor el nom_fich_mod_E[i]=(char *)calloc(1,strlen(aux)); y
hacer que el bucle cuente una iteración de mas?
y ahora funciona. Hay que dejar sitio para el "\0" del final del
array. Si sigo metiendo la pata, que allguien me lo diga, porque ahora
parece que funciona, pero tampoco estoy seguro de que fuera eso :-]
Un Saludo
- --
Han Solo
The Rebel Alliance
Emacs is not on every system
So what? [...] Do you tell your administrative people to stick with
notepad.exe? Do you tell your fat kids they can only have the crummy
games that come with their video games or plain dress that comes with
Barbie?
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.2 (GNU/Linux)
Comment: Processed by Mailcrypt 3.5.6 <http://mailcrypt.sourceforge.net/>
iD8DBQE/Sf2G4FjpJaPEp20RAidtAKCuGwOjPT+cLbOJLAguhO0y82aQYQCg5czJ
dswbab9YM7i/IDPnb8aY8io=
=YxXN
-----END PGP SIGNATURE-----
J. L.
2003-08-25 14:46:14 UTC
Permalink
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Hola a todos de nuevo.
Pues eso, sigo con la guerra de punteros a char. Supongamos lo
siguiente
#include <stdio.h>
#include <stdlib.h>
int main (void){
char aux[80];
char **nom_fich_mod_E;
FILE f_datos;
int nmat,i;
f_datos=fopen("datos.dat","r");
fscanf(f_datos,"%s",aux);
nmat=atoi(aux);
nom_fich_mod_E=(char **)malloc(nmat*sizeof(**nom_fich_mod_E));
Ojo: sizeof(**nom_fich_mod_E) == 1, que no es lo que quieres :-)
Prueba con

nom_fich_mod_E=malloc(nmat*sizeof *nom_fich_mod_E);

y olvidate de l fastidioso cast.
for (i=0;i<nmat;i++){
fscanf(f_datos,"%s",aux);
nom_fich_mod_E[i]=(char *)calloc(1,strlen(aux));
Aqui te falta 1 para el byte final.

nom_fich_mod_E[i]=calloc(1,strlen(aux)+1);
strcpy(nom_fich_mod_E[i],aux);
}
fclose(f_datos);
}
2
aaaaaa
bbbbbbbbb
El caso es que iba a poner que no funciona, pero he probado a
compilarlo y no da errores. Ejecuntándolo con el depurador, veo que
asigna los punteros correctamente. El caso es que algo parecido que
tengo no funciona. Sólo reserva memoria para un elemento, con
lo que en el segundo bucle pega un segfault. Lo que no acabo de ver es
por qué (aunque en algún momemto llegó a funcionar; pura chiripa,
supongo...). He escrito esto copiando y pegando, así que debe haber
algún error de concepto que el programa "grande" no cuela.
Gracias a todos.
Un Saludo
- --
Han Solo
The Rebel Alliance
Saludos

Jose L. Sanchez Garrido
Loading...