Errores, fallos, preguntas - página 2679

 
fxsaber:

2365 - el código estaba salpicado de errores. Todavía no he tenido tiempo de resolverlo. He retrocedido hasta el 2361 y todo ha ido bien. En mq4 - la misma situación.

Gracias por el mensaje, lo comprobaré

 
Descargué una nueva versión de MT5 (build 2365), desafortunadamente algo está roto,
Parece estar en el paso de parámetros al llamar al constructor de la clase base.
 
Sergey Dzyublik:
Bug MT5 (build 2365) Error de compilación en la llamada implícita del constructor a la clase que utiliza el operador de asignación, cuando se utiliza el puntero que pasa por referencia como argumento del constructor.
Si el paso de punteros por referencia se sustituye por el paso de valores, todo funciona.

Gracias por el post, arreglado

 

Error de compilación en MT5 (build 2365) al llamar al constructor de la clase base cuando se utiliza el parámetro de la plantilla como clase base.
No hay problemas en MT5 (build 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 ArrayResize para objetos es más rápido ahora.
Una vez más, la complejidad de una parte de la función ArrayResize se redujo de logaritmo a cero

Muchas gracias por acelerar ArrayResize para la memoria reservada.
MT5 (build 2365) en un proyecto real std::vector::push_back es 1,5 veces más rápido que el build anterior.
Y el retraso de std::vector:resize ha disminuido de 2,2 veces a 1,45 veces.

 

build 2366, creo que las constantes no funcionan correctamente ahora

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

si sustituye const por static , funcionará como se espera - una llamada a f1() y f2() durante la inicialización de a y 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

 

Si escribes el código así, es un error total que no se puede coger

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:

build 2366, creo que las constantes no funcionan correctamente ahora

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

si sustituye const por static , funcionará como se espera - una llamada a f1() y f2() durante la inicialización de a y 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

Así es exactamente como debería funcionar.

 
Igor Makanu:

Si escribes el código así, es un error totalmente indetectable.

Aquí también todo es correcto.

 
Koldun Zloy:

Así es exactamente como debería funcionar.

El año pasado no funcionó así - probé especialmente los modificadores const

y parece que@Ilyas explicó cómo ejecutar un programa MQL, primero se inicializan todas las const y static, no importa dónde se describan, y luego se llaman los constructores de la clase

ok, con esta inicialización static / const - todavía se puede distribuir correctamente, pero el hecho de que el modificador const no garantiza que el compilador compruebe esto es muy inesperado - mi segundo ejemplo