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

 
fxsaber:
Это и есть основная загвоздка задачи.

набросал как вижу... создал 2 ЕА с таким кодом:

#define PREFIX_NAME "QWERTY_"
enum ENUM_EA_STATE {WORK, READY_TO_INIT, ENABLE_INIT, ERROR_GLOBAL_VARIABLE};
const string this_ea_name = PREFIX_NAME + MQLInfoString(MQL_PROGRAM_NAME);
void OnTick()
{
   static ENUM_EA_STATE state = GlobalVariableSet(this_ea_name, ENUM_EA_STATE::READY_TO_INIT) > 0 ? READY_TO_INIT : ERROR_GLOBAL_VARIABLE;
   Comment(EnumToString(state));
   if(state != WORK)
   {
      if(state == ERROR_GLOBAL_VARIABLE) return;
      if(!My_Init(this_ea_name)) return;
      GlobalVariableSet(this_ea_name, ENUM_EA_STATE::WORK);
      state = WORK;
   }
   Print(this_ea_name, " ", __FUNCTION__);
}
//+------------------------------------------------------------------+
bool My_Init(const string chek_ea_name)
{
   if(GlobalVariableGet(chek_ea_name) == (ENUM_EA_STATE)ENABLE_INIT)
   {
      Print("EA is init");
      return(true);
   }
   return(false);
}
//+------------------------------------------------------------------+

и один управляющий ЕА, который работает в таймере ( 5 сек )

#define PREFIX_NAME "QWERTY_"
enum ENUM_EA_STATE {WORK, READY_TO_INIT, ENABLE_INIT, ERROR_GLOBAL_VARIABLE};
//+------------------------------------------------------------------+
int OnInit()
{
   EventSetTimer(5);
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   EventKillTimer();
}
//+------------------------------------------------------------------+
void OnTimer()
{
   for(int i = GlobalVariablesTotal() - 1; i >= 0; i--)
   {
      string curr_gname = GlobalVariableName(i);
      if(StringFind(curr_gname, PREFIX_NAME) !=-1)
      {
         if(GlobalVariableGet(curr_gname) == (ENUM_EA_STATE)READY_TO_INIT)
         {
            if(GlobalVariableSet(curr_gname, ENUM_EA_STATE::ENABLE_INIT) > 0)
            {
               Print("Enable Init : ", curr_gname, ".....exit");
               return;
            }
         }
      }
   }
}
//+------------------------------------------------------------------+


проверил, все работает, единственное или не разобрался или не получилось через GlobalVariableSetOnCondition() сделать запись в глобальные переменные

 
fxsaber:
Это и есть основная загвоздка задачи.

GlobalVariableSetOnCondition — все, что нужно для решения задачи.

Работа разрешена только тогда, когда GlobalVariableSetOnCondition вернул true.
После успешной инициализации и освобождения ресурсов возвращаем гл. переменную в исходное состояние, и другой советник стартует.

В ДеИните — безусловное удаление переменной, чтобы не нарваться на старт терминала без советников вообще (если предыдущая загрузка завершилась некорректно).

 
Alexey Viktorov:
Igor Makanu:
Andrey Khatimlianskii:

Спасибо за рекомендации. Посмотрю в сторону GlobalVariableSetOnCondition.

 
Это правильное поведение компилятора?
class A
{
public:
  static int i;
  
  static int f()
  {
    A::i = 123;
    
    return(A::i);
  }
};

static int A::i = A::f();

void OnStart()
{
  Alert(A::i); // 123
}
Вроде, A::i не создана на момент вызова метода A::f(), в котором идет обращение к A::i.
 
fxsaber:
Это правильное поведение компилятора? Вроде, A::i не создана на момент вызова метода A::f(), в котором идет обращение к A::i.

Что подразумевается под словом "создана" ?

static - всего лишь способ  для создания граблей скрыть глобальную переменную или функцию, ограничив видимость скопом функции или класса

Память под глобальную переменную существует всегда.
И да, для глобальных переменных очень важен порядок инициализации (в смысле, избежать доступа к переменной до её инициализации)
В приведённом примере прокатило...

Документация по MQL5: Основы языка / Переменные / Создание и уничтожение объектов
Документация по MQL5: Основы языка / Переменные / Создание и уничтожение объектов
  • www.mql5.com
После загрузки на исполнение mql5-программы каждой переменной выделяется память в соответствие с типом переменной. Переменные делятся на два типа по уровню доступа - глобальные переменные и локальные переменные, и по классам памяти: входные параметры mql5-программы, статические и автоматические. Каждая переменная при необходимости...
 
Ilyas:

В приведённом примере прокатило...

Менять в этом месте будете компилятор? Лично я бы хотел, чтобы все осталось так, как есть.

 
fxsaber:

Менять в этом месте будете компилятор? Лично я бы хотел, чтобы все осталось так, как есть.

Поведение менять не планируем.

Но есть отложенная задача по обнаружению ошибок доступа к глобальным переменным (до инициализации).
Если фичу реализуем, то  при компиляции приведённого кода получите предупреждение: для инициализации A::i используется функция A::f(), в которой осуществляется доступ к инициализируемой переменной A::i.

Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Глобальные переменные создаются путем размещения их объявлений вне описания какой-либо функции. Глобальные переменные определяются на том же уровне, что и функции, т. е. не локальны ни в каком блоке. Область видимости глобальных переменных - вся программа, глобальные переменные доступны из всех функций, определенных в программе...
 
Ilyas:

Если фичу реализуем, то  при компиляции приведённого кода получите предупреждение: для инициализации A::i используется функция A::f(), в которой осуществляется доступ к инициализируемой переменной A::i.

Спасибо!

 
Ilyas:

Поведение менять не планируем

Тогда это противоречит Вашей же концепции, что переменная считается объявленной с момента завершения объявления. Зачем тогда ее придумываеть вообще было? Если в одном случае так, а в другом - по другому

int i = i; //Error: 'i' - undeclared identifier
В хорошем языке - единые правила, а не наоборот
[Удален]  
A100:

Тогда это противоречит Вашей же концепции, что переменная считается объявленной с момента завершения объявления. Зачем тогда ее придумываеть вообще было? Если в одном случае так, а в другом - по другому

В хорошем языке - единые правила, а не наоборот

Я вооще профан, но до такого (int i = i) я бы и с перепою не додумался....... 8(