declaration of 'whatever' hides local variable

Einloggen oder registrieren, um einen Kommentar zu schreiben
lindomatic
293
lindomatic  

Hallo,

lokal deklariere ich die Variable in einer if-Bedingung (und auch in der else). 
Wenn ich sie außerhalb der if-Bedingung ausgeben will, bekomme ich ein "undeclared identifier".
Frage 1: Kann ich auf Variablen, die in if/else deklariert werden, von außerhalb überhaupt zugreifen?
(static vars sind ja für etwas anderes gedacht, dass der erste Wert erhalten bleibt..)
Wenn ich sie nun direkt zu Beginn von OnTick deklariere, kommt "declaration of 'whatever' hides local variable".
Frage 2: Ja, was denn nun, deklarieren oder hiden oder undeclared.. 

Ich möchte die Variable je nach Bedingung(sprüfung) setzen, wie mache ich das?

Ich habe das hier: https://www.mql5.com/en/docs/basis/variables/variable_scope gelesen.
Gibt es keine Möglichkeit, den Wert einer local nach global zu exportieren? 

Danke!!

VG, Chris

Documentation on MQL5: Language Basics / Variables / Visibility Scope and Lifetime of Variables
Documentation on MQL5: Language Basics / Variables / Visibility Scope and Lifetime of Variables
  • www.mql5.com
A variable declared outside all functions is located into the global scope. Access to such variables can be done from anywhere in the program.These variables are located in the global pool of memory, so their lifetime coincides with the lifetime of the program. A variable declared inside a block (part of code enclosed in curly brackets) belongs...
amando
2880
amando  
lindomatic:

Hallo,

lokal deklariere ich die Variable in einer if-Bedingung (und auch in der else). 
Wenn ich sie außerhalb der if-Bedingung ausgeben will, bekomme ich ein "undeclared identifier".
Frage 1: Kann ich auf Variablen, die in if/else deklariert werden, von außerhalb überhaupt zugreifen?
(static vars sind ja für etwas anderes gedacht, dass der erste Wert erhalten bleibt..)
Wenn ich sie nun direkt zu Beginn von OnTick deklariere, kommt "declaration of 'whatever' hides local variable".
Frage 2: Ja, was denn nun, deklarieren oder hiden oder undeclared.. 

Ich möchte die Variable je nach Bedingung(sprüfung) setzen, wie mache ich das?

Ich habe das hier: https://www.mql5.com/en/docs/basis/variables/variable_scope gelesen.
Gibt es keine Möglichkeit, den Wert einer local nach global zu exportieren? 

Danke!!

VG, Chris

Zu frage 1, nein

zu 2, du darfst die variable nicht in der ontick und im global space deklarieren

Carl Schreiber
Moderator
9815
Carl Schreiber  
lokal deklariere ich die Variable in einer if-Bedingung (und auch in der else). 
Wenn ich sie außerhalb der if-Bedingung ausgeben will, bekomme ich ein "undeclared identifier".
Frage 1: Kann ich auf Variablen, die in if/else deklariert werden, von außerhalb überhaupt zugreifen?
(static vars sind ja für etwas anderes gedacht, dass der erste Wert erhalten bleibt..)
Wenn ich sie nun direkt zu Beginn von OnTick deklariere, kommt "declaration of 'whatever' hides local variable".
Frage 2: Ja, was denn nun, deklarieren oder hiden oder undeclared..

Solche Warnungen heöfen vor allem Anfängern, Fehler in der Ausführung zu vermeiden, die dann schwer zu finden sind, weil irgendwo im Code einer Variablen plötzlich neue Werte zugewiesen werden.

Ganz einfach die Namen der variablen genau planen.

Frage 1: Kann ich auf Variablen, die in if/else deklariert werden, von außerhalb überhaupt zugreifen?

Nein.

"declaration of 'whatever' hides local variable".

Das passiert wenn Du mehrfach den selben Var.-Namen verwendest - lass es einfach!

Drück mal F1 im Editor, wechsle zum Tab "Suchen" und trage ein: "Sichtbereich und Lebensdauer der Variablen", Enter und lies den Abschnitt!

lindomatic
293
lindomatic  
Carl Schreiber:

Solche Warnungen heöfen vor allem Anfängern, Fehler in der Ausführung zu vermeiden, die dann schwer zu finden sind, weil irgendwo im Code einer Variablen plötzlich neue Werte zugewiesen werden.

Ganz einfach die Namen der variablen genau planen.

Nein.

Das passiert wenn Du mehrfach den selben Var.-Namen verwendest - lass es einfach!

Drück mal F1 im Editor, wechsle zum Tab "Suchen" und trage ein: "Sichtbereich und Lebensdauer der Variablen", Enter und lies den Abschnitt!

Sehr schwierig.. also das mit dem Sichtbereich und der Lebensdauer der Vars verstehe ich. Aber da fehlt die Möglichkeit des Austauschs zwischen den Scopes..

Oder ich bekomme da etwas noch nicht in den Kopf.. nicht ausgeschlossen! =)

Gibt es ein Manual zum Metaeditor selbst? Dass man ganze Blöcke verschieben kann usw.. also zum reinen Texthandling.. wie bspw. mit dem Visual Mode im VIM, falls Dir das was sagt?

Vielen Dank!!

lippmaje
1185
lippmaje  

Globale Variablen sollten so benannt werden, dass sie auch als solche erkannt werden können. Beispiel: MqlTick g_CurrentTick oder CurrentTick. Lokale Variablen sind dann klein geschrieben: int i; double value; etc.

Dies erfreut das Auge eines evtl nachfolgenden Betrachters (ein Auftragnehmer oder ggf Du selbst nach ein paar Monaten.)

lindomatic
293
lindomatic  
lippmaje:

Globale Variablen sollten so benannt werden, dass sie auch als solche erkannt werden können. Beispiel: MqlTick g_CurrentTick oder CurrentTick. Lokale Variablen sind dann klein geschrieben: int i; double value; etc.

Dies erfreut das Auge eines evtl nachfolgenden Betrachters (ein Auftragnehmer oder ggf Du selbst nach ein paar Monaten.)

Danke, aber das ist alles nicht das/mein Problem. Wenn ich lokale Variablen in if/else Abschnitten verwende, bekomme ich ein "not declared", weil
ich die Werte außerhalb der if/else Abschnitte benötige. Daher packe ich sie dann nochmal global rein, damit überliste ich denn den Compiler, aber
offenbar auch mich selbst.. ich muss da noch etwas drüber brüten.. 

lippmaje
1185
lippmaje  

Also in MQL4 ist genau das möglich, was Du unter 1) aufgeführt hast. Man kann tatsächlich eine Variable nach einer if/else (oder nur if) Anweisung nutzen, die darin deklariert wurde:

if(bedingung) {
   int var=1;
}
else {
   int var=2; // --> 'var' - variable already defined
}
Print(var); // geht!

Und dieselbe Variable im else-Zweig (oder einem anderen if) würde zu einem Compilerfehler führen.

MQL5 behandelt das wieder anders.

Otto Pauser
2165
Otto Pauser  
lippmaje:

Also in MQL4 ist genau das möglich, was Du unter 1) aufgeführt hast. Man kann tatsächlich eine Variable nach einer if/else (oder nur if) Anweisung nutzen, die darin deklariert wurde:

Und dieselbe Variable im else-Zweig (oder einem anderen if) würde zu einem Compilerfehler führen.

MQL5 behandelt das wieder anders.

Haltet euch da besser an die Gepflogenheiten von Pascal:

Zuerst die Variablen deklarieren und dann verwenden.

Das ist auch beim Debuggen besser.

int i;
for(i=0; i<limit; i++)

halte ich für besser als

for(int i=0; i<limit; i++)

da ist das überwachen der Schleifenvariablen i schwerer
lindomatic
293
lindomatic  

Danke für Euren Input.

Was ich machen will ist:

//Deklarieren im global scope
double winpips=10;

//Nutzen und bearbeiten in OnTick
Print winpips -> hier sind es (beim ersten OnTick) 10 und ggfs. nach einer Anpassung ein anderer Wert.

Wenn nun aber der buyTrade gut läuft -> wenn "anpassen = true" -> winpips=20;
Nach der Anpassung -> "anpassen=false";

Nun muss ich außerhalb der Bedingung mit den angepassten winpips arbeiten können.

Print winpips -> hier sind es nun 20.

Überprüfen des Preises, wenn weiter gut läuft, dann "anpassen=true"

Ich meine sogar, dass es funktioniert, oder ich verstehe bloß nicht, dass es nicht funktioniert.

Ich habe heute keine Zeit mehr..

amando
2880
amando  
lindomatic:

Danke für Euren Input.

Was ich machen will ist:

Ich meine sogar, dass es funktioniert, oder ich verstehe bloß nicht, dass es nicht funktioniert.

Ich habe heute keine Zeit mehr..

Theoretisch funktioniert das.

du solltest aber die winpips in der deklaration keinen wert zuweisen, den würde ich erst beim eingeben des trades zuweisen, dann kannst du sicher sein, das er beim setzen des trades den startwert hat und du sparst dir das rücksetzen beim schliessen des trades.

lindomatic
293
lindomatic  
amando:

Theoretisch funktioniert das.

du solltest aber die winpips in der deklaration keinen wert zuweisen, den würde ich erst beim eingeben des trades zuweisen, dann kannst du sicher sein, das er beim setzen des trades den startwert hat und du sparst dir das rücksetzen beim schliessen des trades.

ok, danke für die Beflügelung =) obwohl es ja gegen die Beschreibung der Gültigkeitsbereiche ist; laut denen dürfte es nicht funktionieren.
Ich fände es aber untauglich, wenn ich Werte der Variablen mittels Bedingungen nicht ändern könnte.
Oder sollte ich Funktionen bauen, die dann mit der Variablen als Parameter aufgerufen werden und den angepassten Wert zurückliefern?

Mit dem 0-Wert bei der Deklaration hast Du recht, danke.

Ich sitze morgen abend ein paar Stunden im Zug, dann komme ich erst weiter..

12
Einloggen oder registrieren, um einen Kommentar zu schreiben