Особенности языка mql5, тонкости и приёмы работы - страница 113

 
pavlick_:

Не понимаю, чем хуже моё решение, вставлю и его сюда:

Тем что изначально это был спектакль "смотрите как я умею" и требовалось именно то решение, которое было заранее придумано. А ваше не вписывалось в постановку.

Но даже режиссёр не учёл что согласно Документации порядок вычисления параметров не гарантируется

 
A100:

Но даже режиссёр не учёл что согласно Документации порядок вычисления параметров не гарантируется

Справедливости ради надо отметить, что в документации MQL всё же описан этот момент:

Примечание

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

И далее там даже приведён пример использования этого порядка.  С точки зрения C++ это конечно дикость, но если в MQL это задокументированое правило, то может и нормально, если ты не планируешь портировать свои коды в будущем. А если и планируешь, то можно обезопасить это место проверкой  #ifdef __MQL__

 
A100:

порядок вычисления параметров не гарантируется

Только сейчас обратил внимание на вашу ссылку.  Действительно, там не гарантируется.  Вот уж этот противоречивый MQL ))

 
Alexey Navoykov:

Только сейчас обратил внимание на вашу ссылку.  Действительно, там не гарантируется.  Вот уж этот противоречивый MQL ))

На x32 обратный (думаю сохранится), потому что там прямая связь со стеком. А на x64 смысла в обратном нет, поэтому и гарантий на будущее нет... более того он там выглядит неестественным

Не удивлюсь даже если разный порядок будет с оптимизацией и без

 

За все предложенные варианты хочу сказать Спасибо. Конструктивно помогли решить практическую задачу.


Задача хорошо показала, что если бы вызывался void TimeCurrent(), то ничего бы не вышло. void в текущем виде в состоянии изуродовать многое.

 

Хочу вызвать метод родителя

Вот код, что я делаю не так ??? 

//+------------------------------------------------------------------+
class A
  {
public:
   virtual int Test_A()
     {
      return 100;
     }
  };
//+------------------------------------------------------------------+
class B :public A
  {
public:
   virtual int Test_A()
     {
      return 200;
     }
  };

B b;
//+------------------------------------------------------------------+
void OnStart()
  {
   Comment (A::b.Test_A());
  }
//+------------------------------------------------------------------+


 
Vladimir Pastushak:

Хочу вызвать метод родителя

правильный синтаксис такой:

b.A::Test_A()

но в mql нету ни правильного, ни неправильного.

но вопрос больше к вам - если фукционал нужно вызывать из производного - зачем его пихать в базовую виртуальную функцию?

 

fxsaber:

Задача хорошо показала, что если бы вызывался void TimeCurrent(), то ничего бы не вышло. void в текущем виде в состоянии изуродовать многое.

Навскидку:

#define MACROSV(NEW_HANDLE_, VOIDFN_) \
do{                                   \
   int prev=GetHandle();              \
   if(SelectHandle(NEW_HANDLE_))      \
      VOIDFN_;                        \
   SelectHandle(prev);                \
}while(false)

Два макроса, вроде не сильно больно. Что-то более элегантное, силами мкл, в голову не приходит.

 
pavlick_:

Навскидку:

А зачем там do...while?  Достаточно одних фигурных скобок
 
Alexey Navoykov:
А зачем там do...while?  Достаточно одних фигурных скобок

Чтобы работало:

if(...)
   MACROSV(...);
else
{
}