Erros, bugs, perguntas - página 2653

 
Vladimir Simakov:

Bem, a STL não é uma solução de tamanho único. Aqui tem de prestar muita atenção a pormenores específicos.

Está a confundir suavidade com calor.
Não é uma questão de STL. Eu próprio vou descobrir isso... (se alguém não o tem, isso não significa que não possa ser feito em princípio)

A forma mais fácil de implementar toda a funcionalidade possível com métodos abstractos numa classe ou interface de base, e nos descendentes - ou implementação ou =delte.
Neste caso, é necessário passar indicações ou referências do mesmo tipo para os métodos da classe base.
Embora exista um mal inevitável sob a forma de uma mesa virtual, mas é melhor organizar a arquitectura de tal forma que não haja ramificações dispendiosas via dynamic_cast em qualquer lugar.

O método que sugeriu foi implementado anteriormente e também depende do mesmo bug:https://www.mql5.com/ru/forum/1111/page2648#comment_15015191


O bug está nas prioridades de chamar funções recarregadas quando é feita uma conversão de tipo implícita para um parâmetro de ponteiro/classe.
Em C++ tudo está bem, mas em MQL o erro de compilação"chamada ambígua para função sobrecarregada"
Uma das variantes de trabalho é sugerida acima, mas é grande e não conveniente, e não tenho qualquer desejo de a utilizar para uma dúzia de funções semelhantes.
Talvez haja algo mais simples?

 
As macros fazem o seu trabalho, conseguiram reduzir a tela a formar (versão completa no ficheiro anexo):
//+------------------------------------------------------------------+
//|  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 

Os desenvolvedores, por favor aconselhem, existem planos para corrigiro bug ou isto é arquitectonicamente impossível?
Arquivos anexados:
 
Bug MT5(build 2323),
Dentro de uma função de modelo, um ponteiro passado dentro de uma conversão de tipo explícito comporta-se como uma classe, causando um erro de tempo de compilação em conformidade:
#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);
};
 

Burro, não consegue resolver um problema simples. Preciso de compreender que a negociação é proibida durante as seguintes configurações de arranque da EA.


Esta verificação não funciona.

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


OrderCheck é um engano vermelho. Por favor, aconselhar.

 
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);
  }
CódigoANATOLI KAZHARSKI

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

Obrigado, não reparei no MQL_TRADE_ALLOWED.

 
fxsaber:

Burro, não consegue resolver um problema simples. Preciso de compreender que a negociação é proibida durante as seguintes configurações de arranque da EA.


Esta verificação não funciona.


OrderCheck é um engano vermelho. Por favor, aconselhar.

Não tenho a certeza do meu telemóvel, mas aqui está:MQL_TRADE_ALLOWED
 
Bug MT5(build 2323), o mesmo objecto modelo B<int> pode ser criado após objecto da classe B<void*>, mas se for feito antes, ocorre um erro de compilação.
Provavelmente a razão é o trabalho da cache do gerador de classes modelo.

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
}
 

Bug MT5(build 2340) usa o mesmo código duas vezes: primeiro passe - compilação bem sucedida, segundo passe - erro de compilação.
Aparentemente, os problemas estão relacionados com a cache do gerador de funções modelo.

O erro desaparece se para a função modelo "
void run(const T &ff)" a transferência por referência é substituída pela transferência pelo valor"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) Erro de compilação ao tentar aceder à classe interna para um parâmetro de modelo de uma função de modelo.

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