Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Visual C++ 7 y sus triquiñuelas...

Iniciado por MChiz, 23 de Febrero de 2003, 11:41:37 PM

« anterior - próximo »

synchrnzr

                               
CitarHago varios "Log()'s" durante la ejecución, hasta que peta y s0lo se guardan algunos (¿?) cuando en el debug se guardan todos. Estos logs no estan en bucles ni ifs ni nada , cosa rara donde las haya.

Asegúrate que guardas la información. Si sólo haces un write() o fprintf() o lo que sea no se te guardará todo porque estará cacheado y al petar el programa no llegará a escribirse al HD.

Puedes utilizar alguna función tipo flush() o también puedes abrir y cerrar el fichero cada vez que escribas algo al HD. Así se te guardará el log hasta el punto en que peta. También apostaría que el fallo es vuestro y no del compilador, aunque eso a veces es duro reconocerlo :X9:

sync                                

CoLSoN2

                                hay un 99,9% de probabilidad de que sea problema nuestro, pero es raro que en vez de petar en un lugar y punto, se vaya saltando cosas.. para cada Log() ya hago fflush() asi que eso no creo que sea :                                
Manuel F. Lara
Descargar juegos indie  - blog sobre juegos indie y casual
El Desarrollo Personal.com  - blog sobre productividad, motivación y espíritu emprendedor

synchrnzr

                                Pues ya sólo os queda descubrir por qué se las salta (una condición que suponeis que se tendría que cumplir y no se cumple, etc... ^_^)

Si quieres me envías el programa este un dia por la mañana (con el MSN mismo...) y si no tengo mucho trabajo, a lo mejor puedo mirártelo ;)

sync                                

Mars Attacks

                                Pues tengo un problema bastante parecido. En un benchmark que hicimos entre AgeR y yo para un trabajillo de clase (lo posteo más abajo) resulta que con el gcc, en modo de optimización normal no funcionaba (mejor dicho, no hacía lo que tenía que hacer) pero con el modo de optimización -O2 iba perfectamente. Para más detalles, si ponía un printf debajo del switch, no me lo sacaba (ejecutaba el programa y no hacía nada, se quedaba "colgado") pero si ponía otro printf encima del switch, me sacaba ambos printf aunque seguía sin hacerme nada de lo que debería hacer.
Sería un poco largo comentar qué hacía el programa (es un benchmark que tiene tantos hijos como le pases en el segundo parámetro, y cada uno de esos hijos abría un historial con tiempos de procesos de una carpeta y ejecutaba un bucle infinito marcando una X por la salida de error estándar cada vez que acababa de hacer uno de esos "procesos", de forma que había que ejecutarlo como bench numhijos 1>/dev/null 2>fichero_res)

El código:


#include <stdio.h>

#include <stdlib.h>



int main(int argc, char *argv[])

{

       int i,n,t,proc,hijo=0,estado,numproc;

       FILE *Historial;

       char ASCII[3];

       char ControlChar;

       char *hist;

       proc=0;

       numproc=atoi(argv[1]);

       while((proc<numproc) && !hijo)

       {

               if(fork()!=0) /*PROCESO PADRE*/

               {

                       if(proc++ == (numproc-1))

                       {

                               wait(&estado);

                       }

               } /*ten mas hijos y espera a que acabe el ultimo*/

               else /*PROCESO HIJO*/

               {

                       switch(proc%5)

                       { /*Eleccion del historial dependiendo del numero de proceso*/

                               case 0: sprintf(hist,"tl%d",((proc/5)%15+1));break;

                               case 1: sprintf(hist,"tm%d",((proc/5)%15+1));break;

                               case 2: sprintf(hist,"tx%d",((proc/5)%15+1));break;

                               case 3: sprintf(hist,"tj%d",((proc/5)%15+1));break;

                               case 4: sprintf(hist,"tv%d",((proc/5)%15+1));break;

                               default: printf("ARGFASDFn");

                       };

                       hijo=1;/*impedimos que el hijo cree mas hijos*/

                       if (( Historial = fopen(hist, "r")) == NULL)

                       {

                               fprintf(stderr, "No se puede abrir el fichero de entrada.n");

                       }

                       else

                       {

                               printf("archivo abierto y funcionaln");

                               while(1)

                               {

                                       do

                                       {

                                               fread(ASCII, sizeof(ASCII), 1,Historial);

                                               t=0;

                                               do

                                               {

                                                       n=0;

                                                       while(n++<45)

                                                       {

                                                               i=0;

                                                               while(i++<13)

                                                               printf("Soy un programa y molo, %d,%dn",n,i);

                                                       }

                                               }

                                               while(t++<atoi(ASCII));

                                               fprintf(stderr,"Xn");

                                               fread(&ControlChar, sizeof(ControlChar),1, Historial);

                                       }

                                       while (ControlChar != EOF);

                                       fseek(Historial, SEEK_SET, 0);

                               }

                               fclose(Historial);

                               return 0;

                       }

               }/*FIN DEL PROCESO HIJO*/

       } /*FIN DEL WHILE*/

}
                               

synchrnzr

                                Mars, sin abusar XDDD

Por cierto que esto...



i=0;

while(i++<13)

  printf("Soy un programa y molo, %d,%dn",n,i);



...con lo poco que cuesta hacer un for() vulgaris.... :loco:

Así a primera vista, un posible error es que si en ASCII[] pones un número de 3 cifras, el último char fijo que no será cero y por tanto el atoi(ASCII) te puede dar cosas alucinantes, además no está inicializado (aunque eso no creo que sea problema)

Si fuera eso, sería probablemente debido a que con -O2, entre ASCII[] y la siguiente variable pone un byte 0 de padding para que las variables estén alineadas a 32bits y en cambio sin optimización no. No sé, tampoco lo he probado, pero es lo primero que se me ocurre ;)

sync                                

Mars Attacks

                                Lo del for es lo de menos, ésa parte sólo sirve de "bulto" para que el programa tarde un poco en hacer "algo". Todos los números del historial tienen tres cifras, así que eso no es problema. Además, esa parte a solas compilaba y funcionaba bien.                                

synchrnzr

                                Emmm... el problema que yo veo es cuando son de 3 cifras precisamente y ControlChar != 0  (¿no lo ve nadie más esto? ^_^') Pero que no quiere decir que sea el que haga que te funcione mal.                                

Mars Attacks

                                Es que ControlChar sólo está ahí para leer el carácter de fin de fichero para volver a empezar el archivo cuando se haya acabado. Mientras tanto, sólo leerá los n de final de línea. En fin, en cualquier caso, el programa hace lo que tendría que hacer en su versión "desforkada", así que no es la parte que me preocupa. Creo que todo el jaleo viene con el switch, pero yo no le encuentro ningún problema al switch  :(                                






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.