malloc???? Pero si se trata de un argv!!! que ya está allocatado y disponible 
de por vida!

lo normal sería:

char* p;
...
p = argv[1];

O mejor, como hay varios ficheros:

char** p;
int n;
...
p = &argv[1]
n = argc - 1;

y quitar todos los strcpy y todos los strtok

--
Francisco Moya Fernandez      Computer Architecture and Networks Group
Assistant Professor
[EMAIL PROTECTED]                      School of Computer Science
Fax:(+34 926) 29 53 54                University of Castilla-La Mancha
Tel:(+34 926) 29 54 83                      http://www.inf-cr.uclm.es/



-----Mensaje original-----
De: [EMAIL PROTECTED] en nombre de Sergio Pérez Camacho
Enviado el: sáb 12/01/2008 17:51
Para: Manuel David Jiménez Patiño
CC: [email protected]
Asunto: Re: [CRySoL] C en tiempo real
 
 char *argumento_recibido_de_la_unidad_de_control ="";
...

¿Esto qué es?

C no reserva memoria automáticamente para los punteros (bueno, no más de lo
que ocupa el apuntador). Es decir, que lo que haces al copiar el argumento 1
a este sitio es sobreescribir vete tú a saber dónde.

Usa, por ejemplo malloc().

Además, fíjate que hace strcpy(). Si alguien mete una cadena como argumento
que sea mayor que el espacio reservado que tengas, esto es, o como array
"char c[30];" ... o como puntero a char "char* c;  c = (char*)
malloc(30*sizeof(char));", ¿qué pasaría?

Te recomiendo que fijes un límite coherente, y que reserves memoria al saber
lo que mide el argumento, siempre que sea menor que ese límite. Si no, piii,
error.

De todos modos, esto es C básico. Por propia experiencia (a mi me ha pasado
y me pasa), a veces pensamos que sabemos C y no es así. Hay un libro que es
la biblia del estándar... ya sabes cual es.



El día 12/01/08, Manuel David Jiménez Patiño <[EMAIL PROTECTED]>
escribió:
>
> Hola querido Paco, ayer cuando escribí el e-mail me pasé  todo el día
> intentando solucionar el dichoso problema, por lo que mi duda salió escrita
> como salió.
>
> Nada más enviar el e-mail me di cuenta que me había equivocado al
> escribir:
>
> strcpy(argumento_recibido_de_la_unidad_de_control, argv[0]);
>
> Lógicamente tengo:
>
> strcpy(argumento_recibido_de_la_unidad_de_control, argv[1]);
>
>
> Como tú bien dices argv[0] es el nombre del ejecutable.
>
>
> El compilador me daba fallo en esta línea:
>
> strcpy(argumento_recibido_de_la_unidad_de_control, argv[1]);
>
> Porque me decía que *argumento_recibido_de_la_unidad_de_control *no estaba
> inicializado, por lo que al hacer simplemente:
>
> char *argumento_recibido_de_la_unidad_de_control ="";
>
> me dejó vivir en paz.
>
> Por lo demás, sea guarro o asqueroso -- (debería seguir años picando
> código,   leyendo código y manuales para poder decir que programo  (sms
> subliminal para los que dicen que programar lo hace cualquiera)) --no
> entiendo por qué no me funciona, debería funcionarme tal y como lo hace
> cuando lo ejecuto por línea de comandos.
>
> Pero en fin, seguiré intentándolo.
>
> Saludos y gracias Paco por contestar.
>
>
> **************************************************************************
> "Levántate ponte en pie y defiende tus derechos, levánte ponte en pie y no
> abandones la lucha" Bob Marley.
>
>
>
>
>
>
>
>
>
> 2008/1/12 FRANCISCO MOYA FERNANDEZ < [EMAIL PROTECTED]>:
>
> >  Hombre, antes de nada decirte que me parece un poco guarro. No se por
> > qué tienes que meterlo todo en un argumento cuando puedes pasar (de forma
> > mucho más simple) varios.
> >
> > Por otro lado al execv le pasas solo el argv[0] que ni siquiera es un
> > argumento del programa, sino el nombre del propio programa.
> >
> > Pero la parte más grave está en
> >
> >
> > char *argumento_recibido_de_la_unidad_de_control;
> > strcpy(argumento_recibido_de_la_unidad_de_control, argv[0]);
> >
> > ¡No es lo mismo un puntero que un array! Estás copiando el argv[0] en
> > cualquier parte porque el puntero no está inicializado. Lo que pase a partir
> > de esa línea puede ser cualquier cosa.
> >
> > En cuanto a ejecutarlo en línea de comandos no me creo que funcione. Por
> > una razón muy sencilla, al ejecutarlo en línea de comandos el argv[0] es,
> > como debe ser, el ejecutable. Por tanto tú crees que funciona, pero no lo
> > hace porque realmente está diciendo que el ejecutable existe (cosa que ya
> > sabiamos).
> >
> > Saludos,
> > Paco
> >
> > --
> > Francisco Moya Fernandez      Computer Architecture and Networks Group
> > Assistant Professor
> > [EMAIL PROTECTED]                      School of Computer Science
> > Fax:(+34 926) 29 53 54                University of Castilla-La Mancha
> > Tel:(+34 926) 29 54 83                      http://www.inf-cr.uclm.es/
> >
> >
> >
> > -----Mensaje original-----
> > De: [EMAIL PROTECTED] en nombre de Manuel David Jiménez
> > Patiño
> > Enviado el: vie 11/01/2008 22:44
> > Para: [email protected]
> > Asunto: [CRySoL] C en tiempo real
> >
> > Hola muchachos y muchachas os comento la última penuria:
> >
> > estoy utilizando:
> >
> > execv(nombre_del_ejecutable,línea de ordenes);
> >
> > por ejemplo hago:
> >
> >   char *argv[] =
> >
> > {"ruta_de_un_archivo_uno#ruta_de_un_archivo_dos#ruta_de_un_archivos_tres"};
> > // estas rutas las obtengo del proceso padre en tiempo real.( no lo hago
> >
> > exactamente como lo hemo mostrado antes,
> >
> > concretamente utilizo varias veces strcat, pero vamos para exponer mi
> > duda
> >
> >
> > puede valer)
> >
> > a = execv(etapa_dos,argv);
> >
> >
> >
> >
> > Luego en el proceso etapa_dos:
> >
> > recojo argv.
> >
> > char *argumento_recibido_de_la_unidad_de_control;
> >
> > strcpy(argumento_recibido_de_la_unidad_de_control, argv[0]);
> >
> >
> > y con la función  strtok saco los tokens (rutas de los archivos)
> > delimitados
> > por el caracter #.
> >
> > es decir, que consigo sacar a partir de a*
> > rgumento_recibido_de_la_unidad_de_control*  por separado:
> >
> > ruta_de_un_archivo_uno
> >
> > ruta_de_un_archivo_dos
> >
> > ruta_de_un_archivo_tres
> >
> >
> > Pero en este proceso comprueba la existencia de los mismos y me dice que
> > no
> > existen(cuando yo mismo los estoy viendo que si que existen).
> >
> > El fallo anterior es problandolo en tiempo real e incluso haciendo que
> > antes
> > de llamar  al proceso hijo se esperen 85 segundos(para que de tiempo más
> > que
> > suficiente a que se creen los archivos).
> >
> > En cambio ejecuto el programa desde línea de comandos metiendole rutas
> > de
> > archivos ya existentes y el programa no falla.
> >
> >
> > No sé si me he explicado bien.
> >
> > Pero vamos, ¿A alguno de ustedes le ha pasado esto alguna vez?
> >
> > Saludos no cordiales.
> >
> >
> > ********************************************************************************************
> > "El viento viene y el viento se va, por la frontera, la suerte viene y
> > la
> > suerte se va, por la frontera" , Manu Chao
> >
> >
>
> _______________________________________________
> CRySoL mailing list
> http://crysol.inf-cr.uclm.es/
> https://arco.inf-cr.uclm.es/cgi-bin/mailman/listinfo/crysol
>
>

_______________________________________________
CRySoL mailing list
http://crysol.inf-cr.uclm.es/
https://arco.inf-cr.uclm.es/cgi-bin/mailman/listinfo/crysol

Responder a