Расчет минут с этого момента, пока что-то не должно быть - PullRequest
1 голос
/ 03 февраля 2012

У меня есть проект, который требует, чтобы я принял входные данные, когда (в тот же день, я полагаю) назначено назначение. Я пытался следовать некоторому коду из аналогичного вопроса, но он выдает ошибку, которая, как я полагаю, связана со значениями time_t и int. Вот мой код:

#include <iostream>
#include <ctime>
using namespace std;

int main() {
 int hour_input,min_input;

 cout << "What hour is your assignment due?\n";
 cin >> hour_input;
 cout << "What minute is your assignmnet due?\n";
 cin >> min_input;

 struct tm* tm;
 time_t ts = time(NULL);
 long int delta;
 tm->tm_hour = hour_input;
 tm->tm_min = min_input;

 delta = mktime(tm) - ts;
 delta += 24*60*60;
 cout << "There are "<< delta << " minutes until your assignment is due!\n";

 return 0;
}

Что я ищу, так это несколько советов о том, как правильно использовать функции в заголовке <ctime>, спасибо за вашу помощь!

Ответы [ 3 ]

1 голос
/ 03 февраля 2012

Первая ошибка - вы создаете указатель на struct tm, но ни на что не указываете.Вам не нужен указатель:

struct tm tm;
/* set fields */
time_t timestamp = mktime(&tm);

Вторая ошибка заключается в том, что mktime ожидает полные данные / время в структуре.Если год, месяц и день все равны нулю, то возвращаемое время будет первым годом, месяцем и днем.Вызов может фактически не состояться, потому что дата должна быть между 1 и 31.

Это означает, что нелегко использовать struct tm для различий.Вместо этого используйте difftime как предложено Сэмом.

1 голос
/ 03 февраля 2012
double deltaMinutes = difftime(later,earlier) / 60.0;

Я бы каждый раз инициализировал структуру struct на текущую дату. Обратите внимание, что 1970 обозначен 70 в элементе tm :: tm_year.

http://www.cplusplus.com/reference/clibrary/ctime/difftime/

0 голосов
/ 03 февраля 2012

Удаление существенных бит из вашего кода (и ваши объявления в очень странном порядке)

 struct tm* tm;
 tm->tm_hour = hour_input;
 tm->tm_min = min_input;
 delta = mktime(tm) - ts;

Итак, tm неинициализирован и указывает на случайное место. Более того, вы не заполняете структуру должным образом, и у вас есть случайный (вероятно, недействительный) год, месяц, день и секунды.

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

...