Erros, bugs, perguntas - página 2679

 
fxsaber:

2365 - o código foi aspergido com erros. Ainda não tinha tempo para o descobrir. Retrocedi para 2361 - estava tudo bem. Em mq4 - a mesma situação.

Obrigado pela mensagem, irei verificar

 
Descarregada uma nova versão do MT5 (build 2365), infelizmente algo está estragado,
Parece estar no parâmetro que passa ao chamar o construtor da classe base.
 
Sergey Dzyublik:
Bug MT5 (build 2365) Erro de compilação na chamada implícita do construtor à classe utilizando operador de atribuição, quando o ponteiro passando por referência é utilizado como argumento do construtor.
Se a passagem do ponteiro por referência é substituída pela passagem do valor, tudo funciona.

Obrigado pelo correio, fixado

 

Erro de compilação MT5 (build 2365) ao chamar construtor de classe base quando o parâmetro de template da classe de template é usado como classe base.
Sem problemas em MT5 (construir 2363).

class B;

template<typename T>
class A : public T{
public:
   A() : T(){}   // 'B' - identifier expected
};


class B{};

void OnStart(){
   A<B> a;
};
 
Ilyas:
Podemos ver que o ArrayResize para objectos é agora mais rápido.
Mais uma vez, a complexidade de uma parte da função ArrayResize foi reduzida de logaritmo para zero

Muito obrigado por acelerar o ArrayResize para memória reservada.
MT5 (build 2365) sobre um projecto real std::vector::push_back é 1,5 vezes mais rápido do que a construção anterior.
E std::vector:reize lag diminuiu de 2,2 vezes para 1,45 vezes.

 

construir 2366, penso que as constantes não estão a funcionar correctamente agora

class A
{
private:
   int               f1(){Print(__FUNCTION__); return(1);}
   int               f2(){Print(__FUNCTION__); return(2);}
public:
   int               func(int v){const int a = f1(); const int b = f2(); return(a+b+v);}
};

A a1,a2;
//+------------------------------------------------------------------+
void OnStart()
{
   Print("1. ",a1.func(1));
   Print("2. ",a1.func(2));
   Print("3. ",a2.func(3));
   Print("4. ",a2.func(4));
}
//+------------------------------------------------------------------+

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 1. 4

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 2. 5

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 3. 6

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 4. 7

se substituir const por static , funcionará como esperado - uma chamada para f1() e f2() durante a inicialização de a e b

  int               func(int v){static int a = f1(); static int b = f2(); return(a+b+v);}

2020.03.21 12:58:03.496 tst (EURUSD,H1) A::f1

2020.03.21 12:58:03.496 tst (EURUSD,H1) A::f2

2020.03.21 12:58:03.496 tst (EURUSD,H1) 1. 4

2020.03.21 12:58:03.496 tst (EURUSD,H1) 2. 5

2020.03.21 12:58:03.496 tst (EURUSD,H1) 3. 6

2020.03.21 12:58:03.496 tst (EURUSD,H1) 4. 7

 

Se escrever um código como este, é um bug total que não pode ser apanhado

class A
{
private:
   int               f1()const {static int v1=1; Print(__FUNCTION__); return(v1++);}
   int               f2()const {static int v2=1; Print(__FUNCTION__); return(v2++);}
public:
   int               func(int v){const int a = f1(); const int b = f2(); return(a+b+v);}
};
 
Igor Makanu:

construir 2366, penso que as constantes não estão a funcionar correctamente agora

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 1. 4

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 2. 5

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 3. 6

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 4. 7

se substituir const por static , funcionará como esperado - uma chamada para f1() e f2() durante a inicialização de a e b

2020.03.21 12:58:03.496 tst (EURUSD,H1) A::f1

2020.03.21 12:58:03.496 tst (EURUSD,H1) A::f2

2020.03.21 12:58:03.496 tst (EURUSD,H1) 1. 4

2020.03.21 12:58:03.496 tst (EURUSD,H1) 2. 5

2020.03.21 12:58:03.496 tst (EURUSD,H1) 3. 6

2020.03.21 12:58:03.496 tst (EURUSD,H1) 4. 7

É exactamente assim que deve funcionar.

 
Igor Makanu:

Se escrever um código como este, é um erro totalmente indetectável.

Aqui também está tudo correcto.

 
Koldun Zloy:

É exactamente assim que deve funcionar.

O ano passado não funcionou dessa forma - testei especialmente modificadores constantes

e parece que@Ilyas explicou como executar um programa MQL, primeiro todas as constantes e estáticas são inicializadas, não importa onde são descritas, e depois os construtores de classes são chamados

ok, com esta inicialização estática / const - ainda pode ser devidamente distribuída, mas o facto de o modificador const não garantir que o compilador irá verificar isto é muito inesperado - o meu segundo exemplo

Razão: