2012-12-11 3 views
1

C++에서 "timer"함수를 구현하려고합니다. 수행 할 프로그램은 입니다. 잠시 후을 입력하십시오. 그러나 예기치 않은 결과가 있습니다. I 기대C++ 타이머 구현

short e, sum; 
clock_t start; 
double duration=0; 

for (e=0; e<4; e++) { 
    start = clock(); 
    while (duration < 1) { 

     duration = (clock() - start)/(double)CLOCKS_PER_SEC; 
    } 
    cout << duration; 
    duration = 0; 
    sum += e; 
    /* Calculate EPOCH error */ 
    cout << e; 
} 
cout << "\n" << e<< "\n"; 

결과는 :

  • 콘솔 출력 초마다, I 예상 실행의 끝에서 E (0,1,2,3)
  • 하였다 합계 될 수득 0 + 1 + 2 + 3 = 6,

결과

  • CO 실행이
  • 이 합이 6

예상 =으로 내가 실행이 완료 될 때까지, 왜 프로그램 인쇄 콘솔에 않습니다되고 불확실한 찾아 매초하지 끝날 때 nsole 출력이 모두 함께, 전자 다음에?

건배,

+3

버퍼링하고, 루프에서'std :: cout << e << std :: endl;'을 시도하십시오. –

+1

질문은 분명히 C++로 보입니다. 그렇다면 왜'c' 태그입니까? – Grizzly

+0

Offtopic,하지만 왜 바쁜 루프가 아닌 수면? – goji

답변

1

귀하의 문제는 출력 스트림이 루프 동안 플러시되지 않는 것입니다. 실제로 텍스트를 콘솔에 쓰는 것은 다소 비쌉니다. 따라서 플러시가 발생하면 입력이 버퍼링되고 콘솔에만 기록됩니다.

cout << e<<std::flush; 

std::endl

도 줄 바꿈 추가하는 것 외에도 스트림을 플래시합니다 (도 그것을 할 \n 힘을 쓰는,하지만이 보장되지 것) : 스트림을 비우기 std::flush을 스트리밍하여 수행 할 수 있습니다.

옆줄로 : 출력을 읽을 수 있도록 숫자 사이에 일종의 분리 기호를 추가하는 것이 좋습니다.

+0

세척의 순간은 시스템에 따라 다릅니다. std :: flush 및 std :: endl을 사용하면 플러시가 강제 실행되므로 "\ n"을 출력해도 버퍼를 지울 수 있지만 반드시 지울 필요는 없습니다. – Yester

+0

@ 예언자 : 그래서 내가 그 일을 할 수 있다고 썼다. (아마도 더 강조해야한다) – Grizzly

+0

빠른 응답을 주셔서 감사하며 미안하지만 지금까지 대답했다. 스트리밍을 플러시하는 것에 대한 귀하의 제안을 따라했으며 그 결과는 대단합니다. 처음에는 컴퓨터에서 소리를 지르지 않았지만 지금은 이해가가는 것 같습니다. @ grizzly 다시 한번 감사드립니다. –