Errores, fallos, preguntas - página 2839

 

En los gráficos (especialmente en el EURUSD) con marcos temporales mensuales y semanales, el retículo se mueve muy lentamente siguiendo al cursor; basta con mover el cursor suavemente en diagonal para reproducirlo. Está bien en otros plazos. No hubo tal retraso antes


 
A100:
Error de ejecución:

Resultado: 1-2-2-0-0-0

Resultado esperado: 1-2-0-0

como en C++. Además, se esperaba que la sintaxis fuera uniforme: un reparto es un reparto, no una llamada al constructor

Todo parece correcto. Es que probablemente se llame ahí al constructor move, que en MQL se sustituye por copy.
Y la conversión es como (A)a1.
 
Alexey Navoykov:
Todo parece correcto, creo. Probablemente se llame allí al constructor move, que en MQL se sustituye por copy.
Una conversión es como (A)a1

(A)a1 o A(a1) no es un casting, es una declaración de un tipo como en los docs. Aunque ahora hay algo que falla en los paréntesis. Se necesita un formato único para la lengua.

 
Valeriy Yastremskiy:

Laconversión de tipo(A)a1 o A(a1) A a1 no es una conversión, sino una declaración de tipo como en los documentos. Aunque ahora hay algo que falla en los paréntesis. Se necesita un formato común para la lengua.

La diferencia es que (A)a1 en los pluses significa la conversión de la copia del objeto. Y en MQL es la conversión de referencia. Debido a esto, se puede obtener un problema de compatibilidad.
Hace tiempo les pedí que hicieran una conversión como en los pluses: (A&)a1, pero ahora probablemente no cambien nada.
 
Alexey Navoykov:
La diferencia aquí es que en los pluses (A)a1 significa traer una copia de un objeto. Y en MQL es la conversión de referencia. Debido a esto, uno puede encontrar problemas de compatibilidad.
Hace tiempo que les pedí que hicieran una conversión sónica como en los pluses: (A&)a1, pero es probable que ahora no cambien nada.

No si no python) algo intermedio. Uy, no lo sabía, me imaginé la conversión del tipo de objeto. Economía).

 
Alexey Navoykov:
Todo parece correcto. Es que probablemente se llame allí al constructor de movimiento, que en MQL se sustituye por la copia.
Y el fantasma es como (A)a1

Dudo que sea correcto, porque digamos:

class A {
public:
        virtual void f() { Print( 1 ); }
};
class B : public A {
public:
        virtual void g() { ((A)this).f(); }
};
class C : public B {
public:
        virtual void f() { Print( 3 ); }
};
void OnStart()
{
        B *b = new C;
        b.g();
}

El resultado en MQL: 3

y en C++: 1.

En cualquier caso, haz que comprueben

 
A100:

Dudo que esto sea correcto, porque digamos:

El resultado en MQL: 3

y en C++: 1.

En cualquier caso, haz que comprueben

Así que esta es exactamente la situación que he descrito anteriormente.
 
A100:

Dudo que esto sea correcto, porque digamos:

El resultado en MQL: 3

y en C++: 1.

En cualquier caso, que lo comprueben.

Yo no sería tan categórico a la hora de interpretar el código MQL en C++.
Código para C++ (en línea: https://onlinegdb.com/Hy1FIj9Qv):

class A {
public:
        virtual void f() { printf( "1" ); }
};
class B : public A {
public:
        virtual void g_ptr() { ((A*)(this))->f(); }   //3
        virtual void g_ref() { ((A&)(*this)).f(); }   //3
        virtual void g_cast() { ((A)(*this)).f(); }   //1
};
class C : public B {
public:
        virtual void f() { printf( "3" ); }
};
void OnStart()
{
        B *b = new C;
        b->g_ptr();
        b->g_ref();
        b->g_cast();
}

int main()
{
    OnStart();
    return 0;
}
 
Sergey Dzyublik:

Yo no sería tan inequívoco al interpretar el código MQL en C++.
El código es para C++ (en línea: https://onlinegdb.com/Hy1FIj9Qv):

¿Y cómo propones escribir la tercera versión de g_cast en MQL?

 
A100:

¿Y cómo propones escribir la tercera versión de g_cast en MQL?

Puedes llamar explícitamente a la función desde la clase base:

class A {
public:
        virtual void f() { Print( 1 ); }
};
class B : public A {
public:
        virtual void g() { this.A::f(); }   //1
};
class C : public B {
public:
        virtual void f() { Print( 3 ); }
};
void OnStart()
{
        B *b = new C;
        b.g();
}