Не инициализируется класс в конструкторе

 

У меня самописный класс для работы со временем. Ещё нужны доработки, но, в целом то, что нужно.. уже реализовано. Почти всё. Остальное в процессе.

Я столкнулся с косяком, который напрягал меня несколько дней пока я не распринтовал код бота и не нашёл место, где косяк. Пришлось принтовать т.к. в мт5 нет нормальной возможности увидеть в какой строке ошибка. Терминал просто ничего не сообщает обычно. Иногда выдаёт невнятные вещи, которые не указывают ни на что.

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

Сам класс я прикрепляю.

По сути, этот класс DateTimeInstance инициализируется в конструкторе класса Signal вот так:

DateTimeInstance *prevDayDt,    // Дата предыдущего дня
                 *curDayDt;     // Дата рабочего дня
// Конструктор класса. ==========================================================================================================================================================================================================================================
Signal :: Signal(SymbolInstance *ptrSymbol) {    // Указатель на класс свойств торгового инструмента
  m_ts = new TimeSeries();
  m_symbol = ptrSymbol;
  curDayDt = new DateTimeInstance(TimeCurrent());
  Print(__FUNCTION__, ":: curDayDt = ", curDayDt.m_dtStructure.hour, ":", curDayDt.m_dtStructure.min, ":", curDayDt.m_dtStructure.sec);
  prevDayDt  = new DateTimeInstance(TimeCurrent());
  posCnt[0] = 0;
  posCnt[1] = 0;
}

А класс Signal инициализируется в самом торговом боте вот так:

int OnInit() {
//---
  sym = new SymbolInstance(_Symbol);
  sig = new Signal(sym);
//  mm = new MoneyManagement();
  order = new OrdersHandling(i_tryCount);
  position = new PositionsHandling(i_tryCount);
  g_magic = generateMagicNumber(i_magic, sym.getName(), i_tf);
//---
  return INIT_SUCCEEDED;
}

Так вот в классе Signal есть строка в конструкторе:

Print(__FUNCTION__, ":: curDayDt = ", curDayDt.m_dtStructure.hour, ":", curDayDt.m_dtStructure.min, ":", curDayDt.m_dtStructure.sec);

В журнале она выдаёт:

2024.11.11 18:21:13.152 2023.10.30 00:00:00   Signal::Signal:: curDayDt = 0:0:0

Т.е. значения часа, минуты и секунд равны нулям! Это как так? В конструкторах время нельзя задавать что-ли полям класса?

 Всё же написано правильно, как я понимаю. В чём может быть причина?

Файлы:
 

Так в коде нигде нет проверки на то, создался инстанс или нет. К примеру, нужно проверить хотя бы вот это место:

curDayDt = new DateTimeInstance(TimeCurrent());
if (CheckPointer(curDayDt) == POINTER_INVALID)
{
        Alert("Instance of DateTimeInstance class creating error");
        return;
}
 
Виктор Демихов:

Т.е. значения часа, минуты и секунд равны нулям! Это как так? В конструкторах время нельзя задавать что-ли полям класса?

Всё же написано правильно, как я понимаю. В чём может быть причина?

// Конструктор класса. ==========================================================================================================================================================================================================================================
Signal :: Signal(SymbolInstance *ptrSymbol) {    // Указатель на класс свойств торгового инструмента
  m_ts = new TimeSeries();
  m_symbol = ptrSymbol;
  curDayDt = new DateTimeInstance(TimeCurrent());
  Print(TimeCurrent());
  Print(__FUNCTION__, ":: curDayDt = ", curDayDt.m_dtStructure.hour, ":", curDayDt.m_dtStructure.min, ":", curDayDt.m_dtStructure.sec);
  prevDayDt  = new DateTimeInstance(TimeCurrent());
  posCnt[0] = 0;
  posCnt[1] = 0;
}
 
fxsaber #:

Здесь понятно. Я же принтовал время. А оно нулевое. Но, дальше интереснее. Вот, что в журнале:

2024.11.12 00:07:39.124 2023.10.30 00:00:00   _g_signal
2024.11.12 00:07:39.124 2023.10.30 00:00:00   Signal::getAggregateSignal:: getAggregateSignal()
2024.11.12 00:07:39.124 2023.10.30 00:00:00   Signal::getAggregateSignal:: curDayDt = 0:0:0
2024.11.12 00:07:40.155 2023.10.30 00:00:00   Access violation at 0x00007FF75C355336 read to 0x000000007FF75AA7
2024.11.12 00:07:40.156 2023.10.30 00:00:00      crash -->  00007FF75C355336 F30F6F0A          movdqu     xmm1, [rdx]
2024.11.12 00:07:40.156 2023.10.30 00:00:00                 00007FF75C35533A F3420F6F5402F0    movdqu     xmm2, [rdx+r8*1-0x10]
2024.11.12 00:07:40.156 2023.10.30 00:00:00                 00007FF75C355341 F30F7F09          movdqu     [rcx], xmm1
2024.11.12 00:07:40.156 2023.10.30 00:00:00                 00007FF75C355345 F3420F7F5401F0    movdqu     [rcx+r8*1-0x10], xmm2
2024.11.12 00:07:40.156 2023.10.30 00:00:00                 00007FF75C35534C C3                ret       
2024.11.12 00:07:40.156 2023.10.30 00:00:00   
2024.11.12 00:07:40.156 2023.10.30 00:00:00                 00007FF75C35534D 4E8D0C02          lea        r9, [rdx+r8*1]
2024.11.12 00:07:40.156 2023.10.30 00:00:00                 00007FF75C355351 483BCA            cmp        rcx, rdx
2024.11.12 00:07:40.156 2023.10.30 00:00:00                 00007FF75C355354 4C0F46C9          cmovbe     r9, rcx
2024.11.12 00:07:40.156 2023.10.30 00:00:00                 00007FF75C355358 493BC9            cmp        rcx, r9
2024.11.12 00:07:40.156 2023.10.30 00:00:00                 00007FF75C35535B 0F823F040000      jb         0x00007FF75C3557A0
2024.11.12 00:07:40.156 2023.10.30 00:00:00   
2024.11.12 00:07:40.156 2023.10.30 00:00:00                 00007FF75C355361 833D18EC540003    cmp        dword ptr [0x00007FF75C8A3F80], 0x03
2024.11.12 00:07:40.156 2023.10.30 00:00:00                 00007FF75C355368 0F82E2020000      jb         0x00007FF75C355650
2024.11.12 00:07:40.156 2023.10.30 00:00:00   
2024.11.12 00:07:40.156 2023.10.30 00:00:00                 00007FF75C35536E 4981F800200000    cmp        r8, 0x2000
2024.11.12 00:07:40.156 2023.10.30 00:00:00   
2024.11.12 00:07:40.156 2023.10.30 00:00:00   00: 0x00007FF75C355336
2024.11.12 00:07:40.156 2023.10.30 00:00:00   01: 0x00007FF75B5260C9
2024.11.12 00:07:40.156 2023.10.30 00:00:00   02: 0x000000AD417FBFB8
2024.11.12 00:07:40.156 2023.10.30 00:00:00   

Никаких ссылок на строку с ошибкой. Просто выдаёт такое. Как это победить?