Fehler, Irrtümer, Fragen - Seite 1183
Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Beim Testen des Expert Advisors wird ein Fehler erzeugt
Ungültige Gewinnmitnahme bei der Funktion OrderSend
OrderSend-Fehler 4107
Wie kann ich das Problem beheben, ohne in den Code zu gehen?
Die Funktion ZeroMemory kann für dieses Objekt nicht verwendet werden.
Verstehe. Aber warum zeigt der Compiler diesen Fehler nicht an einer Stelle an, an derZeroMemory verwendet wird, sondern an einer Stelle, an der die Klasse definiert ist? Das ist verwirrend. Ich habe mir schon das Hirn zermartert, um herauszufinden, was der Fehler ist und wo er sich befindet. Bitte stellen Sie sicher, dass der Fehler an der richtigen Stelle angezeigt wird. Wenn Sie zum Beispiel ein Objekt kopieren, das Elemente enthält, die nicht kopiert werden dürfen, tritt der Fehler genau in der Zeile mit dem Kopieren auf und nicht irgendwo innerhalb der Klasse.
Was die praktische Seite betrifft, so bin ich bereits auf ein Problem gestoßen. Der Code verwendete statische Objekte. Dann habe ich beschlossen, einige von ihnen durch dynamische zu ersetzen. Dies hatte zur Folge, dass die Vergleichs- und Zuweisungsoperationen nun ganz anders funktionierten. Und dieses Problem war schwer zu erkennen, weil das Programm weiterhin kompiliert und normal funktioniert, aber nicht so, wie es sollte.
Ich habe das Problem nicht sofort verstanden
Daraus können Sie ersehen, dass (a != a) zu einem Vergleich von Zeigern führt, während (a >> a) zum Aufruf des Operators >>( A* ) führtDas ist ein Widerspruch.
Sie können das Verhalten von (a >> a) nicht wie andere überladene Operatoren (mit Ausnahme von == und !=) ändern, da dies das folgende Konstrukt unmöglich machen würde, da Sie nicht (A), sondern nur (A*) zurückgeben können.
Es wird auch nicht möglich sein, überladene Operatoren in vollem Umfang zu verwenden, da es keine Zeiger-zu-Objekt-Umwandlungsoperation gibt (*a)
Das Einzige, was noch zu tun ist, ist, das (== und !=) Verhalten zu ändern
Um Zeiger (== und !=) miteinander und mit der Zahl Null zu vergleichen (weil andere Zeigeroperationen sinnlos sind), sollte man eine spezielle Funktion wie (GetPointer) einführen oder dem Compiler explizit eine Typumwandlung vorgeben
Damit bleibt die Möglichkeit der uneingeschränkten Verwendung von überladenen Operatoren erhalten und der oben erwähnte Widerspruch wird beseitigt
Die einzige vernünftige Ausnahme von der allgemeinen Regel sollte operator=() bleiben, weil
würde alle Widersprüche auf einen Schlag beseitigen.
Korrektur: tatsächlich werden Widersprüche nur teilweise beseitigt, weil diese Notation (*a) das Problem der Mehrfachverwendung von Operatoren nicht löst (was jetzt erfolgreich mit allen Operatoren außer == und != funktioniert) - der beste Weg, Zeiger auf Gleichheit/Ungleichheit miteinander zu vergleichen, ist also immer noch die Verwendung einer speziellen Funktion - oder die explizite Umwandlung in den Typ ulong
das ist gut, und das
KompilierungsfehlerFortsetzung des Themas über Zeiger, wäre es schön, MQL-Standard-Operator der Einnahme eines Zeigers'&' hinzufügen, wäre es viel bequemer und kompakter als umständlich GetPointer.Da wir die Operatoren * und & in unserem Arsenal haben, können wir die notwendigen Operationen explizit definieren:
Und es gibt noch mehr über dieses kaufmännische Und. In MQL fehlt ein Verweis auf Variablen, insbesondere wenn man die begrenzte Verwendung von Zeigern (nur auf Klassenobjekte) berücksichtigt. Die Funktion erfordert oft den Zugriff auf ein tief verschachteltes Strukturelement oder ein mehrdimensionales Array. Ich muss jedes Mal den vollständigen Pfad dazu schreiben, was den Code sehr umständlich macht.Man kann die Dinge vereinfachen, indem man eine Referenz erstellt, und manchmal muss man den Namen einer Variablen der Einfachheit halber lokal "ändern". Aber was erkläre ich hier? Jeder weiß bereits, wie praktisch es ist, Referenzen zu verwenden, aber jetzt muss man stattdessen #define verwenden, was sicherlich nicht gut ist.
Und wir brauchen auch die Möglichkeit, das Ergebnis einer Funktion per Referenz zu übergeben, d.h. double& Func() { }
Facebook hat vor kurzem das Backlinking von Beiträgen aus Blogs eingeführt:
Um beim Thema Zeiger zu bleiben, wäre es gut, MQL einen Standard-Operator hinzuzufügen, mit dem man einen Zeiger'&' nehmen kann. Das wäre viel bequemer und kompakter als das umständliche GetPointer.Damit entfällt auch das oben beschriebene Casting mit ulong, so dass wir mit den Operatoren * und & die notwendigen Operationen eindeutig definieren können:
Die ausschließliche Verwendung von (*a) für den Verweis auf Mitgliedsfunktionen bringt keine eindeutigen Vorteile, sondern macht es unmöglich, die Operatoren auf einfache und klare Weise zu verwenden.
Versuchen Sie, ihn unter Berücksichtigung Ihres Vorschlags neu zu schreiben
Sie können nicht das Objekt selbst anstelle des Zeigers verwenden, da der Operator <<(...) nur einen Zeiger auf das Objekt zurückgeben kann.
Welche Operationen mit Zeigern sind sinnlos? - Nur Vergleiche untereinander und mit einer Zahl - daher sollten wir sie vernachlässigen und in eine spezielle Funktion (z.B. bool ComparePointer( a,b)) packen, um die Möglichkeit der Mehrfachverwendung von Operatoren zu erhalten, ohne die die Operatorüberladung selbst ihre entscheidende Bedeutung verliert.