2015-12-16 3 views
5

ich den folgenden Code auszuführen versuchen:C- while-Schleife un erläuterte Verhalten

#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; 
    } 
} 
} 

Ich erwarte es „3 Sekunden bis“ nach all 3 Sekunden zu drucken, aber es wird nicht angezeigt, dass Botschaft. Ich habe versucht, es mit gdb zu debuggen, aber nichts scheint falsch und immer noch keine Ausgabe. Während ich versuchte zu debuggen, fügte ich eine printf-Anweisung hinzu und magisch die Ausgabe zu sehen.

Wenn ich das Programm nach dem Entfernen der // printf ausführen ("% d \ n", ms-oldms); Aussage, es gibt keine Ausgabe wieder. Ich bin mir nicht sicher, was passiert und ob es von irgendetwas abhängt.

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

+4

Versuchen Sie eine neue Zeile auf dem printf – Jorgel

+0

@Jorgel setzen, eine neue Zeile in printf gearbeitet setzen. Aber ich bin immer noch verwirrt über dieses Verhalten. Dies ist das erste Mal, dass ich diesem begegnet bin. – kid

+0

Sie haben Endlosschleife - das ist das "erste Mal". Auch ohne Newline funktioniert es OK, wenn Sie 'break' nach' printf' hinzufügen. – i486

Antwort

10

Ausgabepufferung der Grund.

stdout ist standardmäßig gepufferte Leitung, wenn sie an ein Endgerät angeschlossen ist. Sie können dies unter Verwendung von fflush(stdout); oder unter Verwendung von \n in printf(), d. H. printf("3 seconds up\n");, ausspülen. oder Deaktivieren mit setbuf(stdout, 0);

I/O ist im Allgemeinen langsam. Implementierungen verwenden also einen Puffer fester Größe und printf, sobald sie voll sind. In der Praxis kann das häufige Aufrufen von fflush(stdout); die Leistung beeinträchtigen.

+0

Also ist das Problem mit dem printf richtig? Ich gehe davon aus, dass mit der while-Schleife oder der großen Verarbeitungsmenge im Code nichts falsch ist. – kid

+0

Ja. Nichts ist falsch mit der Schleife. Aber ich würde nicht sagen, dass es ein "Problem" ist. Es gibt einen guten Grund, warum libc-Implementierungen puffern: Performance. –

+0

entweder printf ("3 Sekunden auf \ n"); oder printf ("\ n3 Sekunden hoch"); hat nicht funktioniert. Sogar das Hinzufügen eines neuen Ausdrucks ("\ n") kurz vor dem Drucken ("3 Sekunden nach oben \ n") hat nicht geholfen. Der Code funktioniert richtig, wenn ich einen printf ("\ n") anstelle des kommentierten printf (// printf ("% d \ n", ms-oldms);) im Code – kid

1

der entsandte Code hat ein paar Probleme

  1. die Variable oldms wird auf einen bestimmten Wert, bevor die verstrichene Zeit nicht eingestellt werden ist
  2. ohne entweder einen Aufruf fflush(stdout); oder eine Hinter Newline geprüft werden (‚\ n‘) in der Format-Zeichenkette, wird nichts ausgegeben werden (für eine sehr lange Zeit, bis das System stdout Puffer gefüllt ist)
  3. Lesbarkeit zu verbessern, das Axiom only one statement per line and (at most) one variable declaration per statement wird auf den Code angewendet

der folgende Code kompiliert sauber und führt die gewünschte Operation

#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