confusión sobre el comportamiento de las variables

 

Si compilo como un experto

entonces cuando cambio el StringVal, la copia de seguridad cambia inmediatamente

y la última Impresión no se llama

¿Dónde está el 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() { }
 

esta es la segunda opción

resulta que las variables apuntan a la misma ubicación de memoria después de la primera asignación

 if(firsttime) { backup = StringVal; 

Me gustaría saber de qué construcción es esto


aquí hay un ejemplo

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:

si compilo como experto

entonces cuando cambio el StringVal, la copia de seguridad cambia inmediatamente

y la última Impresión no se llama

¿Dónde está el problema?


Bueno, cambias manualmente el StringVal y el init funciona inmediatamente, así es ...
 

está claro que init() funciona

El problema es que 2. la variable se actualiza independientemente de otras condiciones

no hay ninguna condición de actualización - ¡pero la actualización se produce!

 
Cuando cambie StringVal, cambie firsttime a false al mismo tiempo
 

Sí, está todo claro

El problema es que 2. la variable se fija independientemente de otras condiciones

SIEMPRE

PROBLEMA GRAVE

 

aquí hay un ejemplo similar

el valor de la primera variable se pasa a la segunda sólo una vez y el valor de la segunda variable no debe cambiar en la ejecución posterior del programa

pero cada vez que se modifica la primera variable, cambia el valor de la segunda, lo que no debería ser

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:

aquí hay un ejemplo similar

el valor de la primera variable se pasa a la segunda sólo una vez y el valor de la segunda variable no debe cambiar en la ejecución posterior del programa

pero cada vez que se modifica la primera variable, cambia el valor de la segunda, lo que no debería ser

Cada vez que se cambia la variable externa, el EA se reinicia, lo que lleva a la inicialización de las variables declaradas a nivel global. Esto es correcto. Si quiere evitarlo, utilice las Variables Globales.
 
Sepulca:
Cuando se cambia la variable externa, el EA se reinicia, lo que lleva a la inicialización de las variables, declaradas a nivel global. Esto es correcto. Si quiere evitarlo, utilice las Variables Globales.

erróneo - no hay inicialización en absoluto

aquí hay una prueba de la ayuda

Las variables globales se inicializan una sola vez, justo después de cargar el programa en la memoria del terminal cliente.

y en general, no se trata de la inicialización sino del cambio de variables

Lea atentamente el código

 

Y el problema se produce sólo con las variables de tipo string

¡Con otros tipos no hay problema!

 
wlad:

esta es la segunda opción

resulta que las variables apuntan a la misma ubicación de memoria después de la primera asignación

Me gustaría saber de qué construcción es esto


He aquí un ejemplo

siempre tienes el StringVal != backup y firsttime siempre será verdadero porque (init) se inicia una sola vez pero cada vez que reinicias el EA y se inicia uno nuevo cuando cambias de ventana de información o cuando cambias de set al iniciar la terminal . Así que cuando se cambiaStringVal se inicia el init de nuevo.