Fehler, Irrtümer, Fragen - Seite 167

 

Frage zu dynamischen Arrays

double open_main_array[] - Klassenvariable

Initialisierung

ArraySetAsSeries(open_main_array,true);

Der 1. Aufruf der Funktion, die den folgenden Code enthält

CopyOpen(Symbol(), PERIOD_M15, 0, Count, open_main_array);

2. Aufruf der Funktion

CopyOpen(Symbol(), PERIOD_M15, 0, Count, open_main_array);

Enthält das open_main_array-Array Daten, die während des zweiten Aufrufs kopiert wurden, oder wird das Array inkrementiert und enthält Daten aus dem ersten und zweiten Aufruf?

Alternativ können Sie auch verwenden:

ArrayFree(open_main_array)

CopyOpen(Symbol(), PERIOD_M15, 0, Count, open_main_array);

Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
Renat:

nicht initialisierte Variable - bedeutet, dass die Variable garantiert einen Pass-Through-Zweig hat, wenn sie nicht initialisiert ist. z. B. wird Standard in switch explizit weggelassen, wobei MainPrice explizit initialisiert werden sollte (oder explizit auf Null gesetzt werden sollte, wenn es deklariert wird).

Über den "garantierten Pass". Hier ist ein solches Stück Code:

            (1)         double local_low;
            (2)         uint index_interior=i-k;
            (3)         bool interrupcion=false;
            (4)         for(uint n=1;n<Ac-k;n++)
            (5)           {
            (6)            if(low[index_interior-n]<low[index_interior-n-1])
            (7)              {
            (8)               local_low=low[index_interior-n];
            (9)               interrupcion=true;
            (10)              break;
            (11)              }
            (12)          }  
            (13)        if(interrupcion)
            (14)          {
            (15)           if(EspacioFalladoPlus0<high[index_interior]-local_low)
                       ...

In der letzten Zeile (Zeile 15) heißt es "possible use of uninitialized variable 'local_low'".

Da aber die bool-Variable interrupcion in Zeile 9 direkt nach der Initialisierung der Variable local_low in Zeile 8 verwendet wird, stellt sich heraus, dass die Variable local_low in Zeile 15 garantiert initialisiert wird. An dieser Stelle bedeutet die Warnung "possible use of uninitialized variable 'local_low'" also nicht "garantiert", sondern nur das mögliche Vorhandensein eines Pass-Through-Zweigs, in dem die Variable nicht initialisiert ist.

 
Yedelkin:

Über den "garantierten Durchgang". Hier ist ein Stück Code:

In der letzten Zeile (Zeile 15) heißt es "possible use of uninitialized variable 'local_low'".

Da aber die bool-Variable interrupcion in Zeile 9 direkt nach der Initialisierung der Variable local_low in Zeile 8 verwendet wird, stellt sich heraus, dass die Variable local_low in Zeile 15 garantiert initialisiert wird. Die Warnung "possible use of uninitialized variable 'local_low'" bedeutet also im Moment nicht "garantiert", sondern nur das mögliche Vorhandensein eines Pass-Through-Zweigs, in dem die Variable nicht initialisiert ist.

Das ist genau richtig, es gibt Ihnen eine Warnung.

Verwechseln Sie Ihre Selbstgefälligkeit nicht mit der Realität. Die Realität zeigt sich erst nach vielen Projekten, und die Einsicht, dass "das nicht sein kann, weil die Logik so und so führt", kommt jeden Tag.

 
Renat:

Verwechseln Sie Ihr Selbstvertrauen nicht mit der Realität. Die Realität zeigt sich erst nach vielen Projekten, und die Erkenntnis, dass "das nicht sein kann, weil die Logik so und so führt", kommt täglich.

Können Sie eine angemessene Erklärung erhalten? Der Code ist gegeben, die "selbstgerechte" Aussage ist gemacht, wo ist der Fehler? Ich verstehe die Esoterik nicht.

...Wenn man die Übersetzung des Satzes"possible use of uninitialized variable" betrachtet, wird die Warnung tatsächlich "absolut korrekt" ausgegeben. Aber es geht nicht um "garantiert", sondern nur um das mögliche Vorhandensein eines Zweigs eines Durchgangs, in dem die Variable nicht initialisiert ist. Das ist genau das, wovon ich "zuversichtlich" spreche.

 
Yedelkin:

Können wir eine angemessene Erklärung erhalten? Der Code ist gegeben, die "selbstgerechte" Aussage ist gemacht, wo ist der Fehler? Ich verstehe die Esoterik nicht.

Was wäre, wenn anstelle von

interrupcion=true;

anstelle von (zum Beispiel)...

interrupcion = (someFunction1(input) > someFunction2(input2)) && (someFunction3() < 1) || (someFunction1(input3) * someFunction3() > 10);
Würden Sie auch einen Antrag stellen? Vor allem, wenn someFunctionN aus Hunderten von Codezeilen besteht?

Ihrem Code zufolge wird die Variable initialisiert, wenn Zeile 15 ausgeführt wird. Aber was würden Sie dem Compiler in dem von mir angeführten Beispiel sagen, was er tun soll? Die Aufgabe ist schwierig. Und es ist auch nicht nötig, sie zu lösen.

Der Fehler heißt"possible (maybe) use of uninitialized variable" (obwohl Sie es sowieso wissen).

Sie sollten der Variablen local_low explizit einen Wert zuweisen. Glauben Sie mir, das kann Sie vor möglichen Fehlern in der Zukunft bewahren (Code wird korrigiert, etwas wird entfernt, etwas wird verschoben, etwas wird geändert, und Zeile 13 kann bei diesem Prozess herausfallen)

 
Yedelkin:

Können wir eine angemessene Erklärung erhalten? Der Code ist gegeben, die "selbstgerechte" Aussage ist gemacht, wo ist der Fehler? Ich verstehe die Esoterik nicht.

In der realen Welt, in der die überwiegende Mehrheit der Programmierer in jeder Sprache völlig ungeschützten und fehlerhaften Code schreibt, sollten die Compiler so streng wie möglich sein. Die Selbstgefälligkeit der Programmierer "die Logik ist klar, es sollte keine Probleme geben, alles ist so initialisiert, wie es sein sollte" brachte und bringt immer noch eine Vielzahl von Fehlern mit sich.

Deshalb sind die Fragen zur Kritik an strengen Maßnahmen hier nicht relevant.

 
Renat:

... Das Selbstvertrauen der Programmierer "die Logik ist klar, es sollte keine Probleme geben, alles ist richtig initialisiert" hat eine große Anzahl von Fehlern verursacht, bringt und wird sie bringen.

Deshalb ist die Kritik an strengen Maßnahmen hier irrelevant.

Lassen Sie uns auf Kritik verzichten. Zumal ich es nicht in meinen Worten ausgedrückt habe. Und was das Vorhandensein von Kritik meinerseits angeht, irren Sie sich gewaltig.

Worin besteht also Ihr Fehler? Da Sie die Esoterik nicht in einen Code packen können, antworten Sie mir bitte in der Sprache der Logik. Das heißt, in einer Sprache, die jeder Programmierer verstehen kann.

 
notused:

würden Sie auch einen Antrag stellen ? Vor allem, wenn someFunctionN aus Hunderten von Codezeilen besteht?

Sie befinden sich auch in der gleichen Situation. Nun, ich habe keine Beschwerden. Ich möchte nur klarstellen, dass nicht alles so kategorisch ist, wie Renat sagt.

Was ist mit dem Code? Ich habe Ihnen ein konkretes Beispiel für einen Code genannt, der die kategorische Gültigkeit von Renats Aussage mit gewöhnlicher Logik widerlegt. Danke für den Rat, ich versuche, mich ständig zu verbessern.

 
Yedelkin:

Lassen wir die Kritik beiseite. Zumal ich es nicht in meinen Worten ausgedrückt habe. Und was das Vorhandensein von Kritik von meiner Seite betrifft, so irren Sie sich gewaltig.

Was ist also Ihr Fehler? Da Sie die Esoterik nicht in einen Code packen können, antworten Sie mir bitte in der Sprache der Logik. Das heißt, in einer Sprache, die jeder Programmierer versteht.

Sie haben"mögliche Verwendung der nicht initialisierten Variable 'local_low'".

Und was bekommen Sie, wenn Sie

(1)         double local_low=1.1; // или что-то другое
 
Yedelkin:

Was ist also ein Fehler? Da Sie Esoterik nicht in den Code einbauen können, antworten Sie bitte in der Sprache der Logik. Das heißt, in einer Sprache, die jeder Programmierer versteht.

Lesen Sie meine Antworten noch einmal aus der Sicht eines Managers eines Softwareunternehmens, der viele Softwareprojekte auf den Markt gebracht hat.

Andernfalls bleiben Sie auf dem Niveau eines "beliebigen Programmierers" und werden nicht verstehen, worin der Fehler besteht.

Grund der Beschwerde: