confusion sur le comportement des variables

 

Si je compile comme un expert

alors quand je change la StringVal, la sauvegarde change immédiatement.

et la dernière impression ne s'appelle pas

Où est le problème ?

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

voici la deuxième option

il s'avère que les variables pointent vers le même emplacement mémoire après la première affectation

 if(firsttime) { backup = StringVal; 

J'aimerais savoir de quelle construction il s'agit.


voici un exemple

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 je compile comme un expert

alors quand je change la StringVal, la sauvegarde change immédiatement.

et la dernière impression ne s'appelle pas

Où est le problème ?


Eh bien, vous changez manuellement la StringVal et l'init fonctionne immédiatement, c'est vrai...
 

il est clair que init() fonctionne

Le problème est que 2. la variable est mise à jour indépendamment des autres conditions.

il n'y a pas de condition de mise à jour - mais la mise à jour a lieu !

 
Quand vous changez StringVal, changez firsttime en false en même temps.
 

Oui, c'est clair.

Le problème est que 2. la variable est définie indépendamment des autres conditions.

TOUJOURS

PROBLÈME GRAVE

 

Voici un exemple similaire

la valeur de la première variable est transmise à la deuxième variable une seule fois et la valeur de la deuxième variable ne doit pas changer lors de l'exécution ultérieure du programme

mais à chaque fois que la première variable est changée, la valeur de la deuxième variable change, ce qui ne devrait pas être

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:

Voici un exemple similaire

la valeur de la première variable est transmise à la deuxième variable une seule fois et la valeur de la deuxième variable ne doit pas changer lors de l'exécution ultérieure du programme

mais à chaque fois que la première variable est changée, la valeur de la deuxième variable change, ce qui ne devrait pas être

Chaque fois que la variable externe est modifiée, l'EA est redémarrée, ce qui entraîne l'initialisation des variables déclarées au niveau global. C'est exact. Si vous voulez éviter cela, utilisez des variables globales.
 
Sepulca:
Lorsque la variable externe est modifiée, l'EA est redémarrée, ce qui entraîne l'initialisation des variables, déclarées au niveau global. C'est exact. Si vous voulez éviter cela, utilisez des variables globales.

faux - pas d'initialisation du tout

Voici une preuve tirée de l'aide

Les variables globales ne sont initialisées qu'une seule fois, juste après le chargement du programme dans la mémoire du terminal client.

Et en général, il ne s'agit pas d'initialisation mais de changement de variable

Veuillez lire attentivement le code

 

Et le problème ne se produit qu'avec les variables de type chaîne de caractères.

Avec les autres types, pas de problème !

 
wlad:

voici la deuxième option

il s'avère que les variables pointent vers le même emplacement mémoire après la première affectation

J'aimerais savoir de quelle construction il s'agit.


Voici un exemple

vous avez toujours la StringVal != backup et firsttime sera toujours vrai parce qu'il (init) n'est lancé qu'une seule fois mais à chaque fois que vous redémarrez l'EA et qu'un nouveau est lancé lorsque vous changez de fenêtre d'information ou lorsque vous changez de set au démarrage du terminal . Donc quand tu changesStringVal tu recommences l'init.

Raison: