tutorial online guia español curso aprender c loops while-loop printf

c - online - solidity español



C- while comportamiento no explicado en bucle (2)

Estoy tratando de ejecutar el siguiente código:

#include <sys/time.h> #include <stdio.h> int main() { unsigned int ms, oldms = 0,dif; struct timeval tv; while(1) { gettimeofday(&tv, NULL); ms=tv.tv_sec; //printf("%d/n",ms-oldms ); dif=ms-oldms; if(dif>3) { printf("3 seconds up"); oldms=ms; } } }

Estoy esperando que imprima "3 segundos arriba" después de cada 3 segundos, pero no muestra ese mensaje. Intenté depurarlo usando gdb pero nada parece estar mal y todavía no hay salida. Mientras trataba de depurar, agregué una declaración printf y mágicamente se puede ver la salida.

Si ejecuto el programa después de eliminar // printf ("% d / n", ms-oldms); declaración, no hay salida otra vez. No estoy seguro de lo que está sucediendo y si depende de algo.

$ gcc --version gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2


El almacenamiento en búfer de salida es la razón.

stdout es buffer de línea por defecto cuando se conecta a un dispositivo terminal. Puedes eliminar esto usando fflush(stdout); o usando /n en printf() ie printf("3 seconds up/n"); . o deshabilitarlo con setbuf(stdout, 0);

I / O es lento en general. Entonces las implementaciones usan un buffer de tamaño fijo y printf una vez que se llena. En la práctica, llamando a fflush(stdout); muy a menudo puede afectar el rendimiento.


el código publicado tiene un par de problemas

  1. la variable oldms no se establece en ningún valor específico antes de que se verifique el tiempo transcurrido
  2. sin una llamada a fflush(stdout); o una nueva línea final (''/ n'') en la cadena de formato, no se emitirá nada (durante un tiempo muy largo, hasta que se complete el búfer de stdout del sistema)
  3. para la legibilidad, el axioma only one statement per line and (at most) one variable declaration per statement se aplica a only one statement per line and (at most) one variable declaration per statement al código

el siguiente código se compila limpiamente y realiza la operación deseada

#include <sys/time.h> #include <stdio.h> int main() { unsigned int ms; unsigned int oldms = 0; unsigned int dif; struct timeval tv; gettimeofday(&tv, NULL); oldms = tv.tv_sec; while(1) { gettimeofday(&tv, NULL); ms=tv.tv_sec; //printf("%d/n",ms-oldms ); dif=ms-oldms; if(dif>3) { printf("3 seconds up/n"); oldms=ms; } } } // end function: main