Fehler, Irrtümer, Fragen - Seite 168

 
Manov:

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

Was sagt es aus, wenn

Wenn die Variable mit irgendetwas initialisiert wird, verschwindet die Warnung. Wie Sie jedoch selbst sehen können, ist die Initialisierung der Variablen "local_low" in diesem Codefragment unnötig. Die Warnung beeinträchtigt das Leben also in keiner Weise.
 
Renat:

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.

:) Da ich nie der Leiter eines Softwareunternehmens werden werde, werde ich für immer auf der Ebene eines "beliebigen Programmierers" (d. h. eines Amateurprogrammierers, wie ich es verstehe) bleiben.

...Und da der Amateurprogrammierer nie eine logische Beschreibung des Fehlers erhält, kommt er zu dem Schluss, dass es entweder einfach keinen Fehler in seinem Stück Code gibt oder der Fehler so kompliziert ist, dass ihn niemand in der Sprache der Logik beschreiben kann. An diesem Punkt können wir davon ausgehen, dass beide Seiten einander verstehen, die Frage ist erledigt.

 
Yedelkin:
Wenn die Variable mit irgendetwas initialisiert wird, verschwindet die Warnung. Aber wie Sie selbst sehen können, ist die Initialisierung der Variablen local_low in diesem Code überflüssig. Die Warnung beeinträchtigt das Leben also in keiner Weise.
Ein konkreter Code ist wahrscheinlich ja. aber der Compiler muss so"narrensicher" wie möglich sein.
 
Also flammte der Monitor auf und sagte dem Programmierer: Verstecke niemals die Initialisierung hinter einer Bedingung, verwende niemals eine Schleifenvariable nach dem Schleifenkörper, prüfe die Division durch Null, multipliziere nicht unnötig Entitäten, schreibe nicht if (a==true) ...
 
Manov:
... Der Compiler muss so"narrensicher" wie möglich sein.
Dem widerspreche ich nicht. Das ist eine nützliche Warnung. Je mehr dieser Warnungen Sie haben, desto besser werden Sie Ihren eigenen Code verstehen.
 
Vigor:
... nicht schreiben if (a==true) ...

Übrigens habe ich im Frühjahr Expert Advisors ausgebildet, in die ich, nachdem ich viel Literatur gelesen hatte, Bedingungen vom Typ if(a) eingefügt habe. Aber die Experten begannen erst zu arbeiten, nachdem ich diese Bedingungen in Bedingungen wie if (a==true) geändert hatte. Jetzt kann ich mich kaum noch von dieser Gewohnheit lösen.
 
Yedelkin:

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 in Zeile 15 die Variable local_low 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.
Wenn in Ihrem Beispiel Ac-k=0 ist, wird der for-Operator überhaupt nicht ausgeführt und local_low wird garantiert nicht initialisiert. Oder ist das falsch?
Документация по MQL5: Основы языка / Операторы / Оператор цикла for
Документация по MQL5: Основы языка / Операторы / Оператор цикла for
  • www.mql5.com
Основы языка / Операторы / Оператор цикла for - Документация по MQL5
 

Wenn wir eine Anfrage zur Änderung einer Position mit denselben Stopps senden, erhalten wir einen Fehler. Wenn Sie jedoch eine Anfrage zur Änderung eines schwebenden Auftrags mit denselben Parametern senden, wird die Anfrage ausgeführt. Haben wir das so geplant und brauchen wir die Parameter nicht auf Änderungen zu überprüfen?

Warum sollte man den Server mit unnötigen Anfragen belasten, z.B. im Falle eines Fehlers im Expert Advisor oder einer fehlerhaften Logik seiner Arbeitsweise?

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5
 
Valmars:
Wenn in Ihrem Beispiel Ac-k=0 ist, wird die for-Anweisung überhaupt nicht ausgeführt und local_low ist garantiert nicht initialisiert. Oder ist das falsch?

Das ist genau richtig. Wenn Ac-k<=1, darf der for-Operator überhaupt nicht ausgeführt werden und die Variable local_low bleibt garantiert uninitialisiert. Da aber die bool-Variable interrupcion falsch bleibt (Zeile 3), wird die nicht initialisierte Variable local_low aufgrund der Bedingung in Zeile 13 niemals in Berechnungen verwendet (sollte niemals verwendet werden). Insbesondere sollte ein Ausdruck mit der Variablen local_low aus Zeile 15 nicht ausgewertet werden [es sei denn, die if-Anweisung funktioniert genau wie in der Hilfe angegeben:) ].

Mit anderen Worten: Wenn die Variable local_low garantiert nicht initialisiert wird, wird sie auch garantiert nicht in Berechnungen verwendet (sollte nicht verwendet werden).

 

void Graf()
{
if(ObjectFind(0, "H")<0) ObjectCreate(0, "H",OBJ_HLINE
,0,0,h,0);
if(ObjectFind(0, "L")<0) ObjectCreate(0, "L",OBJ_HLINE,0,0,l,0)
; ObjectSetDouble(0, "H",OBJPROP_PRICE,h)
; ObjectSetDouble(0, "L",OBJPROP_PRICE,l)
;
string bal = DoubleToString(AccountInfoDouble(ACCOUNT_BALANCE),2)
;string equ = DoubleToString (AccountInfoDouble(ACCOUNT_EQUITY),2)
; string spread = DoubleToString(((Ask-Bid)/_Point),0)
; string space = ""
; string info= bal+space+equ+space+spread
;
if (ObjectFind(0, "info")<0) ObjectCreate(0, "info",OBJ_LABEL,0,0,0)
; ObjectSetInteger(0, "info",OBJPROP_XDISTANCE,0)
;ObjectSetInteger(0, "info",OBJPROP_YDISTANCE,15)
; ObjectSetString(0, "info",OBJPROP_TEXT,info)
;ObjectSetInteger(0, "info",OBJPROP_FONTSIZE,36)
; ObjectSetInteger(0, "info",OBJPROP_COLOR,Maroon)
; return
; }

Hier ist ein Stück Code. Die Funktion druckt bei jedem Tick die Werte für Saldo, Eigenkapital und Spread. Aber die Informationen werden aus irgendeinem Grund nicht für das vorherige Häkchen angezeigt... Bitte helfen Sie mir zu verstehen, warum? In MT4 ändert ein ähnlicher Code die Werte bei jedem neuen Tick, und in MT5 werden bei einem neuen Tick die Informationen für den vorherigen Tick angezeigt.