Ошибки, баги, вопросы - страница 239

 

Только что график "обновился". И опять то же самое:

 

 
Yedelkin:

Только что график "обновился". И опять то же самое:

 

Срочно в сервисдеск пишите и не закрывайте терминал
 
AlexSTAL:
Срочно в сервисдеск пишите и не закрывайте терминал
ОК, тупо скопирую ссылку на эту тему.
 

Только что проверил в терминале - график EURUSD M1 на указанном месте присутствует полностью без разрывов.

Попробуйте дать команду "Обновить" из контекстного меню графика.

 
Renat:

Только что проверил в терминале - график EURUSD M1 на указанном месте присутствует полностью без разрывов.

Попробуйте дать команду "Обновить" из контекстного меню графика.

Обновилось вручную, спасибо. Поскольку с графиками практически не работаю, то возник вопрос: а как на уровне эксперта обновлять базу минуток в подобной ситуации? Терминал ведь работает только с той базой, которая имеется у него. Встраивать функцию проверки синхронизации?
 
Renat:

Только что проверил в терминале - график EURUSD M1 на указанном месте присутствует полностью без разрывов.

Попробуйте дать команду "Обновить" из контекстного меню графика.


Мне кажется, что где-то плавающий баг.... Раз не только у меня одного примерно похожая ситуация происходит....
 
Yedelkin:
Обновилось вручную, спасибо. Поскольку с графиками практически не работаю, то возник вопрос: а как на уровне эксперта обновлять базу минуток в подобной ситуации? Терминал ведь работает только с той базой, которая имеется у него. Встраивать функцию проверки синхронизации?

Я в таймере запоминал время потери и возобновления связи.

Имея эту информацию можно попробовать подгрузить историю за период (можно тут и проверить синхронность с сервером, если будет смысл).

 

Господа разработчики, у меня нет слов. Столкнулся с трудноотлавливаемой проблемой "затирания" локальных переменных в методе объекта после внутреннего вызова этого же метода но у другого объекта. Может быть это связано с какой то оптимизацией во вложенных вызовах функций объектов, но по крайней мере ошибок в логе никаких нет, как и утечек памяти. Код большой привести не могу, но смысл в принципе будет ясен из примеров:

вариант 1

bool operate(CAlgoBlockLogic* s1, CAlgoBlockLogic* s2) {
 bool d1 = s1.process();
 bool d2 = s2.process();
 return (d2 && d1);
}

вариант 2

bool operate(CAlgoBlockLogic* s1, CAlgoBlockLogic* s2) {
 return (s2.process() && s1.process());
}

По идее, код должен работать абсолютно идентично. Но... варианты работают по разному.

Итак. 1 вариант работает неверно. Запустив запись в отладочный файл - выяснил, что переменная d1 определенная в функции operate затирается значением переменной d1 во внутреннем вызове такой же функции operate, но у другого объекта такого же типа. Т.е. короче говоря. после вызова
 bool d2 = s2.process();

переменная d1 меняет свое значение, на то, которое произошло во внутреннем вызове operate внутри s2.process. Такое поведение как при смене значения у статической переменной для объектов одного типа. Но здесь переменная явно имеет локальную область видимости.

Про статическую переменную вопрос в этой ветке поднимался и с ними все ясно. Но как быть с неопределенностью значений локальных переменных?

Документация по MQL5: Основы языка / Переменные / Область видимости и время жизни переменных
Документация по MQL5: Основы языка / Переменные / Область видимости и время жизни переменных
  • www.mql5.com
Основы языка / Переменные / Область видимости и время жизни переменных - Документация по MQL5
 

"...переменная d1 определенная в функции operate затирается значением переменной d1 во внутреннем вызове такой же функции operate, но у другого объекта такого же типа. Т.е. короче говоря. после вызова
bool d2 = s2.process();
переменная d1 меняет свое значение, на то, которое произошло во внутреннем вызове operate внутри s2.process."

Похоже либо на скрытую рекурсию, с обычным набором побочных явлений, либо на ...

 
Vigor:

По идее, код должен работать абсолютно идентично. Но... варианты работают по разному.


Нет. Не идентично.

В первом варианте s1.process и s2.process вызовутся безусловно

Во втором варианте s1.process вызовется только в случае, если s2.process вернёт true. Это называется "укороченная оценка условия"

Причина обращения: