Errori, bug, domande - pagina 2653

 
Vladimir Simakov:

Beh, STL non è una soluzione unica per tutti. Qui bisogna prestare molta attenzione ai dettagli.

Stai confondendo il morbido con il caldo.
Non è una questione di STL. Ci penserò io stesso... (se qualcuno non ce l'ha, non significa che non si possa fare in linea di principio)

Il modo più semplice per implementare tutte le funzionalità possibili con metodi astratti in una classe base o interfaccia, e nei discendenti - o implementazione o =delte.
In questo caso, è necessario passare puntatori o riferimenti dello stesso tipo ai metodi della classe base.
Anche se c'è un male inevitabile sotto forma di una tabella virtuale, ma è meglio organizzare l'architettura in modo tale che non ci siano costose ramificazioni dynamic_cast da nessuna parte.

Il metodo che hai suggerito è stato implementato prima e si basa anche sullo stesso bug:https://www.mql5.com/ru/forum/1111/page2648#comment_15015191


Il bug è nelle priorità della chiamata di funzioni ricaricate quando viene eseguita una conversione implicita di tipo per un parametro puntatore/classe.
In C++ tutto è OK, ma in MQL l'errore di compilazione"ambiguous call to overloaded function"
Una delle varianti di workaround è suggerita sopra, ma è grande e non conveniente, e non ho voglia di usarla per una dozzina di funzioni simili.
Forse c'è qualcosa di più semplice?

 
Le macro fanno il loro lavoro, sono riuscite a ridurre la tela in forma (versione completa nel file allegato):
//+------------------------------------------------------------------+
//|  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 

Sviluppatori, per favore avvisate, ci sono piani per risolvereil bug o è architettonicamente impossibile?
 
Bug MT5(build 2323),
All'interno di una funzione template, un puntatore passato all'interno di una conversione di tipo esplicita si comporta come una classe, causando di conseguenza un errore di compilazione:
#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: C lassA. 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);
};
 

Stupido, non riesce a risolvere un semplice problema. Ho bisogno di capire che il trading è vietato durante le seguenti impostazioni di avvio dell'EA.


Questo controllo non funziona.

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


OrderCheck è una falsa pista. Si prega di avvisare.

 
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);
  }
CodiceANATOLI KAZHARSKI

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

Grazie, non avevo notato il MQL_TRADE_ALLOWED.

 
fxsaber:

Stupido, non riesce a risolvere un semplice problema. Ho bisogno di capire che il trading è vietato durante le seguenti impostazioni di avvio dell'EA.


Questo controllo non funziona.


OrderCheck è una falsa pista. Si prega di avvisare.

Non sono sicuro dal mio cellulare, ma ecco qui:MQL_TRADE_ALLOWED
 
Bug MT5(build 2323), lo stesso oggetto template B<int> può essere creato dopo l'oggetto di classe B<void*>, ma se fatto prima, si verifica un errore di compilazione.
Probabilmente la ragione è il lavoro della cache del generatore di classi template.

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
}
 

Il bug MT5 (build 2340) usa lo stesso codice due volte: primo passaggio - compilazione riuscita, secondo passaggio - errore di compilazione.
Apparentemente i problemi sono legati alla cache del generatore di funzioni template.

L'errore scompare se per la funzione template "
void run(const T &ff)" il trasferimento per riferimento è sostituito dal trasferimento per valore"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     
   }
}
 

Bug MT5(build 2340) Errore di compilazione quando si tenta di accedere alla classe interna per un parametro template di una funzione template.

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);
}