Fehler, Irrtümer, Fragen - Seite 2839

 

Auf Charts (insbesondere EURUSD) mit monatlichem und wöchentlichem Zeitrahmen bewegt sich das Fadenkreuz sehr langsam und folgt dem Cursor - bewegen Sie den Cursor zum Abspielen einfach gleichmäßig diagonal. In anderen Zeiträumen ist es in Ordnung. Eine solche Verzögerung gab es vorher nicht


 
A100:
Ausführungsfehler:

Ergebnis: 1-2-2-0-0-0

Erwartetes Ergebnis: 1-2-0-0

wie in C++. Außerdem sollte die Syntax einheitlich sein: ein Cast ist ein Cast, kein Konstruktoraufruf

Alles scheint korrekt zu sein. Wahrscheinlich wird dort der Move-Konstruktor aufgerufen, der in MQL durch Kopieren ersetzt wird.
Und die Umrechnung ist wie (A)a1.
 
Alexey Navoykov:
Alles scheint korrekt zu sein, denke ich. Wahrscheinlich wird dort der move-Konstruktor aufgerufen, der in MQL durch copy ersetzt wird.
Eine Umwandlung ist wie (A)a1

(A)a1 oder A(a1) ist kein Cast, sondern eine Deklaration eines Typs wie in der Dokumentation. Allerdings ist jetzt etwas mit den Klammern nicht in Ordnung. Für die Sprache wird ein einheitliches Format benötigt.

 
Valeriy Yastremskiy:

(A)a1 oder A(a1)Typkonvertierung A a1 ist keine Konvertierung, sondern eine Typdeklaration wie in der Dokumentation. Allerdings ist jetzt etwas mit den Klammern nicht in Ordnung. Es wird ein gemeinsames Format für die Sprache benötigt.

Der Unterschied besteht darin, dass (A)a1 in Pluszeichen die Umwandlung der Objektkopie bedeutet. Und in MQL ist es die Referenzkonvertierung, wodurch ein Kompatibilitätsproblem entstehen kann.
Vor langer Zeit habe ich sie gebeten, eine Umwandlung wie bei Pluszeichen vorzunehmen: (A&)a1, aber jetzt werden sie wahrscheinlich nichts mehr ändern.
 
Alexey Navoykov:
Der Unterschied besteht darin, dass (A)a1 bei Pluszeichen das Einbringen einer Kopie eines Objekts bedeutet. Und bei MQL ist es die Referenzkonvertierung, weshalb es zu Kompatibilitätsproblemen kommen kann.
Ich habe sie schon lange gebeten, eine Klangumwandlung wie in den Pluszeichen vorzunehmen: (A&)a1, aber wahrscheinlich werden sie jetzt nichts mehr ändern.

Nicht si nicht python) etwas dazwischen. Ups, das wusste ich nicht, ich dachte an die Umwandlung des Objekttyps. Wirtschaft).

 
Alexey Navoykov:
Alles scheint korrekt zu sein. Wahrscheinlich wird dort der Move-Konstruktor aufgerufen, der in MQL durch Kopieren ersetzt wird.
Und der Geist ist wie (A)a1

Ich bezweifle, dass das richtig ist, denn, sagen wir mal:

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

Das Ergebnis in MQL: 3

und in C++: 1.

Lassen Sie auf jeden Fall Folgendes überprüfen

 
A100:

Ich bezweifle, dass dies richtig ist, denn nehmen wir an:

Das Ergebnis in MQL: 3

und in C++: 1.

Lassen Sie auf jeden Fall Folgendes überprüfen

Dies ist also genau die Situation, die ich oben beschrieben habe.
 
A100:

Ich bezweifle, dass dies richtig ist, denn nehmen wir an:

Das Ergebnis in MQL: 3

und in C++: 1.

Auf jeden Fall sollen sie es überprüfen.

Bei der Interpretation von MQL-Code in C++ wäre ich mir nicht so sicher.
Code für 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:

Ich würde nicht so eindeutig sein, wenn ich MQL-Code in C++ interpretiere.
Der Code ist für C++ (online: https://onlinegdb.com/Hy1FIj9Qv):

Und wie schlagen Sie vor, die 3. Version von g_cast in MQL zu schreiben?

 
A100:

Und wie schlagen Sie vor, die 3. Version von g_cast in MQL zu schreiben?

Sie können die Funktion explizit über die Basisklasse aufrufen:

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