Fehler, Irrtümer, Fragen - Seite 1182

 
Zeleniy:

Die Optimierung funktioniert nicht.

2014.08.05 19:34:42 Tester keine optimierten Parameter ausgewählt, bitte überprüfen Sie die zu optimierenden Eingänge und stellen Sie sorgfältig Start-, Schritt- und Stoppwerte ein

Die Übersetzung hat nichts ergeben.

Was meinen Sie mit "nichts"? In der Übersetzung hätte stehen müssen, dass Sie mindestens einen Parameter für die Optimierung auswählen und sicherstellen müssen, dass die Start-, End- und Schrittwerte korrekt sind.
 
marketeer:
Was meinen Sie mit "nichts"? Die Übersetzung hätte mir etwas sagen sollen, z. B. dass ich mindestens einen Parameter für die Optimierung auswählen und sicherstellen soll, dass der Beginn, das Ende und der Schritt des Tests korrekt sind.
Es ist so seltsam, ich verstehe nichts, vielleicht bin ich nur müde, ich kämpfe auch am zweiten Tag noch mit Fehlern. Ich danke Ihnen, ich werde mich auf Ihre Worte verlassen.
 

Ich stand vor folgendem Problem: Ich muss zwei Objekte der gleichen Klasse miteinander vergleichen und beschloss, der Einfachheit halber den Operator == zu überladen. Es stellte sich heraus, dass, wenn die Objekte dynamisch sind, mein Operator nicht ausgeführt wird und statt der Objekte selbst ihre Zeiger verglichen werden. Nun, im Prinzip macht es Sinn, die Operation des Springens auf das Objekt durch seinen Zeiger ist erforderlich: *a == *b. Aber in MQL war diese Möglichkeit vergessen worden. Wir müssen hinzufügen.

class T {   int x;

public:

T (int value) { x=value; }   bool operator==(T& other) { Print("compare1");  return x==other.x; }   bool operator==(T* other) { Print("compare2");  return x==other.x; } }; //------------------ void OnStart() {   T* a= new T(10);   T* b= new T(10);      Alert(a==b);      delete a;   delete b; }

 

Obwohl ich gerade gedacht habe, dass die Tatsache, dass wir Zeiger statt Objekte vergleichen, in Anbetracht der Besonderheiten der Sprache grundsätzlich falsch ist. Schließlich ist MQL eine verwaltete Sprache, und der Begriff "Objekt" wird hier unabhängig davon verwendet, wie das Objekt gespeichert wird und wie darauf zugegriffen wird. Auf Mitglieder und Methoden wird in jedem Fall mit einem Punkt zugegriffen. Dementsprechend sollte der Vergleichsoperator sowohl für statisch ausgewählte Objekte als auch für dynamische Objekte auf die gleiche Weise funktionieren. Und wenn Sie Zeiger vergleichen müssen, sollten Sie diesmit GetPointer() tun.

 
meat:

Obwohl ich gerade dachte, die Tatsache, dass es einen Vergleich von Zeigern statt der Objekte selbst gibt, ist angesichts der Besonderheiten der Sprache grundsätzlich falsch.

Es gibt keinen Grund, in MQL Vergleichsregeln zu erfinden, die C++ widersprechen, solange man dies mit anderen Mitteln tun kann. Wenn Sie Zeiger haben und Objekte vergleichen müssen, verwenden Sie eine Vergleichsfunktion.
bool Compare(const T& t1, const T& t2 ) { return ( t1 == t2 ); }

Alert( Compare( a, b ));
Es ist eine Sache, einen Satz der Form (*a == *b) zuzulassen, und eine ganz andere Sache, dem Satz eine andere Bedeutung zu geben (a == b)
 

Beim Testen des Expert Advisors wird ein Fehler erzeugt

Ungültige Gewinnmitnahme für die Funktion OrderSend

OrderSend-Fehler 4107

Wie kann ich das Problem beheben, ohne in den Code zu gehen?

 
A100:
Es besteht keine Notwendigkeit, in MQL Vergleichsregeln zu erfinden, die im Widerspruch zu C++ stehen, solange andere Mittel verwendet werden können. Wenn Sie Zeiger haben und Objekte vergleichen müssen, verwenden Sie eine Vergleichsfunktion Es ist eine Sache, einen Eintrag der Art (*a == *b) zuzulassen, und eine ganz andere, dem Eintrag (a == b) eine andere Bedeutung zu geben

Nun, ich erkläre, dass die MQL-Regeln im Widerspruch zu C++ stehen, denn hier wird der Verweis auf ein Objekt durch einen Zeiger mit einem Punkt gemacht, während er mit -> gemacht werden sollte, wenn wir den C++-Regeln folgen.

D.h. "Zeiger" und "Objekt" sind in C++ zwei völlig unterschiedliche Begriffe, deshalb ist auch die Syntax anders. Alles ist streng. Aber hier ist alles durcheinander. Es sieht so aus, als ob wir Eigenschaften und Methoden eines Zeigers ansprechen. Ich sage nicht, dass es schlecht ist, es ist bequemer für OOP, es wird z.B. in C# gemacht. Aber dann muss alles andere auf die gleiche Art und Weise implementiert werden. Es muss ein einziges Konzept geben. Sonst entstehen Widersprüche und Verwirrung: in einigen Fällen verwenden wir einen Zeiger auf die gleiche Art und Weise wie das Objekt selbst, und in anderen Fällen erwacht der Zeiger plötzlich zum Leben.

Was die praktische Seite betrifft, so bin ich bereits mit einem Problem konfrontiert worden: Mein Code verwendete statische Objekte. Dann beschloss ich, einige von ihnen durch dynamische zu ersetzen. Infolgedessen begannen Vergleichs- und Zuweisungsoperationen ganz anders zu funktionieren. Und dieses Problem war schwer zu erkennen, weil das Programm weiterhin kompiliert und normal funktioniert, aber nicht so, wie es sollte.

 

Ich habe eine Klasse in meinem Code, die ein Objekt enthält:

CClass
{
  ...
  CObj  Object; 
  ...
};

Die Klasse CObj wird vor ihr deklariert.

Beim Versuch zu kompilieren erhalte ich folgende Fehlermeldung: 'Object' - cannot be unset

Was bedeutet dieser Fehler und was ist seine Ursache? Ich kann mich nicht erinnern, diesen Fehler schon einmal gesehen zu haben. Die Klasse CObj hat einen Konstruktor und einen Destruktor.

Ich habe versucht, Object einfach als Variable zu deklarieren - alles ist in Ordnung. Aber das geht nicht, wenn es Teil einer Klasse ist.

 
Kann jemand erklären, was dieser Fehler ("- cannot be unset") ist und wann er auftritt?
 
meat:
Kann jemand erklären, was dieser Fehler ("- cannot be unset") ist und wann er auftritt?
Die Funktion ZeroMemory kann für dieses Objekt nicht verwendet werden.
Grund der Beschwerde: