#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:
Проблема, с которой я столкнулся, заключается в том, что я присваивал и возвращал удвоения как целые числа. Просто внеся поправки в отношении этого, я смог заставить свой код работать. Спасибо всем, кто помог.