Fehler, Irrtümer, Fragen - Seite 2679

 
fxsaber:

2365 - der Code war mit Fehlern gespickt. Ich hatte noch keine Zeit, es herauszufinden. Ich habe auf 2361 zurückgesetzt - es war in Ordnung. In mq4 - gleiche Situation.

Danke für die Nachricht, ich werde das überprüfen.

 
Habe eine neue Version von MT5 heruntergeladen (Build 2365), leider ist etwas kaputt,
Es scheint an der Parameterübergabe beim Aufruf des Konstruktors der Basisklasse zu liegen.
 
Sergey Dzyublik:
Fehler MT5 (Build 2365) Kompilierungsfehler beim impliziten Konstruktoraufruf einer Klasse mit Zuweisungsoperator, wenn ein Zeiger, der als Referenz übergeben wird, als Konstruktorargument verwendet wird.
Wenn die Übergabe eines Zeigers durch eine Referenz durch eine Wertübergabe ersetzt wird, funktioniert alles.

Danke für den Beitrag, korrigiert

 

MT5-Fehler (Build 2365) Kompilierungsfehler beim Aufruf des Basisklassenkonstruktors, wenn der Template-Parameter der Template-Klasse als Basisklasse verwendet wird.
Keine Probleme in 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:
Wir können sehen, dass ArrayResize für Objekte jetzt schneller ist.
Wieder einmal wurde die Komplexität eines Teils der ArrayResize-Funktion von einem Logarithmus auf Null reduziert

Vielen Dank für die Beschleunigung von ArrayResize für reservierten Speicher.
MT5 (Build 2365) ist bei einem realen Projekt std::vector::push_back 1,5 mal schneller als der vorherige Build.
Und die Verzögerung von std::vector:resize hat sich von 2,2 auf 1,45 Mal verringert.

 

Build 2366, ich glaube, die Konstanten funktionieren jetzt nicht mehr richtig

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

wenn Sie const durch static ersetzen, wird es wie erwartet funktionieren - ein Aufruf von f1() und f2() während der Initialisierung von a und 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

 

Wenn man so einen Code schreibt, ist das ein totaler Fehler, der nicht abgefangen werden kann

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, ich glaube, die Konstanten funktionieren jetzt nicht mehr richtig

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

wenn Sie const durch static ersetzen, wird es wie erwartet funktionieren - ein Aufruf von f1() und f2() während der Initialisierung von a und 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

Genau so sollte es funktionieren.

 
Igor Makanu:

Wenn man so einen Code schreibt, ist das ein völlig unentdeckbarer Fehler.

Auch hier ist alles richtig.

 
Koldun Zloy:

Genau so sollte es funktionieren.

Letztes Jahr hat es nicht so funktioniert - ich habe speziell Const-Modifikatoren getestet

und es scheint, dass@Ilyas erklärt hat, wie man ein MQL-Programm ausführt, zuerst werden alle const und static initialisiert, egal wo sie beschrieben sind, und dann werden die Klassenkonstruktoren aufgerufen

ok, mit dieser Initialisierung statisch / const - es kann immer noch richtig verteilt werden, aber die Tatsache, dass die const Modifikator nicht garantieren, dass der Compiler wird dies überprüfen, ist sehr unerwartet - mein zweites Beispiel