Fehler, Irrtümer, Fragen - Seite 1953

 
Alexey Navoykov:

Im Allgemeinen muss ich leider zugeben, dass der MQL-Compiler nicht so intelligent ist, wie ich dachte). Ich würde sogar sagen, es ist überhaupt nicht intelligent. ) Ich habe versucht, einige einfache Beispiele zu erstellen, und es stellte sich heraus, dass selbst wenn ich ein Dummy-Objekt erstelle, das nirgendwo verwendet wird und nichts tut, der Compiler sich nicht darum kümmert. Es ist überhaupt nicht optimiert. Ich urteile allein nach der Geschwindigkeit. Und aus irgendeinem Grund funktioniert es in neuen Builds langsamer als in alten Builds.

Die Entwickler sind sich dessen bewusst. Eine solche Optimierung durch den Compiler ist jedoch weit von der Priorität der zu lösenden Aufgaben entfernt.

Es gibt auch solche Unklarheiten des Compilers.

 
fxsaber:

Die Entwickler sind sich dessen bewusst. Aber eine solche Optimierung durch den Compiler ist weit davon entfernt, eine Priorität der zu lösenden Aufgaben zu sein.

Ja, aber es ist einfach erstaunlich: Sie haben sich hier vorhin so sehr damit gebrüstet, dass sie die Qualität des Optimierers auf ein noch nie dagewesenes Niveau gehoben haben, aber in Wirklichkeit kann er nicht einmal mit solch einfachen Dingen umgehen. Ganz zu schweigen von den komplexeren Themen.

 
fxsaber:

Deshalb schlage ich vor, OnTesterInit die Möglichkeit hinzuzufügen, die Standard-Passtabelle zu ändern:

int PassesSet( const int Index, const MqlParam& Parameters[] );

Ich gehe davon aus, dass die Parametersätze selbst nicht im System gespeichert sind, sondern anhand der eindeutigen Nummer der Kombination (die jetzt mit der Passnummer übereinstimmt) berechnet werden. Daher ist es nur möglich, die Reihenfolge der Kombinationen zu ändern, nicht aber ihre Zusammensetzung. In diesem Fall wäre es also etwas wie SwapPasses(long index1, long index2).

Aber ich könnte mich irren.

 
Alexey Navoykov:

Ich gehe davon aus, dass die Parametersätze selbst nicht im System gespeichert sind, sondern anhand der eindeutigen Kombinationsnummer (die jetzt mit der Passnummer übereinstimmt) berechnet werden. Sie können also nur die Reihenfolge der Kombinationen ändern, nicht aber ihre Zusammensetzung. D.h. in diesem Fall wäre es etwas wie SwapPasses(long index1, long index2).

Dies könnte der Fall sein. Jetzt kann die Reihenfolge noch irgendwie durch Swap-Eingabezeilen in der EA-Quelle beeinflusst werden.

 
fxsaber:

Dies könnte der Fall sein. Nun kann die Reihenfolge durch Vertauschen von Eingabezeilen im EA-Quellcode irgendwie beeinflusst werden.

Das tötet den Optimierungsalgorithmus - es ist, als würde man nach dem Zufallsprinzip optimieren.

 
Stanislav Korotky:

Dies macht den Optimierungsalgorithmus zunichte - es ist, als würde man in eine zufällige Richtung optimieren.

Wir sprechen in erster Linie von einer vollständigen Überschreitung.

 

Ich lerne langsam OOP und bin auf eine nicht offensichtliche Sache gestoßen.

Es gibt eine Klasse A, deren Felder Objekte einer anderen Klasse B sind.

In der Klasse A wird eine konstante Methode aufgerufen, die ein Objekt der Klasse B zurückgibt.

Danach wird eine Methode der Klasse B aufgerufen, die die Parameter des zurückgegebenen Objekts löscht.

Es sieht wie folgt aus (das Beispiel ist vereinfacht, im Browser geschrieben):

class B
{
private:
   int m_width;
   int m_length;
public:
   void Reset() { m_width = 0; m_length = 0; }
}
class A
{
private:
   B m_member;
public:
   B GetBMember() const { return( m_member ); }
}
//---
A obj;
obj.GetBMember().Reset();

Das Ergebnis ist, dass Reset() nicht funktioniert, d.h. die Felder von m_member werden nicht gelöscht.

Frage: Sollte der Compiler nicht zur Erstellungszeit melden (Fehler/Warnung), dass eine nicht konstante Methode für ein konstantes Objekt aufgerufen wird (oder etwas Ähnliches)?

 
Alexey Kozitsyn:

Frage: Sollte der Compiler bei der Erstellung nicht melden (Fehler/Warnung), dass eine nicht konstante Methode für ein konstantes Objekt (oder etwas Ähnliches) aufgerufen wird?


Möglicherweise ist der Grund dafür ein impliziter Aufruf des Kopierkonstruktors, weilReset für ein temporäres Objekt aufgerufen wurde.

 
Sergey Dzyublik:

Möglicherweise ist der Grund dafür ein impliziter Aufruf des Kopierkonstruktors, weilReset für ein temporäres Objekt aufgerufen wurde.

Ich danke Ihnen. Wahrscheinlich hast du Recht, und der const-Spezifizierer hat keinen Einfluss auf das Ergebnis (sowohl mit als auch ohne ihn erfolgt kein Reset).
 
Alexey Kozitsyn:

Ich lerne langsam OOP und bin auf eine nicht offensichtliche Sache gestoßen.

Es gibt eine Klasse A, deren Felder Objekte einer anderen Klasse B sind.

In der Klasse A wird eine konstante Methode aufgerufen, die ein Objekt der Klasse B zurückgibt.

Danach wird eine Methode der Klasse B aufgerufen, die die Parameter des zurückgegebenen Objekts löscht.

Es sieht wie folgt aus (das Beispiel ist vereinfacht, im Browser geschrieben):

Das Ergebnis ist, dass Reset() nicht funktioniert, d.h. die Felder von m_member werden nicht gelöscht.

Frage: Sollte der Compiler nicht zur Erstellungszeit melden (Fehler/Warnung), dass eine nicht konstante Methode für ein konstantes Objekt aufgerufen wird (oder etwas Ähnliches)?

Rückgabe von Zeigern.
class B
{
private:
   int m_width;
   int m_length;
public:
   void Reset() { m_width = 0; m_length = 0; }
}
class A
{
private:
   B m_member;
public:
   B * GetBMember() const { return( & m_member ); }
}
//---
A obj;
obj.GetBMember().Reset();