Работа разрешена только тогда, когда GlobalVariableSetOnCondition вернул true. После успешной инициализации и освобождения ресурсов возвращаем гл. переменную в исходное состояние, и другой советник стартует.
В ДеИните — безусловное удаление переменной, чтобы не нарваться на старт терминала без советников вообще (если предыдущая загрузка завершилась некорректно).
fxsaber: Это правильное поведение компилятора? Вроде, A::i не создана на момент вызова метода A::f(), в котором идет обращение к A::i.
Что подразумевается под словом "создана" ?
static - всего лишь способ для создания граблей скрыть глобальную переменную или функцию, ограничив видимость скопом функции или класса
Память под глобальную переменную существует всегда. И да, для глобальных переменных очень важен порядок инициализации (в смысле, избежать доступа к переменной до её инициализации) В приведённом примере прокатило...
После загрузки на исполнение mql5-программы каждой переменной выделяется память в соответствие с типом переменной. Переменные делятся на два типа по уровню доступа - глобальные переменные и локальные переменные, и по классам памяти: входные параметры mql5-программы, статические и автоматические. Каждая переменная при необходимости...
Менять в этом месте будете компилятор? Лично я бы хотел, чтобы все осталось так, как есть.
Поведение менять не планируем.
Но есть отложенная задача по обнаружению ошибок доступа к глобальным переменным (до инициализации). Если фичу реализуем, то при компиляции приведённого кода получите предупреждение: для инициализации A::i используется функция A::f(), в которой осуществляется доступ к инициализируемой переменной A::i.
Глобальные переменные создаются путем размещения их объявлений вне описания какой-либо функции. Глобальные переменные определяются на том же уровне, что и функции, т. е. не локальны ни в каком блоке. Область видимости глобальных переменных - вся программа, глобальные переменные доступны из всех функций, определенных в программе...
Если фичу реализуем, то при компиляции приведённого кода получите предупреждение: для инициализации A::i используется функция A::f(), в которой осуществляется доступ к инициализируемой переменной A::i.
Тогда это противоречит Вашей же концепции, что переменная считается объявленной с момента завершения объявления. Зачем тогда ее придумываеть вообще было? Если в одном случае так, а в другом - по другому
Тогда это противоречит Вашей же концепции, что переменная считается объявленной с момента завершения объявления. Зачем тогда ее придумываеть вообще было? Если в одном случае так, а в другом - по другому
В хорошем языке - единые правила, а не наоборот
Я вооще профан, но до такого (int i = i) я бы и с перепою не додумался....... 8(
Это и есть основная загвоздка задачи.
набросал как вижу... создал 2 ЕА с таким кодом:
и один управляющий ЕА, который работает в таймере ( 5 сек )
проверил, все работает, единственное или не разобрался или не получилось через GlobalVariableSetOnCondition() сделать запись в глобальные переменные
Это и есть основная загвоздка задачи.
GlobalVariableSetOnCondition — все, что нужно для решения задачи.
Работа разрешена только тогда, когда GlobalVariableSetOnCondition вернул true.
После успешной инициализации и освобождения ресурсов возвращаем гл. переменную в исходное состояние, и другой советник стартует.
В ДеИните — безусловное удаление переменной, чтобы не нарваться на старт терминала без советников вообще (если предыдущая загрузка завершилась некорректно).
Спасибо за рекомендации. Посмотрю в сторону GlobalVariableSetOnCondition.
Это правильное поведение компилятора? Вроде, A::i не создана на момент вызова метода A::f(), в котором идет обращение к A::i.
Что подразумевается под словом "создана" ?
static - всего лишь способ для создания граблей скрыть глобальную переменную или функцию, ограничив видимость скопом функции или класса
Память под глобальную переменную существует всегда.
И да, для глобальных переменных очень важен порядок инициализации (в смысле, избежать доступа к переменной до её инициализации)
В приведённом примере прокатило...
В приведённом примере прокатило...
Менять в этом месте будете компилятор? Лично я бы хотел, чтобы все осталось так, как есть.
Менять в этом месте будете компилятор? Лично я бы хотел, чтобы все осталось так, как есть.
Поведение менять не планируем.
Но есть отложенная задача по обнаружению ошибок доступа к глобальным переменным (до инициализации).
Если фичу реализуем, то при компиляции приведённого кода получите предупреждение: для инициализации A::i используется функция A::f(), в которой осуществляется доступ к инициализируемой переменной A::i.
Если фичу реализуем, то при компиляции приведённого кода получите предупреждение: для инициализации A::i используется функция A::f(), в которой осуществляется доступ к инициализируемой переменной A::i.
Спасибо!
Поведение менять не планируем
Тогда это противоречит Вашей же концепции, что переменная считается объявленной с момента завершения объявления. Зачем тогда ее придумываеть вообще было? Если в одном случае так, а в другом - по другому
В хорошем языке - единые правила, а не наоборотТогда это противоречит Вашей же концепции, что переменная считается объявленной с момента завершения объявления. Зачем тогда ее придумываеть вообще было? Если в одном случае так, а в другом - по другому
В хорошем языке - единые правила, а не наоборотЯ вооще профан, но до такого (int i = i) я бы и с перепою не додумался....... 8(