Fehler, Irrtümer, Fragen - Seite 2046
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
Diese Initialisierung ist möglich. Denn die Variable "a" wird mit einer Konstante initialisiert, und die Variable "b" wird mit einem konstanten Ausdruck initialisiert.
Hier wird 'b' NICHT durch einen konstanten Ausdruck initialisiert. Deshalb widerspricht es den in der Dokumentation beschriebenen Regeln.
Das ganze Problem besteht darin, dass bei derInitialisierung einerstatischen Variablen durch eine Funktion die Initialisierung "angehalten" und die Funktion ausgeführt wird. Im obigen Beispiel gibt es eine statische Variable in dieser Funktion, die noch nicht initialisiert wurde. Eine Variable, die durch eine Funktion initialisiert wird, nimmt also einen anderen Wert an.
Aber wie kann die Initialisierung unterbrochen werden? Alle Operationen werden in einer strengen, durch die Sprachsyntax festgelegten Reihenfolge ausgeführt. Zunächst wird die Funktion ausgeführt, und dann wird der von dieser Funktion zurückgegebene Wert an den Konstruktor unserer Variablen übergeben - dies wird als Initialisierung bezeichnet. Aber die Initialisierungsoperation wird in diesem Fall vom Compiler eklatant ignoriert, und der Code wird einfach weiter kompiliert, als ob nichts geschehen wäre. Das ist inakzeptabel. Es ist dasselbe, als wenn Sie zum Beispiel folgendes Array deklarieren würden int a[]= { f(), g(), h() }; und es würde kompilieren, aber natürlich ohne irgendetwas zu initialisieren.
Im 32-Bit-Terminal tritt ein Fehler bei jeder OPTIMIZE
b' wird hier durch NICHT einen konstanten Ausdruck initialisiert. Es verstößt also gegen die in der Dokumentation beschriebenen Regeln.
Wie kann die Initialisierung unterbrochen werden? Alle Operationen werden in einer strengen, durch die Sprachsyntax festgelegten Reihenfolge ausgeführt. Zuerst wird die Funktion ausgeführt, und dann wird der von dieser Funktion zurückgegebene Wert an den Konstruktor unserer Variablen übergeben - dies wird Initialisierung genannt. Aber die Initialisierungsoperation wird in diesem Fall vom Compiler eklatant ignoriert, und der Code wird einfach weiter kompiliert, als ob nichts geschehen wäre. Das ist inakzeptabel. Es ist dasselbe, als wenn Sie zum Beispiel folgendes Array deklarieren würdenint a[]= { f(), g(), h() }; und es würde kompilieren, aber natürlich ohne irgendetwas zu initialisieren.
Wenn nicht durch einen konstanten Ausdruck, dann durch WAS???
Alexey, es ist einfacher, wenn Sie den Code selbst nehmen und die Initialisierungssequenz im Debugger durchsehen. Außerdem ist mir nicht sofort aufgefallen, dass der Code der
Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests
Wanzen, Wanzen, Fragen
Alexey Navoykov, 2017.10.17 20:31
Und hier noch mehr zum Thema der Variableninitialisierung. Wenn Sie das befolgen, was in der Dokumentation erwähnt wurde, dann können Sie nicht auch auf andere globale/statische Variablen verweisen. Da es sich nicht um einen konstanten Ausdruck handelt:
Im Moment funktioniert es jedoch. Und ich vermute, dass viele Menschen schon immer solche Konstrukte verwendet haben, ohne sich dessen bewusst zu sein. Aber es stellt sich heraus, dass die Entwickler sie jederzeit deaktivieren können. Und wie bei der Funktionsinitialisierung werden diese Codes zwar immer noch erfolgreich kompiliert, aber sie funktionieren nicht korrekt. Der gesamte MQL-Code ist also eine Zeitbombe.
Es handelt sich um die Variablen auf globaler Ebene, nicht um die statischen Variablen innerhalb einer Funktion.
Ich habe nicht genug Wissen, um es zu erklären, und Sie sind nicht aufmerksam genug. "ausgesetzt" in Anführungsstrichen!!!
Verwechseln Sie nicht die Initialisierung von statischen und gewöhnlichen Variablen, erst recht nicht die von lokalen Variablen.
Wenn nicht durch einen konstanten Ausdruck, durch was dann?
Ein nicht-konstanter Ausdruck.
Außerdem habe ich nicht sofort bemerkt, dass Der wichtigste Punkt ist, dass dieses Beispiel von Variablen auf globaler Ebene spricht und nicht von statischen Variablen, die sich innerhalb einer Funktion befinden.
Ich habe nicht genug Wissen, um es klar zu erklären, und du hast nicht die Aufmerksamkeitsspanne...
Verwechseln Sie da nicht etwas?
Außerdem verhalten sich globale und statische Variablen absolut identisch. Hier ist die Dokumentation:
Eine globale Variable kann nur durch eine Konstante oder einen konstanten Ausdruck, der ihrem Typ entspricht, initialisiert werden.
Ich muss gestehen, dass es für mich genauso eine Offenbarung war wie für die statischen Variablen. Ich weiß nicht, wann das alles in der Dokumentation auftauchte, vielleicht war es schon früher, aber niemand hat darauf geachtet, weil alles wie in C++ funktionierte, so dass keine Fragen aufkamen.
Ein nicht-konstanter Ausdruck.
Bringst du da nicht etwas durcheinander?
Außerdem verhalten sich globale und statische Variablen genau gleich. Hier ein Auszug aus der Dokumentation:
Ich muss gestehen, dass dies für mich eine ebenso große Offenbarung war wie bei den statischen Variablen. Ich weiß nicht, wann das alles in der Dokumentation auftauchte, vielleicht war es schon früher, aber niemand hat darauf geachtet, da alles in C++ funktionierte und daher keine Fragen aufkamen.
Ich glaube, Sie liegen völlig falsch. Wie kann man von der Identität von Variablen sprechen, wenn einige von allen im Programm definierten Funktionen verfügbar sind und andere nur in der Funktion, in der sie deklariert sind.
Der Unterschied zwischen statischen und lokalen Variablen besteht darin, dass statische Variablen unmittelbar nach den globalen und gewöhnliche lokale (nicht statische) Variablen bei der Ausführung des Programms initialisiert werden, wenn der Code zu ihnen gelangt.
Ich habe den Eindruck, dass Sie sich völlig irren. Wie kann man von identischen Variablen sprechen, wenn einige von allen im Programm definierten Funktionen aus zugänglich sind und andere nur in der Funktion, in der sie deklariert sind.
Sie sprachen über den spezifischen Kontext der Diskussion(Variableninitialisierung), nicht im Allgemeinen.
Die gesendete Nachricht erscheint erst nach dem Neuladen der Seite.
Nur ein kurzer Blick, die Antwort vom Server beim Senden der Nachricht ist ausreichend, vielleicht ist etwas in den Event-Handlern im js-Code schief gegangen.
Es ging um den spezifischen Kontext der Diskussion(Variableninitialisierung), nicht um den allgemeinen Kontext.
Soweit ich mich erinnere, ging es um die Initialisierung einer STATIC-Variable
Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests
Wanzen, Wanzen, Fragen
Alexey Navoykov, 2017.10.17 17:16
Fehler bei der Initialisierung von statischen Variablen. In alten Builds war sie nicht vorhanden.
Wer nichts dagegen hat, schickt es an den Service-Desk. Ich habe keine Lust mehr, dort mit ihnen zu kommunizieren.
Oder ist das nicht Ihre Botschaft?
Kümmern Sie sich bereits um die Reihenfolge der Variableninitialisierung. In diesem Beispiel wird zuerst eine globale Variable initialisiert
int a= A::f();
die eine Funktion aufruft, die eine gleichnamige Variable noch nicht initialisiert hat.
Und worüber sollen wir reden, wenn man die Warnungen des Compilers nicht beachtet...
Aber ich habe dort die falsche Array-Dimension eingestellt, vielleicht hat sich das irgendwie ausgewirkt (obwohl es sich gar nicht auswirken sollte).
Versuchen Sie dies mit Dimension = 3
Es handelt sich in der Tat um einen Optimierungsfehler des Compilers.
Der Fix wird in der nächsten Build enthalten sein.
Soweit ich mich erinnere, ging es um die Initialisierung einer STATISCHEN Variablen
Oder ist das nicht Ihre Botschaft?
Ich verstehe nicht, was Sie wollen. Ich sagte, es gehe um die "Initialisierung von Variablen". Und in diesem Zusammenhang verhalten sich statische und globale Variablen identisch. Ich habe Ihnen sogar einen Link zur Dokumentation gegeben:Variableninitialisierung
Beachten Sie, dass statische und globale Variablen dort überall miteinander verbunden sind.
Und wir kritisieren die Initialisierungssequenz nicht, weil sie nichts mit dem vorliegenden Problem zu tun hat. Ich möchte Sie daran erinnern, dass das Problem darin besteht, dass der Compiler an den Stellen, an denen er es sollte, KEINEN Fehler erzeugt. Wenn eine statische Variable noch nicht initialisiert ist, können Sie nicht auf sie zugreifen.
Und worüber können wir reden, wenn Sie die Warnungen des Compilers ignorieren...
Ändern Sie den Namen der globalen Variablen, wenn es Sie so sehr stört. Dies wird das Ergebnis in keiner Weise beeinflussen.