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
