Fehler, Irrtümer, Fragen - Seite 2046

 
Alexey Viktorov:

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.

 
A100:

Im 32-Bit-Terminal tritt ein Fehler bei jeder OPTIMIZE

Wirklich. Überprüft in MT4, gibt es in der Tat Fehler in irgendeiner Weise. Und wie die Leute dort etwas auf neue Builds codieren
 
Alexey Navoykov:

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:

int a= 1;
int b= a+1;  // Согласно документации, такая инициализация не возможна

void OnStart()
{
  Print(b);
}

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.

 
Alexey Viktorov:

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.

 
Alexey Navoykov:

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.

 
Alexey Viktorov:

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.

 
Nach dem Senden von Nachrichten über den vollständigen Chat wird die gesendete Nachricht nicht automatisch zum Chatverlauf der aktuellen Seite hinzugefügt.
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.
 
Alexey Navoykov:

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.

class A
{
 public:
  static int f()
  { 
    static int a=1;
    Print(a);       // Получаем a=0 !!
    return a;  
  }   
};


int a= A::f();


void OnStart()
  {
   
  }

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.

static int a=1;

Und worüber sollen wir reden, wenn man die Warnungen des Compilers nicht beachtet...


 
Alexey Navoykov:

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

Vielen Dank für diese Nachricht.
Es handelt sich in der Tat um einen Optimierungsfehler des Compilers.
Der Fix wird in der nächsten Build enthalten sein.
 
Alexey Viktorov:

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.