2012-01-05 4 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_hold или timeinfo; они неправильного типа. Значение первой переменной произошло от преобразования rawtime в указатель tm с localtime, поэтому используйте это для первого параметра. Когда вы позже вызвали mktime(timeinfo), он вернул значение time_t, но вы проигнорировали возвращаемое значение. Назначьте возвращаемое значение переменной, чтобы вы могли использовать ее для второго параметра difftime.

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

Thanks! что сработало – darko

1

Это потому, что difftime требует сырых time_t значения, а не struct tm структур.

Прототип:

double difftime(time_t time1, time_t time0); 

Что вам нужно сделать, это оставить системное время, как это (не localtime выполняемых на нем), а затем правильно преобразовать введенный пользователь информации в эквивалент time_t с mktime (или 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. 
Смежные вопросы