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

 
Vladimir Simakov:

Ну не перекладывается STL один в один. Тут надо с большим оглядом на специфику. 

Вы путаете теплое с мягким.
Вопрос не в STL. Там сам разберусь... (если у кого-то не перекладывается, это не означает, что это не возможно в принципе сделать)

Проще всего весь возможный функционал абстрактными методами в базовом классе или интерфейсе прописать, а в наследниках - или реализацию, или =delte. 
В этом случае передаются в методы указатели или ссылки с типом этого самого базового класса. 
Правда тут неизбежное зло в виде виртуальной таблицы, но это бог с ним, а вот архитектуру желательно выстроить, что бы не было нигде дорогого ветвления через dynamic_cast.

Предложенный вами способ был реализован ранее и так же упирается в этот же баг: https://www.mql5.com/ru/forum/1111/page2648#comment_15015191


Баг в приоритетах вызова перезагруженных функций, когда для параметра указателя/класса выполняется implicit type conversion.
В С++ - все ОК, а в MQL - ошибка компиляции "ambiguous call to overloaded function"
Выше предложен один из вариантов обхода, но он большой и не удобный, и использовать его еще для десятка таких же функций желания ну ни как нет.
Возможно есть что-то по проще???

 
Макросы делают свое дело, удалось полотно сократить к виду (полная версия в файле вложения):
//+------------------------------------------------------------------+
//|  MQL realization                                                 |
//+------------------------------------------------------------------+
#ifdef __MQL5__
   template <typename _InputIter>
   CREATE_MISSED_ITERATOR_FUNCTION_FW_P2(int, distance, _InputIter&, _InputIter&);
   
   template <typename _InputIter>
   CREATE_MISSED_ITERATOR_FUNCTION_RA_P2(int, distance, _InputIter&, _InputIter&);

   template <typename _InputIter>
   CREATE_MAIN_ITERATOR_FUNCTION_P2(int, distance, _InputIter&, _InputIter&, _InputIter);
   
   void OnStart(){
      MyIterator it1(1);
      MyIterator it2(5);
      printf("result:%d", distance(it1, it2));            
   }
#endif 

Разработчики, подскажите пожалуйста, планируется ли исправление бага или это архитектурно невозможно?
Файлы:
 
Баг МТ5(build 2323),
внутри шаблонной функции, переданный указатель в рамках операции явного приведения типа ведет себя как класс, вызывая, соответственно, ошибку компиляции:
#define PRINT(x) ; Print(#x, ":", string(x))

template<typename T>
class ClassWrapper{
public:
   T data;
};

class ClassA{};
class ClassB : public ClassA{};


template<typename T, typename TT>
void func(const T &_wrapper, const TT &value){
   T wrapper = _wrapper;   
   
   PRINT(typename(wrapper.data));         // Ok: ClassA*
   PRINT(typename(value));                // Ok: ClassA*
   PRINT(typename(TT));                   // Ok: ClassA*
   
   //wrapper.data = (TT)(value);          // Compiler Error: 'value' - object required  
   //wrapper.data = (TT)(wrapper.data);   // Compiler Error: 'data' - object required   
   
   ClassB b;
   PRINT(typename((TT)(b)));              // Result: ClassA. During explicit type conversion, TT is "ClassA" instead of "ClassA*"
};


void OnStart(){
   ClassWrapper<ClassA*> a_ptr_wrapper;
   
   ClassA a;
   const ClassA* a_ptr = &a;
   func(a_ptr_wrapper, a_ptr);
};
 

Туплю, не могу решить простую задачу. Нужно при следующих настройках запуска советника понять, что торговля запрещена.


Такая проверка не прокатывает.

int OnInit()
{
  Alert(AccountInfoInteger(ACCOUNT_TRADE_EXPERT) &&
        AccountInfoInteger(ACCOUNT_TRADE_ALLOWED) &&
        TerminalInfoInteger(TERMINAL_TRADE_ALLOWED)); // true
        
  return(INIT_FAILED);
}


OrderCheck - из пушки по воробьям. Прошу подсказать.

 
bool CheckTradingPermission()
  {
//--- Для режима реального времени
   if(IsRealtime())
     {
      //--- Проверка соединения с сервером
      if(!TerminalInfoInteger(TERMINAL_CONNECTED))
         return(false);
      //--- Разрешение на торговлю на уровне данной запущенной программы
      if(!MQLInfoInteger(MQL_TRADE_ALLOWED))
         return(false);
      //--- Разрешение на торговлю на уровне терминала
      if(!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
         return(false);
      //--- Разрешение на торговлю для текущего счета
      if(!AccountInfoInteger(ACCOUNT_TRADE_ALLOWED))
         return(false);
      //--- Разрешение на автоматическую торговлю для текущего счета
      if(!AccountInfoInteger(ACCOUNT_TRADE_EXPERT))
         return(false);
     }
//---
   return(true);
  }
ANATOLI KAZHARSKI код

Anatoli Kazharski
Anatoli Kazharski
  • www.mql5.com
Опубликовал статью ZigZag всему голова (Часть II): Примеры получения, обработки и отображения данных В первой части был описан модифицированный индикатор ZigZag и класс для получения данных индикаторов такого типа. Теперь мы покажем как создать индикаторы на основе этих инструментов, а также напишем эксперта для тестов, который будет заключать...
 
Fast235:
ANATOLI KAZHARSKI код

Спасибо, не заметил MQL_TRADE_ALLOWED.

 
fxsaber:

Туплю, не могу решить простую задачу. Нужно при следующих настройках запуска советника понять, что торговля запрещена.


Такая проверка не прокатывает.


OrderCheck - из пушки по воробьям. Прошу подсказать.

С мобилы не подскажу точно, но вот: MQL_TRADE_ALLOWED
 
Баг MT5(build 2323), один и тот же шаблонный объект B<int> можно создать после объекта класса B<void*>, но если сделать это перед, то возникает ошибка компиляции.
Возможно причина в  работе кеша генератора шаблонных классов.

template<typename T>
class B{
   T data;
};

void OnStart (){ 
   //B<int> b_int_0;    // Compiler Error  'void' - unexpected token, probably type is missing?
   B<void*> b;          // OK
   B<int> b_int_1;      // OK
}
 

Баг MT5(build 2340)  дважды используется один и тот же код: первый проход - успешная компиляция, второй - ошибка компиляции.
Видимо проблемы связаны с кешом генератора шаблонных функций. 
Ошибка исчезает если для шаблонной функции "
void run(const T &ff) заменить передачу по ссылке на передачу по значению "void run(const T ff)".

void func(){
}

template<typename T>
void run(const T &ff){
   ff();
}

void OnStart (){ 
   {
      typedef void(*f_ptr)();
      f_ptr ff = func;
      run(ff);             // OK
   }
   {
      typedef void(*f_ptr)();
      f_ptr ff = func;
      run(ff);            // Compile Error: 'ff' - parameter conversion not allowed     
   }
}
 

Баг MT5(build 2340)  Ошибка компиляции при попытке доступа к internal class для шаблонного параметра шаблонной функции.

class B{
public:
   class C{};
};


// Bypass Compile Error
template<typename T>
class GetClassType{
public:
   class type : public T{};
};


template<typename T>
void func(const T &b){
   T::C* c_ptr = new T::C;          // Compile Error: 'T' - struct undefined    
   
   // Bypass Compile Error
   GetClassType<T>::type::C* c_ptr_bps = new GetClassType<T>::type::C();
};

void OnStart (){ 
   B b;
   func(b);
}