confusione sul comportamento delle variabili

 

se compilo come esperto

poi quando cambio la StringVal, il backup cambia immediatamente

e l'ultima Stampa non si chiama

Dov'è il problema?

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() { }
 

ecco la seconda opzione

si scopre che le variabili puntano alla stessa posizione di memoria dopo la prima assegnazione

 if(firsttime) { backup = StringVal; 

Mi piacerebbe sapere da quale costruzione proviene


Ecco un esempio

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:

Se compilo come esperto

allora quando cambio la StringVal, il backup cambia immediatamente

e l'ultima Stampa non si chiama

Dov'è il problema?


Bene, cambiate manualmente lo StringVal e l'init funziona immediatamente, è giusto ...
 

è chiaro che init() funziona

Il problema è che 2. la variabile viene aggiornata indipendentemente da altre condizioni

non c'è una condizione di aggiornamento - ma l'aggiornamento avviene!

 
Quando cambiate StringVal, cambiate allo stesso tempo firsttime a false
 

Sì, è tutto chiaro

Il problema è che 2. la variabile è impostata indipendentemente da altre condizioni

SEMPRE

PROBLEMA SERIO

 

ecco un esempio simile

il valore della prima variabile viene passato alla seconda variabile solo una volta e il valore della seconda variabile non deve cambiare nell'ulteriore esecuzione del programma

ma ogni volta che la prima variabile viene cambiata, il valore della seconda variabile cambia, il che non dovrebbe essere

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:

ecco un esempio simile

il valore della prima variabile viene passato alla seconda variabile solo una volta e il valore della seconda variabile non deve cambiare nell'ulteriore esecuzione del programma

ma ogni volta che la prima variabile viene cambiata, il valore della seconda variabile cambia, il che non dovrebbe essere

Ogni volta che la variabile esterna viene cambiata, l'EA viene riavviata, il che porta all'inizializzazione delle variabili dichiarate a livello globale. Questo è corretto. Se volete evitare questo, usate le variabili globali.
 
Sepulca:
Quando la variabile esterna viene cambiata, EA viene riavviata, il che porta all'inizializzazione delle variabili dichiarate a livello globale. Questo è corretto. Se volete evitare questo, usate le variabili globali.

sbagliato - nessuna inizializzazione

Ecco una prova dalla guida

Le variabili globali sono inizializzate solo una volta, subito dopo che il programma è stato caricato nella memoria del terminale client.

E in generale, non si tratta di inizializzazione ma di cambiamento di variabile

Si prega di leggere attentamente il codice

 

E il problema si verifica solo con le variabili di tipo stringa

Con altri tipi nessun problema!

 
wlad:

ecco la seconda opzione

si scopre che le variabili puntano alla stessa posizione di memoria dopo la prima assegnazione

Mi piacerebbe sapere da quale costruzione proviene


Ecco un esempio

si ha sempre lo StringVal != backup e firsttime sarà sempre vero perché (init) viene avviato solo una volta ma ogni volta che si riavvia l'EA e ne viene avviato uno nuovo quando si cambia finestra informativa o quando si cambia set all'avvio del terminale . Quindi, quando cambiateStringVal, ricominciate l'init.