2015-12-16 14 views
5

Tôi cố gắng để chạy các đoạn mã sau:C- Vòng lặp while hành vi bỏ giải thích

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

Tôi đang mong đợi nó để in "3 giây lên" sau mỗi 3 giây, nhưng nó không hiển thị mà thông điệp. Tôi đã cố gắng để gỡ lỗi nó bằng cách sử dụng gdb nhưng không có gì có vẻ sai và vẫn không có đầu ra. Trong khi cố gắng gỡ lỗi, tôi đã thêm một tuyên bố printf và kỳ diệu đầu ra có thể được nhìn thấy.

Nếu tôi chạy chương trình sau khi xóa // printf ("% d \ n", ms-oldms); tuyên bố, không có đầu ra một lần nữa.Tôi không chắc chắn những gì đang xảy ra và cho dù phụ thuộc vào bất cứ điều gì.

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

+4

Hãy thử đặt một dòng mới trên printf của bạn – Jorgel

+0

@Jorgel, đặt một dòng mới trong printf làm việc. Nhưng, tôi vẫn còn bối rối về hành vi này. Đây là lần đầu tiên tôi gặp phải điều này. – kid

+0

Bạn có vòng lặp vô hạn - đó là "lần đầu tiên". Ngay cả khi không có newline nó sẽ làm việc OK nếu bạn thêm 'break' sau' printf'. – i486

Trả lời

10

Output đệm là nguyên nhân.

stdout là dòng đệm theo mặc định khi được gắn vào thiết bị đầu cuối. Bạn có thể tuôn ra điều này bằng cách sử dụng fflush(stdout); hoặc sử dụng \n trong printf() tức là printf("3 seconds up\n");. hoặc vô hiệu hóa nó với setbuf(stdout, 0);

I/O nói chung là chậm. Vì vậy, triển khai sử dụng một bộ đệm kích thước cố định và printf một khi nó được đầy đủ. Trong thực tế, gọi fflush(stdout); quá thường xuyên có thể ảnh hưởng đến hiệu suất.

+0

Vì vậy, vấn đề này là với printf phải không? từ ans của bạn, tôi giả sử không có gì sai với vòng lặp while hoặc khối lượng lớn xử lý xảy ra trong mã. – kid

+0

Có. Không có gì sai với vòng lặp. Nhưng tôi sẽ không nói đó là một "vấn đề". Có một lý do chính đáng tại sao việc triển khai libc làm đệm: hiệu suất. –

+0

hoặc printf ("3 giây lên \ n"); hoặc printf ("\ n3 giây lên"); không hoạt động. Thậm chí thêm một printf mới ("\ n") ngay trước khi printf ("3 giây lên \ n") không giúp được gì. Mã hoạt động đúng nếu tôi đặt printf ("\ n") thay vì printf đã nhận xét (// printf ("% d \ n", ms-oldms);) trong mã – kid

1

mã đăng đã có một vài vấn đề

  1. biến oldms không được thiết lập để bất kỳ giá trị cụ thể trước khi thời gian trôi qua là được kiểm tra
  2. mà không hoặc là một lời kêu gọi fflush(stdout); hoặc một dòng mới trailing ('\ n') trong chuỗi định dạng, sẽ không có đầu ra nào (trong một thời gian rất dài, cho đến khi bộ đệm đệm hệ thống được lấp đầy)
  3. để dễ đọc, tiên đề only one statement per line and (at most) one variable declaration per statement được áp dụng cho mã

đoạn mã sau biên dịch sạch và thực hiện các hoạt động mong muốn

#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 
Các vấn đề liên quan