Erros, bugs, perguntas - página 2661

 
Nikolai Semko:

Peço desculpa por simplificar o código ao mínimo, introduzindo certas imprecisões ao fazê-lo, em particular:
- Os objectos passados para a função têm o mesmo tamanho (código actualizado);
- em vez de impressão de saída muda ("1");/printf("2"); a interface ou os internos do objecto são de facto acedidos directamente, o que por sua vez não permite a linha de dois algoritmos numa única função de chamada (código actualizado).

 
Sergey Dzyublik:

Peço desculpa por simplificar o código ao mínimo, introduzindo certas imprecisões ao fazê-lo, em particular:
- Os objectos passados para a função têm o mesmo tamanho (código actualizado);
- em vez de impressão de saída muda ("1");/printf("2"); a interface ou os internos do objecto são de facto acedidos directamente, o que por sua vez não permite a linha de dois algoritmos numa única função de chamada (código actualizado).

class C{
public:
   struct A{
   public:
      char aaa;
      
      A (char value = 0) : aaa(value){}
      void set(char value){
         aaa = value; 
      };
      uint Type(){return 0x778F6712;}
      char get(){return aaa;}
      A Get() {return this;}
   };
   
   void test(A&, A& a1, A& a2){
      printf("1");
      a1.aaa = a2.aaa;
   }
   
   template<typename T>
   void test(A& a, T& d1, T& d2){
      if (a.Type()== d1.Type()) test(a,d1.Get(),d2.Get());
      else {
      printf("2");
      d1.set(d2.get());}
   }
};

struct B : public C::A{};


struct D{
private:
   char data;
public:  
   D(char value = 0) : data(value){}
   void set(char value){
      data = value; 
   };
   uint Type(){return 0x308FD7FE;}
   char get(){return data;}
   D Get() {return this;}
};


void OnStart(){
   C c;

   B b;
   D d;
   
   c.test(b, b, b);    // 1      should be: 1
   c.test(b, d, d);    // 2      should be: 2   
}


Ou assim:

class C{
public:
   struct A{
   public:
      char aaa;
      
      A (char value = 0) : aaa(value){}
      void set(char value){
         aaa = value; 
      };
      char get(){return aaa;}
      A Get() {return this;}
   };
   
   void test(A&, A& a1, A& a2){
      printf("1");
      a1.aaa = a2.aaa;
   }
   
   template<typename T>
   void test(A& a, T& d1, T& d2){
      printf("2");
      d1.set(d2.get());
   }
};

struct B : public C::A{};


struct D{
private:
   char data;
public:  
   D(char value = 0) : data(value){}
   void set(char value){
      data = value; 
   };
   char get(){return data;}
   D Get() {return this;}
};


void OnStart(){
   C c;

   B b;
   D d;
   
   c.test(b.Get(), b.Get(), b.Get());    // 1      should be: 1
   c.test(b.Get(), d.Get(), d.Get());    // 2      should be: 2   
}
 
Obrigado pela solução,
não é ideal pois requer alterações na estrutura dos objectos usados e difere a lógica, mas funciona.

E sim, é melhor fazer um invólucro funcionar durante o teste:
   template<typename T>
   void test(A& a, T& t1, T& t2){ 
      __test(a, t1.CastToMain(), t2.CastToMain());
   }
Do que pesquisar através do projecto para todas as chamadas:
   c.test(b, b.CastToMain(), b.CastToMain());    // 1      should be: 1
   c.test(b, d.CastToMain(), d.CastToMain());    // 2      should be: 2  
De qualquer modo, muito obrigado pela vossa ajuda.
 
Sergey Dzyublik:
Obrigado pela solução,
Não é ideal porque requer alterações na estrutura dos objectos usados e difere a lógica, mas funciona.

E sim, melhor fazer um invólucro funcionar durante o teste:
do que pesquisar através do projecto para todas as chamadas:

De qualquer modo, muito obrigado pela vossa ajuda.

Sim, concordo.

 

Defeitos na função do modelo/na operação de cache da classe:
(não fixado pelo MT5(build 2345)) ** Comportamento indefinido, cria-se várias vezes um objecto complexo embrulhado com tipo interno "C" e acaba por ser um tipo de dados completamente diferente, talvez "B", talvez "int", o que se quiser...
(não fixado pelo MT5(build 2345)) * Compile Error, bug ao passar um ponteiro de função como um argumento de modelo de ref. constante.
(não fixado pelo MT5(build 2345)) * Compile Error, B<int> object pode ser criado depois de B<void*> class object, mas o erro de compilação ocorre se for feito antes.


Defeitos na função/classe de trabalho do modelo:
(não fixado pelo MT5(build 2345)) ** Erro de compilação, bug dentro da função de modelo, ponteiro passado dentro da operação deconversão de tipo explícito comporta-se como uma classe, caso contrário como um ponteiro.
(não fixado pelo MT5(build 2345)) ** Compile Error, bug com geração de código de classe de modelo enquanto se utiliza a classe interna.
(não fixado pelo MT5(build 2345)) ** Erro de compilação, erro na tentativa de acesso à classe interna para parâmetro de função de modelo de modelo.
(não fixado pelo MT5(build 2345)) ** Compile Error, bug na geração do método/classe do modelo, o processo de "auto-completamento" do parâmetro do modelo sai do scop para o código principal do programa.
(não fixado pelo MT5(build 2345)) * Erro de compilação, erro com ausência de código de classe de modelo autogerado quando a classe de modelo actua como valor de retorno para o método de modelo.
(não fixado pelo MT5(build 2345)) * Compile Error, bug na definição de classe interna - nenhuma referência ao espaço de nomes global ao definir uma classe base.
(não fixado pelo MT5(build 2345)) *(novo) Compile Error, bug na passagem da estrutura interna para a função template, otipo de dados resultante não pode ser utilizado como tipo de dados de base para outra estrutura interna na classe template.
(não fixado pelo MT5(build 2345)) *(novo) Compile Error, um erro ao chamar uma função modelo com tipos de argumentos explícitos quando chamado a partir de uma função sobrecarregada não-modelo.


Defeitos em função sobrecarregada chamam a desadequação de prioridade em MQL em comparação com C++:
(não fixado pelo MT5(build 2345)) *** Erro de compilação quando há herança de classe A <= B <= C <= D e duas funções de sobrecarga são implementadas, por exemplo, uma com o parâmetro A* e outra com o parâmetro B*, passando depois em tal função um objecto C* ou D* em MQL causa um erro de compilação "chamada ambígua para função sobrecarregada".
(não fixado pelo MT5(build 2345)) ** Tempo de execução, desajuste prioritário para chamadas de funções de modelo sobrecarregadas.
(não corrigido por MT5(build 2345)) **(novo) Compile Error, a prioridade das chamadas de funções de modelo sobrecarregadas depende efectivamente do tipo de parâmetro do modelo, que teoricamente não deve afectar o resultado da compilação.
(não fixado pelo MT5(build 2345)) **(novo) Compile Error, ocorre um erro de compilação ao gerar código para uma função de modelo, apesar de haver uma função de modelo sobrecarregada com uma assinatura adequada para os parâmetros passados.



Sugestões:
ref- em permitir que os literais e as variáveis temporárias sejam passados como constantes ref argumentos para uma função.
link- aomover ficheiros de projectos no separador Projecto, para ficheiros móveis que estão abertos e nos separadores ME, actualize automaticamente o seu caminho de localização.
link- para introduzir a funcionalidade de declaração de typedef em MQL.
link- sobre a possibilidade de forçar a geração de construtores de cópias por defeito e operadores de atribuição.

 

Sergey Dzyublik:
Спасибо за вариант решения

a ligação é uma cópia temporária, pelo que não se pode alterar a estrutura

 
Andrei Trukhanovich:
A referência é uma cópia temporária, pelo que não se pode alterar a estrutura

Tem razão no caso geral...
Mas em casos particulares é muito mais complicado e na realidade as estruturas dadas são iteradores e não são os seus conteúdos que são alterados, mas sim os objectos a que se referem.
Assim, o problema é resolvido no caso especial e estou-lhe grato por isso.

 
Bug MT5 (build 2345) muitos defeitos relacionados com o retorno do objecto "no local criado" quando o objecto é uma classe/estrutura de modelo:

class A{
public:
   A(int, int, int){};  
   A(const A&){}
   A(const A*){}
};

// simple class type
A* test_a_ptr_ptr(){
   return &A(1,2,3);               //OK
};

A test_a_class_class(){
   return A(1,2,3);                //OK
};

A test_a_ptr_class(){
   return &A(1,2,3);               //OK
};


template<typename T>
class B{
public:
   B(int &){}
   B(long){}
   B(int, int, int){};  
   B(const B&){}
   B(const A*){}
};

// template class type
B<A*> test_b_class_class(){
   B<A*> b(1);
   int x = 22;
   
   return B<A*>();              // Compile Error: ambiguous call to overloaded function with the same parameters: "B(long)" and "B(const A*)"
   return B<A*>(1,2,3);         // Compile Error: only one argument is acceptable, argument should be castable to int
   return B<A*>(x);             // Compile Error: argument is passed by value instead of by reference.
   return B<A*>((A*)NULL);      // Compile Error: 'int' - invalid cast operation        
   return B<B<B<long>>>(1);     // Compile Error: OK, template parameter type does not provide any effort on compilation result
   
   return b;
};

B<A*>* test_b_ptr_ptr(){
   B<A*> b(1);
   
   return &B<A*>(1);            // Compile Error: '&' - illegal operation use
   return &b;                 
};


void OnStart (){ 
   // simple class type
   A* a_ptr = test_a_ptr_ptr();
   A a0 = test_a_class_class();
   A a1 = test_a_ptr_class();
   
   // template class type
   B<A*> b0 = test_b_class_class();
   B<A*>* b_ptr = test_b_ptr_ptr();
}
 

Fórum sobre comércio, sistemas automatizados de comércio e testes de estratégia comercial

Insectos, insectos, perguntas

Sergey Dzyublik, 2020.03.01 12:53

class A{
public:
   A(int, int, int){};  
   A(const A&){}
   A(const A*){}
};

// simple class type
A* test_a_ptr_ptr(){
   return &A(1,2,3);               //OK
};

Se bem entendi, então esta função devolverá o ponteiro ao objecto que não existe?

 
fxsaber:

Compreendo correctamente que esta função irá devolver um ponteiro a um objecto inexistente?

Sim, neste exemplo a função irá devolver um ponteiro a um objecto inexistente.
O principal objectivo deste código é mostrar que existe funcionalidade funcional para uma classe simples e, ao mesmo tempo, não existe nenhuma para uma classe modelo.

Razão: