Fehler, Irrtümer, Fragen - Seite 2890

 
Roman:

Wenn Sie einen Fehler bei diesem Wert abfangen müssen, initialisieren Sie ihn mit 333 ))
Es ist nur ein Startwert.

Das ist richtig, es ist ein Fehler. Entweder geben wir also in allen Fällen eine Warnung aus, wenn wir nicht initialisierte Variablen zuweisen, oder wir tun es nicht und initialisieren die Variablen in der Sprache in allen Fällen mit dem Standardwert Null, zum Beispiel.

 
Valeriy Yastremskiy:

Das ist richtig, es ist ein Fehler. Es stellt sich heraus, dass wir entweder in allen Fällen eine Warnung ausgeben, um nicht initiierte Variablen zuzuweisen, oder wir geben sie nicht aus, sondern initiieren sie z.B. mit Standard-Null innerhalb der Sprache in allen gleichen Fällen.

Nur wo in den oben genannten Beispielen haben Sie solche Fälle gesehen?

 
A100:

Nur wo in den oben genannten Beispielen haben Sie solche Fälle gesehen?

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Wanzen, Wanzen, Fragen

A100, 2020.10.27 16:11

Sie müssen ihn initialisieren, aber nur mit einem sinnvollen Wert. In dem obigen Beispiel gibt es keinen solchen Wert, also ist die Praxis nicht schlecht, sondern die einzig mögliche. Andernfalls würde es eine doppelte Initialisierung geben

int f( int i ) { /*вычисления*/ }
void g( int k )
{
        for ( int i = 0, j; i < k; i = j )
        {
                j = f( i );
                /*вычисления*/
        }
}

 
Roman:

Und wo bleibtdie Zuweisung von nicht initialisierten Variablen? Welche Variable ist nicht initialisiert? und wem wird sie zugewiesen? Was Sie hervorgehoben haben: j von = nach links j=, nicht nach rechts =j, d. h. es wird niemandem zugewiesen, bevor ihm selbst ein Wert zugewiesen wird

 
A100:

Nur wo in den oben genannten Beispielen haben Sie solche Fälle gesehen?

Ja, das ist mir entfallen, in allen Fällen hat die nicht initialisierte Variable eine Zuweisung, nicht umgekehrt. Vielleicht geht der Compiler zeilenweise von oben nach unten vor, in diesem Fall steht die Zuweisung unten und umgekehrt oben. Es gibt auch eine Warnung über eine mögliche Zuweisung an eine nicht initialisierte Variable.

 
A100:

Und wo bleibtdie Zuweisung von nicht initialisierten Variablen? Welche Variable ist nicht initialisiert, und wem wird sie zugewiesen? Was Sie hervorgehoben haben, ist j=, nicht =j

Zuweisung an eine nicht initialisierte Variable im Schleifenkörper. Vor der ersten Iteration ist j noch nicht initialisiert.
Es wird initialisiert, nachdem die erste Iteration durchlaufen wurde.
Der Schleifenkörper wird zuerst ausgeführt und dann der inkrementelle Bereich. die Sie durch i = j ersetzt haben

 
Roman:

Zuweisung an eine nicht initialisierte Variable im Funktionsrumpf. Vor der ersten Iteration ist j noch nicht initialisiert.
Es wird nach der ersten Iteration initialisiert.
Zuerst wird der Funktionsrumpf ausgeführt, dann der Inkrementbereich. die Sie durch i = j ersetzt haben

Nope, das ist richtig, nicht ableiten j auf der ersten Iteration initiiert wird nur j=f(i) und auf der zweiten wird es nur i=j Ich denke, der Compiler ist Parsing von oben nach unten und geben Warnungen.

 
Valeriy Yastremskiy:

Nein, das ist richtig, die Variable j wird bei der ersten Iteration nicht initialisiert, nur j=f(i) und bei der zweiten Iteration nur i=j. Ich glaube, der Compiler analysiert von oben nach unten und gibt Warnungen aus.

Ja, aber vor der ersten Iteration ist die j-Variable noch nicht initialisiert, das ist es, was der Compiler beschwört.

 
Valeriy Yastremskiy:

Ja, ich habe mich geirrt, in allen Fällen von nicht initialisierten Variablen gibt es eine Zuweisung, nicht andersherum. Vielleicht geht der Compiler von oben nach unten vor, so dass die Zuweisung unten steht und umgekehrt oben. Es gibt auch eine Warnung über eine mögliche Zuweisung an eine nicht initialisierte Variable.

Dies kann der Fall sein, wenn der Compiler keine objektiven Informationen hat:

void f( int& i ) { /*вычисления*/ }
void OnStart()
{
        int i;
        f( i );
        int j = i; //нормально ??? а если i не инициализирована?
        printf("%d",j);
}

d.h. vielleicht hat f() i initialisiert und vielleicht nicht. Und hier gibt der C++-Compiler eine Warnung aus, während der MQL-Compiler dies irgendwie nicht tut.

 
A100:

Dies kann der Fall sein, wenn der Compiler objektiv keine Informationen hat:

d.h. vielleicht hatte f() eine Initialisierung, vielleicht auch nicht. Und hier gibt der C++-Compiler eine Warnung aus, MQL nicht.

Ich kann nicht wissen, was sie sagen. Ich denke, einen einfacheren Compiler. Analysiert die Layout-Syntax von oben nach unten auf offensichtliche Syntaxfehler, Nichtbeachtung von Typen und Verwendung falscher Variablen. Als im zweiten Beispiel die Initialisierung abgelegt wurde, kam es zu keiner Warnung. Obwohl die Ausführung des Programms identisch ist.