В классе есть указатель на библиотеку логирования. (m)
В момент вызова конструктора этого класса в этот указатель записывает объект mO Что бы точно что то там лежало.
Запускаю робот, и меняю объект в классе на свой указатель
Интересное получается. Если обращение к m идет до замещения (т.е. смотря куда вставить строчку). Где лежит базовый объект, а не замещенный указатель.
При смене тайм фрейма получаю ошибку. Без смены все нормально при работающем роботе.
Но там уже лежит mO. Или новый. Ничего не лежать не может. Что делает смена тайм фрема?
Если же заместить до обращения - смена тайм фрема не приводит к ошибке. Что происходит?
Конструктор библиотеки повторно не вызывается? Куда девается базовый объект?
а что за объект mO ? у него какое время жизни..Где создаётся, где удаляется ??
считайте что указатель, это просто указатель. Если то на что он указывал развалилось, то обращение приведёт к ошибке, "invalid pointer"
указатели непричём. Скорее возможно недопонимание времени жизни объектов, глобальные/локальные/статические/динамические.
а что за объект mO ? у него какое время жизни..Где создаётся, где удаляется ??
считайте что указатель, это просто указатель. Если то на что он указывал развалилось, то обращение приведёт к ошибке, "invalid pointer"
указатели непричём. Скорее возможно недопонимание времени жизни объектов, глобальные/локальные/статические/динамические.
private:
MessageOS mO;
Просто уже балдею от этих ошибок. Воспроизведу позже в простом ввиде. И проверю. Мне, C# не приходилось сталкиваться с таким. Главное постоянно какие то плавающие ошибки. Там кода на 5000 строчек уже наплодил. И пошло поехало.
В классе есть указатель на библиотеку логирования. (m)
В момент вызова конструктора этого класса в этот указатель записывает объект mO Что бы точно что то там лежало.
Запускаю робот, и меняю объект в классе на свой указатель
Интересное получается. Если обращение к m идет до замещения (т.е. смотря куда вставить строчку). Где лежит базовый объект, а не замещенный указатель.
При смене тайм фрейма получаю ошибку. Без смены все нормально при работающем роботе.
Но там уже лежит mO. Или новый. Ничего не лежать не может. Что делает смена тайм фрема?
Если же заместить до обращения - смена тайм фрема не приводит к ошибке. Что происходит?
Конструктор библиотеки повторно не вызывается? Куда девается базовый объект?
На всякий случай:
"При смене символа или таймфрейма графика, к которому эксперт прикреплен, выгрузка и загрузка эксперта не производится. При этом последовательно вызываются обработчики OnDeinit() на старом символе/таймфрейме и OnInit() на новом символе/таймфрейме (если они есть), значения глобальных переменных и статических переменных не сбрасываются. Все события, поступившие для эксперта до завершения инициализации (функции OnInit()), пропускаются."
Было бы понятнее, если бы Вы приложили код, который можно скомпилировать и воспроизвести ошибку.
//+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ class M { public: void func(string str) { Print(str); }; }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ class O { public: O(int i=0) {m=GetPointer(mO);}; M* m; private: M mO; }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ O o; M* u; int OnInit() { o.m.func("1 Hello"); u=o.m = new M(); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { delete u; } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { o.m.func("2 Hello"); }
Вот вам код. Гарантированно приводит к ошибке при смене тайм фрейма.
а что за объект mO ? у него какое время жизни..Где создаётся, где удаляется ??
считайте что указатель, это просто указатель. Если то на что он указывал развалилось, то обращение приведёт к ошибке, "invalid pointer"
указатели непричём. Скорее возможно недопонимание времени жизни объектов, глобальные/локальные/статические/динамические.
Да я оказался прав. Конструктор повторно не вызывается при смене тайм фрейме. Или что то другое - но сомнительно. Привел код выше
Если объявление
O o; M* u;вставить в OnInit - ошибки нет. Значит это конструктор не вызвался
Да я оказался прав. Конструктор повторно не вызывается при смене тайм фрейме. Или что то другое - но сомнительно. Привел код выше
Если объявление
вставить в OnInit - ошибки нет. Значит это конструктор не вызвался- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
В классе есть указатель на библиотеку логирования. (m)
В момент вызова конструктора этого класса в этот указатель записывает объект mO Что бы точно что то там лежало.
m = GetPointer(mO);
Запускаю робот, и меняю объект в классе на свой указатель
new U()
Интересное получается. Если обращение к m идет до замещения (т.е. смотря куда вставить строчку). Где лежит базовый объект, а не замещенный указатель.
При смене тайм фрейма получаю ошибку. Без смены все нормально при работающем роботе.
Но там уже лежит mO. Или новый. Ничего не лежать не может. Что делает смена тайм фрема?
Если же заместить до обращения - смена тайм фрема не приводит к ошибке. Что происходит?
Конструктор библиотеки повторно не вызывается? Куда девается базовый объект?