Verwirrung über das Verhalten der Variablen

 

Wenn ich als Experte kompiliere

Wenn ich dann den StringVal ändere, ändert sich die Sicherung sofort

und der letzte Druck wird nicht als

Wo liegt das Problem?

extern string StringVal = "string";

       string backup = "";

int init() {
   Print("=========================");
   Print("StringVal=",StringVal,"    backup=",backup);
   if(StringVal != backup){
      backup = StringVal;
      Print("StringVal=",StringVal,"< > backup=",backup);
   }
}

int start() { }
 

hier die zweite Möglichkeit

es stellt sich heraus, dass die Variablen nach der ersten Zuweisung auf denselben Speicherplatz zeigen

 if(firsttime) { backup = StringVal; 

Ich würde gerne wissen, von welchem Build dies stammt


Hier ein Beispiel

extern string StringVal = "string";

       string backup    = "";
       bool   firsttime = true;
       
int init() {
   Print("=========================");
   Print("StringVal=",StringVal,"    backup=",backup);
 
   if(StringVal != backup){
      if(firsttime) { backup = StringVal; Print(" First Call ===> backup = StringVal"); }
      Print("StringVal=",StringVal,"< > backup=",backup);
   }
   firsttime = false;
}

int start() {  }
 
wlad:

wenn ich als Experte kompiliere

Wenn ich dann den StringVal ändere, ändert sich die Sicherung sofort

und der letzte Druck wird nicht als

Wo liegt das Problem?


Nun, Sie ändern den StringVal manuell und der Init funktioniert sofort, das ist richtig ...
 

es ist klar, dass init() funktioniert

Das Problem ist, dass 2. die Variable unabhängig von anderen Bedingungen aktualisiert wird

Es gibt keine Aktualisierungsbedingung - aber die Aktualisierung findet statt!

 
Wenn Sie StringVal ändern, setzen Sie gleichzeitig firsttime auf false
 

Ja, es ist alles klar

Das Problem ist, dass 2. die Variable unabhängig von anderen Bedingungen gesetzt wird

IMMER

GROSSES PROBLEM

 

Hier ein ähnliches Beispiel

der Wert der ersten Variablen wird nur einmal an die zweite Variable übergeben, und der Wert der zweiten Variablen sollte sich bei der weiteren Ausführung des Programms nicht ändern

aber jedes Mal, wenn die erste Variable geändert wird, ändert sich auch der Wert der zweiten Variable, was nicht sein sollte

extern string Value = "O";
       
string temp_="";
bool   firsttime=true;
       
int start() {
   string txt=StringConcatenate( "  Value: ",Value,"\n",
                                 "  temp_: ",temp_,"\n",
                                 "  firsttime: ",firsttime);    
   if(firsttime) { temp_=Value; firsttime=false; } // значение присваевается тольо ОДИН раз   

   Print(txt);
   Comment(txt);                              
}
 
wlad:

Hier ein ähnliches Beispiel

der Wert der ersten Variablen wird nur einmal an die zweite Variable übergeben, und der Wert der zweiten Variablen sollte sich bei der weiteren Ausführung des Programms nicht ändern

aber jedes Mal, wenn die erste Variable geändert wird, ändert sich der Wert der zweiten Variable, was nicht sein sollte

Jedes Mal, wenn die externe Variable geändert wird, wird der EA neu gestartet, was zu einer Initialisierung der auf globaler Ebene deklarierten Variablen führt. Das ist richtig. Wenn Sie dies vermeiden wollen, verwenden Sie globale Variablen.
 
Sepulca:
Wenn eine externe Variable geändert wird, wird EA neu gestartet, was zur Initialisierung von Variablen führt, die auf globaler Ebene deklariert sind. Das ist richtig. Wenn Sie dies vermeiden wollen, verwenden Sie globale Variablen.

falsch - überhaupt keine Initialisierung

Hier ist ein Beweis aus der Hilfe

Globale Variablen werden nur einmal initialisiert, gleich nachdem das Programm in den Speicher des Client-Terminals geladen wurde.

Und im Allgemeinen geht es nicht um die Initialisierung, sondern um die Änderung von Variablen

Bitte lesen Sie den Code sorgfältig

 

Und das Problem tritt nur bei Variablen vom Typ string auf

Bei anderen Typen kein Problem!

 
wlad:

hier die zweite Möglichkeit

es stellt sich heraus, dass die Variablen nach der ersten Zuweisung auf denselben Speicherplatz zeigen

Ich würde gerne wissen, von welchem Build dies stammt


Hier ein Beispiel

Sie haben immer den StringVal != backup und firsttime wird immer wahr sein, weil es (init) nur einmal gestartet wird , aber jedes Mal, wenn Sie den EA neu starten und ein neues gestartet wird, wenn Sie Info-Fenster ändern oder wenn Sie Set auf Terminal Start ändern. Wenn Sie alsoStringVal ändern , starten Sie das Init erneut.