Erros, bugs, perguntas - página 2839

 

Nos gráficos (particularmente EURUSD) com prazos mensais e semanais, a mira move-se muito lentamente seguindo o cursor - basta mover o cursor suavemente na diagonal para jogar. Está bem noutros prazos. Não havia tal atraso antes


 
A100:
Erro de execução:

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

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

como em C++. Além disso, esperava-se que a sintaxe fosse consistente: um elenco é um elenco, não uma chamada de construtor

Tudo parece estar correcto. Provavelmente, o construtor da mudança é aí chamado, que em MQL é substituído por uma cópia.
E a conversão é como (A)a1.
 
Alexey Navoykov:
Tudo parece estar correcto, penso eu. O construtor da mudança é provavelmente chamado lá, que em MQL é substituído por uma cópia.
Uma conversão é como (A)a1

(A)a1 ou A(a1) não é um elenco, é uma declaração de um tipo como nos documentos. Embora agora haja algo de errado com os parênteses. É necessário um formato único para a língua.

 
Valeriy Yastremskiy:

(A)a1 ou A(a1)tipo conversão A a1 não é uma conversão, mas uma declaração de tipo como nos documentos. Embora agora haja algo de errado com os parênteses. É necessário um formato comum para a língua.

A diferença é que (A)a1 em pluses significa a conversão da cópia do objecto. E na MQL é a conversão de referência. Devido a isto, pode-se ter um problema de compatibilidade.
Há muito tempo atrás pedi-lhes que fizessem uma conversão como em pluses: (A&)a1, mas agora provavelmente não vão mudar nada.
 
Alexey Navoykov:
A diferença aqui é que em pluses (A)a1 significa trazer uma cópia de um objecto. E na MQL é a conversão de referência. Por isso, é possível encontrar problemas de compatibilidade.
Há muito que lhes peço que façam uma conversão sónica como nos profissionais: (A&)a1, mas provavelmente é pouco provável que mudem alguma coisa agora.

Não si não python) algo no meio. Oops, não sabia, calculou a conversão do tipo de objecto. Economia).

 
Alexey Navoykov:
Tudo parece estar correcto. É só que o construtor da mudança é provavelmente chamado lá, que em MQL é substituído por cópia.
E o fantasma é como (A)a1

Duvido que esteja certo, porque digamos que sim:

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

O resultado em MQL: 3

e em C++: 1.

Em qualquer caso, peça-lhes que verifiquem

 
A100:

Duvido que isto esteja correcto, porque digamos que sim:

O resultado em MQL: 3

e em C++: 1.

Em qualquer caso, peça-lhes que verifiquem

Portanto, esta é exactamente a situação que descrevi acima.
 
A100:

Duvido que isto esteja correcto, porque digamos que sim:

O resultado em MQL: 3

e em C++: 1.

Em qualquer caso, deixe-os verificar.

Eu não seria tão definitivo ao interpretar o código MQL em C++.
Código para C++ (em linha: 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:

Não seria tão inequívoco ao interpretar o código MQL em C++.
O código é para C++ (online: https://onlinegdb.com/Hy1FIj9Qv):

E como se propõe escrever a 3ª versão do g_cast em MQL ?

 
A100:

E como se propõe escrever a 3ª versão do g_cast em MQL?

Pode chamar explicitamente a função a partir da classe 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();
}