простая ошибка программы времени c ++ - PullRequest
0 голосов
/ 06 января 2012

Я возился с заголовком времени и обнаружил ошибку:

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;
}

Ответы [ 2 ]

4 голосов
/ 06 января 2012

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);
1 голос
/ 06 января 2012

Это потому, что 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...