2012-01-05 44 views
-1

我對時間標題亂搞,並遇到了一個錯誤:簡單的C++時間程序錯誤

invalid conversion from 'tm*' to 'time_t' 

你可以看到這裏的錯誤是在一路下面的代碼在底部時,我嘗試使用difftime函數。我知道我只是在做一些愚蠢而非法的事情,但我不知道如何解決這個問題。如果有人有解決方案,請告訴我。謝謝!

該程序應該獲取當前時間,從用戶獲取時間輸入,然後查找時間差異。

代碼:

#include <stdio.h> 
#include <time.h> 

int main() 
{ 
    time_t rawtime; 
    struct tm * timeinfo; 
    struct tm * cur_timeinfo_hold; 
    int year, month ,day,hour,minute,second; 
    double dif; 

    /* prompt user for time to be compared*/ 
    printf ("Enter year: "); scanf ("%d",&year); 
    printf ("Enter month: "); scanf ("%d",&month); 
    printf ("Enter day: "); scanf ("%d",&day); 
    printf ("Enter hour: "); scanf ("%d",&hour); 
    printf ("Enter minute: "); scanf ("%d",&minute); 
    printf ("Enter second: "); scanf ("%d",&second); 

    /* get current timeinfo*/ 
    time (&rawtime); 
    timeinfo = localtime (&rawtime); 
    /* print it */ 
    printf("The present time is: "); printf(asctime (timeinfo)); 

/* set current time into a new variable to use for difftime, since timeinfo, will be changed */ 
    cur_timeinfo_hold = timeinfo; 

    /* modify current timeinfo to the user's choice */ 
    timeinfo->tm_year = year - 1900; 
    timeinfo->tm_mon = month - 1; 
    timeinfo->tm_mday = day; 
    timeinfo->tm_hour = hour; 
    timeinfo->tm_min = minute; 
    timeinfo->tm_sec = second; 
    mktime (timeinfo); 
    /* and print it */ 
    printf ("time to compare: "); printf(asctime (timeinfo)); 

    /* find time difference */ 
//dif = difftime (cur_timeinfo_hold,timeinfo); //error: invalid conversion from 'tm*' to 'time_t' 

    return 0; 
} 

回答

4

mktime是一個函數。它接受一個參數,一個tm指針,並返回一個值time_t。它不會將其論點從一種類型轉換爲另一種類型。因此,撥打mktime(timeinfo)後,您的timeinfo變量仍然是tm指針。

difftime函數需要接收兩個time_t值,所以它不會接受cur_timeinfo_holdtimeinfo;他們是錯誤的類型。第一個變量的值來自將rawtime轉換爲tm指針,其中localtime,因此將其用於第一個參數。當您稍後調用mktime(timeinfo)時,它返回time_t值,但您忽略了返回值。將返回值分配給一個變量,以便您可以將其用於第二個參數difftime

time_t info = mktime(timeinfo); 
// ... 
dif = difftime(rawtime, info); 
+0

謝謝!那工作 – darko 2012-01-05 22:58:01

1

這是因爲difftime需要原始time_t值,而不是struct tm結構。

的原型爲:

double difftime(time_t time1, time_t time0); 

什麼你需要做的就是離開系統時間,因爲它是(沒有對其執行localtime),然後正確轉換用戶輸入的信息進入等效time_tmktime(或timegm如果使用UTC時間)。您可以使用difftime來獲得不同。實際上,例如:

time_t base, other; 
struct tm tms; 
double delta; 

time (&base);     // basetime is now. 
tms.blah = blah;     // for all blahs. 
other = mktime (&tms);   // get time_t for other time. 
delta = difftime (other, base); // get difference.