Errori, bug, domande - pagina 2839

 

Sui grafici (in particolare EURUSD) con timeframes mensili e settimanali il mirino si muove molto lentamente seguendo il cursore - basta muovere il cursore dolcemente in diagonale per giocare. Va bene in altri tempi. Non c'è stato un tale ritardo prima


 
A100:
Errore di esecuzione:

Risultato: 1-2-2-0-0-0

Risultato atteso: 1-2-0-0

come in C++. Inoltre, la sintassi doveva essere uniforme: un cast è un cast, non una chiamata al costruttore

Tutto sembra essere corretto. È solo che probabilmente lì viene chiamato il costruttore move, che in MQL è sostituito da copy.
E la conversione è come (A)a1.
 
Alexey Navoykov:
Tutto sembra essere corretto, credo. Probabilmente lì viene chiamato il costruttore move, che in MQL è sostituito da copy.
Una conversione è come (A)a1

(A)a1 o A(a1) non è un cast, è una dichiarazione di un tipo come nei documenti. Anche se ora c'è qualcosa di sbagliato nelle parentesi. Un unico formato è necessario per la lingua.

 
Valeriy Yastremskiy:

(A)a1 o A(a1)conversione di tipo A a1 non è una conversione, ma una dichiarazione di tipo come nei documenti. Anche se ora c'è qualcosa di sbagliato nelle parentesi. È necessario un formato comune per la lingua.

La differenza è che (A)a1 in più significa la conversione della copia dell'oggetto. E in MQL è la conversione di riferimento. A causa di questo, si può avere un problema di compatibilità.
Tempo fa ho chiesto loro di fare una conversione come in plus: (A&)a1, ma ora probabilmente non cambieranno nulla.
 
Alexey Navoykov:
La differenza qui è che in plus (A)a1 significa portare una copia di un oggetto. E in MQL è la conversione di riferimento. A causa di questo, si possono incontrare problemi di compatibilità.
Ho chiesto loro da tempo di fare una conversione sonora come nei plus: (A&)a1, ma probabilmente non cambieranno nulla ora.

Non si sithon) qualcosa nel mezzo. Ops, non lo sapevo, ho pensato alla conversione del tipo di oggetto. Economia).

 
Alexey Navoykov:
Tutto sembra essere corretto. È solo che probabilmente lì viene chiamato il costruttore del movimento, che in MQL è sostituito dalla copia.
E il fantasma è come (A)a1

Dubito che sia giusto, perché diciamo:

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

Il risultato in MQL: 3

e in C++: 1.

In ogni caso, fate controllare

 
A100:

Dubito che questo sia corretto, perché diciamo:

Il risultato in MQL: 3

e in C++: 1.

In ogni caso, fate controllare

Quindi questa è esattamente la situazione che ho descritto sopra.
 
A100:

Dubito che questo sia corretto, perché diciamo:

Il risultato in MQL: 3

e in C++: 1.

In ogni caso, lasciate che controllino.

Non sarei così sicuro nell'interpretare il codice MQL in C++.
Codice per C++ (online: 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:

Non sarei così univoco nell'interpretare il codice MQL in C++.
Il codice è per C++ (online: https://onlinegdb.com/Hy1FIj9Qv):

E come proponi di scrivere la terza versione di g_cast in MQL?

 
A100:

E come proponi di scrivere la terza versione di g_cast in MQL?

Potete chiamare esplicitamente la funzione dalla 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();
}