2014-09-01 6 views
0

가끔은 아래 코드에서 음수 값이 나타납니다. 나는 이것을 이해하지 못합니다. 왜 그런 일이 일어날 지 설명 할 수 있습니까?gettimeofday()는 음수 값을 몇 번 반환합니다.

int64_t gettimelocal() 
{ 
    struct timeval Time; 
    if(-1 == gettimeofday(&Time,NULL)) 
    { 
     perror("gettimeofday"); 
    } 
    // get time in micro seconds 
    return ((Time.tv_sec * 1000000) + Time.tc_usec); 
} 
+0

편집하여 질문을 형식화하십시오. 읽을 수 없다! 코드에는 적어도 네 개의 공백으로 시작하는 줄을 사용하십시오. –

+0

'(Time.tv_sec * 1000000)'- 플랫폼에 따라 가능한 정수 오버플로입니다. –

+0

어떻게 표시하나요? % d이 (가) 있습니까? % ld 또는 sth와 비슷하게 시도하십시오. – jaroslawj

답변

1

Time을 초기화해야합니다. getttimeofday이 실패하면 perror 다음에 반환해야합니다. 따라서 시도하십시오 :

int64_t gettimelocal() { 
    struct timeval Time = {0,0}; 
    if(-1 == gettimeofday(&Time,NULL)) { 
    perror("gettimeofday"); 
    return -1; 
    } 
    // get time in micro seconds 
    return (((int64_t)Time.tv_sec * 1000000) + Time.tv_usec); 
} 

마지막으로 곱셈이 오버플로되지 않았습니까? 곱셈이 64 비트로 이루어 지도록 캐스트를 원한다.

static inline double my_clock_time (clockid_t cid) { 
    struct timespec ts = { 0, 0 }; 
    if (clock_gettime (cid, &ts)) 
    return NAN; 
    else 
    return (double) ts.tv_sec + 1.0e-9 * ts.tv_nsec; 
} 

my_clock_time(CLOCK_REALTIME) 읽기

printf ("now %.5f\n", my_clock_time(CLOCK_REALTIME)); 

처럼 조심스럽게
time(7) 전화 :

사실,이 같은 clock_gettime(3)double 부동 소수점을 사용하는 것이 좋습니다 것입니다. 나노초 정확도를 기대하지 마십시오!

모든 경고와 디버그 정보 (예 : gcc -Wall -g)로 코드를 컴파일하십시오. 디버거 (gdb) 및 아마도 strace(1)