Сбой функции календаря при вызове localtime_s

Я пытаюсь сделать callendar, поэтому я использую time_t и localtime_s для хранения информации о времени и дате, а затем сохраняю ее в отдельных членах класса Calendar:

void Callendar::Initialize()
{
time_t now = time(0);
tm *localTime = null;
localtime_s(localTime, &now);

LocalSeconds = localTime->tm_sec;
LocalMinutes = localTime->tm_min;
LocalHours = localTime->tm_hour;
LocalDays = localTime->tm_mday;
LocalMonths = localTime->tm_mon;
LocalYears = localTime->tm_year;
DaysSinceSunday = localTime->tm_wday;
DaysSinceJanuaryFirst = localTime->tm_yday;
HoursDaylightSavings = localTime->tm_isdst;
}

Все компилируется нормально, однако во время выполнения я получаю:

Ошибка отладки!

Программа: C: \ Users \ MyPC \ Desktop \ Framework \ Framework \ Debug \ Framework.exe
Файл: f: \ dd \ vctools \ crt_bld \ self_x86 \ crt \ src \ loctim64.c Строка: 69

Выражение: (ptm! = NULL)

После того, как я закрываю сообщение об ошибке «Утвердить», я получаю стандартную ошибку отладки в этой строке:

static __inline errno_t __CRTDECL localtime_s(struct tm * _Tm, const time_t * _Time)
{
return _localtime64_s(_Tm, _Time);
}

Что в основном является результатом вызова * localtime_s (localTime, &Сейчас в Календарь: Initialize ()
Могу ли я использовать устаревшую версию этой функции? Я знаю, что есть другие функции для получения локального времени, но я не знаю, какая из них «правильная». Другие предложили мне не использовать «местное время», но, похоже, localtime_s тоже не работает.

0

Решение

Посмотри пожалуйста документация

параметры

_tm

Указатель на временную структуру, которая будет заполнена.

Это означает, что функция ожидает, что первый параметр будет ненулевым указателем на действительный tm пример.

менять

tm *localTime = null;
localtime_s(localTime, &now);

в

tm localTime;
localtime_s(&localTime, &now);
5

Другие решения

localtime_s функция хочет выделенный struct tm указатель, пока вы передаете ему нулевой указатель.

Используйте, например,

tm localTime:
localtime_s(&localTime, &now);
2

ха!

#include <iostream>
#include <fstream>
#include <ctime>
//#include <string>
//#include <cstring>
//#include <sstream>
using namespace std;

int main ()
{

int LocalSeconds, LocalMinutes,  LocalHours, LocalDays, LocalMonths, LocalYears,
DaysSinceSunday, DaysSinceJanuaryFirst, HoursDaylightSavings;

time_t now = time(0);
tm localTime;
now = time(NULL);
localtime_s(&localTime, &now);LocalSeconds = (&localTime)->tm_sec;
LocalMinutes = (&localTime)->tm_min;
LocalHours = (&localTime)->tm_hour;
LocalDays = (&localTime)->tm_mday;
LocalMonths = (&localTime)->tm_mon;
LocalYears = (&localTime)->tm_year;
DaysSinceSunday = (&localTime)->tm_wday;
DaysSinceJanuaryFirst = (&localTime)->tm_yday;
HoursDaylightSavings = (&localTime)->tm_isdst;

cout << LocalSeconds << " " << LocalMinutes<< " " <<  LocalHours<< " " << LocalDays
<< " " << LocalMonths<< " " << LocalYears<< " " <<endl;

return 0;

}
1

В последнее время случается с той же проблемой. Чтобы избежать ошибок / предупреждений компилятора, я рекомендую следующее:

tm *localTime = new tm();
localtime_s(localTime, &now);

Если вы не инициализируете localTime вы получите «ошибку C4700: неинициализированная локальная переменная localTime используется»

0