2012-01-05 45 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.