2014-01-05 3 views
0
#include <stdio.h> 
#include <time.h> 
#include <stdlib.h> 

void delay(double sec) 
{ 
    clock_t start = clock(); 

    while ((clock() - start)/CLOCKS_PER_SEC < sec) 
     ;  
} 

int main() 
{ 
    for (int i = 0; i < 100000; i++) { 
     printf("%d ", i); 
     delay(1); 
    } 

    return 0; 
} 

지연 기능을 작성하고이 코드로 테스트했지만 표준 출력에 숫자가 표시되지 않았습니다. clock()을 사용한 지연 기능

가 그럼 난 이런 식으로의 printf() 호출을 변경 : 흥미롭게도

printf("%d \n", i); 

을 일했다. 나는 또한 지연 기능없이 이것 같이 시도했다 :

for (int i = 0; i < 100000; i++) 
     printf("%d ", i); 

또한 작동했다. 내가 여기서 무엇을 놓치고 있니? 첫 번째 코드를 실행할 때 숫자가 표시되지 않는 이유는 무엇입니까? 도와 줘서 고마워.

+1

정상적인'sleep()'함수를 사용하지 않는 이유는 무엇입니까? – Crozin

+0

나는 그것을 사용할 수 있지만, 호기심 때문에이 질문을 던졌다. – yunusaydin

+0

@TimCooper 내가 코드를 편집했습니다. 그것은 틀 렸습니다 – yunusaydin

답변

1

출력이 버퍼링되기 때문에. 대부분의 터미널은 개행 문자 (\n)가 발생하거나 fflush(stdout)이 호출 될 때까지 표준 출력을 버퍼링합니다.

delay에 대한 호출을 포함하는 루프가 결국 숫자를 인쇄하지만 프로그램이 끝나면 인쇄됩니다.

printf -call 뒤에 fflush(stdout);을 추가하면 사이에 개행하지 않고 숫자가 즉시 나타납니다.

+0

당신이 말한 것은 효과가있었습니다. 고마워요. :)하지만 질문이 있습니다. 지연과 루프 반복 결국 숫자를 인쇄하지 않습니다. 이유가 뭐야? – yunusaydin

+0

정말요? ''clock '의 세분성에 대한 Chris J. Kiick의 대답을 보라.''100000'' 초는 꽤 길다 (> 27 시간). 프로그램이 끝나게 할 수 있니? 어떤 이유에서인지, 터미널이 버퍼링을하지 않고 숫자를 즉시 ​​인쇄 할 수는 있지만 인쇄하는 데 꽤 많은 시간이 걸릴 것으로 보입니다. 100 루핑을 시도하십시오. – Kninnug

+0

네, 맞아요. 그건 바보 같은 실수 였어. 도와 줘서 고마워. – yunusaydin

1

음, 두 가지 이유가 있습니다. 첫째, printf()은 항상 출력을 플러시하지 않으므로 실제로는 printf 문을 지나서도 여전히 터미널에서 아무 것도 볼 수 없습니다. 텍스트가 버퍼링됩니다. \n을 입력하면 출력이 플러시되어 그 이유가 작동했을 수 있습니다.

두 번째 문제는 delay() 함수에 아무런 값도 전달하지 않는다는 것입니다. 아마도 임의의 값을 사용하고 매달려있을 것입니다.

또한 clock()은 "벽시계"시간이 아닌 CPU 시간을 반환하므로 실제로 생각보다 오래 걸릴 수 있습니다.

지연 기능은 까다 롭습니다. 따라서이를 수행하는 시스템 호출이 많이 있습니다. sleep()을 참조하십시오.