2015-12-16 2 views
5

Я пытаюсь выполнить следующий код:C- пока петля не-объяснил поведение

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

Я ожидал его на печать «3 секунды до» через каждые 3 секунды, но он не показывает, что сообщение. Я попытался отладить его с помощью gdb, но ничего не кажется неправильным и до сих пор нет вывода. При попытке отладки я добавил инструкцию printf и, как ни странно, выход можно увидеть.

Если я запустил программу после удаления // printf ("% d \ n", ms-oldms); заявление, выхода нет. Я не уверен, что происходит, и зависит ли его от чего-либо.

$ НКУ --version НКУ (Ubuntu 4.8.2-19ubuntu1) 4.8.2

+4

Попробуйте положить новой строки на вашем Printf – Jorgel

+0

@Jorgel, помещая символ новой строки в Printf работал. Но я все еще смущен этим поведением. Это первый раз, когда я столкнулся с этим. – kid

+0

У вас бесконечный цикл - это «первый раз». Даже без новой строки он будет работать нормально, если вы добавите 'break' после' printf'. – i486

ответ

10

Буферизация вывода является причиной.

stdout - это строка, затухающая по умолчанию при подключении к терминальному устройству. Вы можете удалить это с помощью fflush(stdout); или используя \n в printf() i.e. printf("3 seconds up\n");. или отключить его с помощью setbuf(stdout, 0);

I/O в целом медленный. Таким образом, реализация использует буфер фиксированного размера и printf после его заполнения. На практике вызов fflush(stdout); слишком часто может повлиять на производительность.

+0

Так что эта проблема с printf вправо? от вашего ans я предполагаю, что нет ничего плохого в цикле while или большом объеме обработки, происходящей в коде. – kid

+0

Да. Ничего плохого в цикле. Но я бы не сказал, что это «проблема». Существует веская причина, по которой реализация libc выполняет буферизацию: производительность. –

+0

либо printf («3 секунды вверх \ n»); или printf («\ n3 секунды вверх»); не работает. Даже добавление нового printf («\ n») непосредственно перед печатью («3 секунды вверх \ n») не помогло. Код работает правильно, если я помещаю printf («\ n») вместо прокомментированного printf (// printf («% d \ n», ms-oldms);) в коде – kid

1

посланного код имеет несколько проблем

  1. переменная oldms не быть установлена ​​в любое конкретное значение до истекшего времени проверяемого
  2. без любого вызова fflush(stdout); или символа новой строки («\ п») в строке формата, ничего не будет выводиться (в течение очень долгого времени, пока буфер системы STDOUT не заполняется)
  3. для удобства чтения, аксиома only one statement per line and (at most) one variable declaration per statement применяется к коду

следующий код компилируется и выполняет требуемую операцию

#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 
Смежные вопросы