Время.h Предоставление неправильного ответа на C

#c #arrays #date #pointers #time

#c #массивы #Дата #указатели #время

Вопрос:

У меня есть массив дат, которые в настоящее время являются целыми числами в формате {2010, 5, 13, 2010, 5, 15} и так далее. Я пытаюсь использовать время.библиотека h для определения разницы в днях между каждой датой. Вот некоторый код, который показывает, что происходит не так:

 int main()
{
    int dates[] = {2010, 4, 14, 2010, 4, 15, 2010, 4, 16};
    int* pDates = dates;
    printf("%dn", subtractDates(1, pDates));
    return 0;
}

int subtractDates(int i, int* pDates)
{
  struct tm start_date;
  struct tm end_date;
  time_t start_time, end_time;

  start_date.tm_hour = 0;  
  start_date.tm_min = 0;  
  start_date.tm_sec = 0;
  start_date.tm_mon = *(pDates 1)-1; 
  start_date.tm_mday = *(pDates 2); 
  start_date.tm_year = *(pDates)-1900;

  end_date.tm_hour = 0;  
  end_date.tm_min = 0;  
  end_date.tm_sec = 0;
  end_date.tm_mon = *(pDates 1 i*3)-1; 
  end_date.tm_mday = *(pDates 2 i*3); 
  end_date.tm_year = *(pDates i*3)-1900;
  start_time = mktime(amp;start_date);
  end_time = mktime(amp;end_date);

  return difftime(end_time, start_time) / 86400;
}
  

Этот код выводит, что разница между указанными датами составляет 1 день, что является правильным. Однако, если я удалю третью дату в массиве, как показано ниже, напечатанное значение станет 0, что, по моему мнению, неверно.

 int main()
{
    int dates[] = {2010, 4, 14, 2010, 4, 15};
    int* pDates = dates;
    printf("%dn", subtractDates(1, pDates));
    return 0;
}

int subtractDates(int i, int* pDates)
{
  struct tm start_date;
  struct tm end_date;
  time_t start_time, end_time;

  start_date.tm_hour = 0;  
  start_date.tm_min = 0;  
  start_date.tm_sec = 0;
  start_date.tm_mon = *(pDates 1)-1; 
  start_date.tm_mday = *(pDates 2); 
  start_date.tm_year = *(pDates)-1900;

  end_date.tm_hour = 0;  
  end_date.tm_min = 0;  
  end_date.tm_sec = 0;
  end_date.tm_mon = *(pDates 1 i*3)-1; 
  end_date.tm_mday = *(pDates 2 i*3); 
  end_date.tm_year = *(pDates i*3)-1900;
  start_time = mktime(amp;start_date);
  end_time = mktime(amp;end_date);

  return difftime(end_time, start_time) / 86400;
}
  

Я просто не понимаю, почему он возвращает 0, учитывая, что все, что я сделал, это удалил три значения в массиве, и эти три значения даже не использовались в первой программе. Любая помощь будет оценена, спасибо.

Комментарии:

1. Вы не должны печатать double s с %d помощью .

2. Итак, хорошо, что вы используете его только для печати целых чисел.

3. Работает для меня: ideone.com/lytPf4

4. Вы должны проверять возврат из mktime() и заполнять tm_isdst элемент, который в настоящее время передается mktime() неинициализированному и содержит мусор. У вас нет морального права ожидать, что все будет работать, если вы не потратите время, чтобы проверить, так ли это на самом деле.

5. Вы используете difftime , который возвращает double , а не int . Пожалуйста, устраните эту проблему, изменив оператор return на return difftime(end_time, start_time) / 86400.0; , возвращаемый тип вашей функции на double и ваш printf формат на "%f"

Ответ №1:

Проблема, с которой я столкнулся, заключается в том, что я присваивал и возвращал удвоения как целые числа. Просто внеся поправки в отношении этого, я смог заставить свой код работать. Спасибо всем, кто помог.