confusão sobre o comportamento das variáveis

 

se eu compilar como um especialista

então quando eu mudo o StringVal, o backup muda imediatamente

e a última impressão não é chamada

Onde está o 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() { }
 

aqui está a segunda opção

Acontece que as variáveis apontam para o mesmo local de memória após a primeira atribuição

 if(firsttime) { backup = StringVal; 

Eu gostaria de saber de onde vem esta construção


aqui está um exemplo

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 eu compilar como um especialista

então quando eu mudo o StringVal, o backup muda imediatamente

e a última impressão não é chamada

Onde está o problema?


Bem, você muda manualmente o StringVal e o init funciona imediatamente, é isso mesmo ...
 

é claro que o init() funciona

O problema é que 2. a variável está sendo atualizada independentemente de outras condições

não há condição de atualização - mas a atualização acontece!

 
Quando você muda StringVal, mude a primeira vez para falso ao mesmo tempo
 

Sim, está tudo claro

O problema é que 2. a variável é definida independentemente de outras condições

SEMPRE

GRAVE PROBLEMA

 

aqui está um exemplo semelhante

o valor da primeira variável é passado para a segunda variável apenas uma vez e o valor da segunda variável não deve mudar na execução posterior do programa

mas toda vez que a primeira variável é alterada, o valor da segunda variável muda, o que não deve 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:

aqui está um exemplo semelhante

o valor da primeira variável é passado para a segunda variável apenas uma vez e o valor da segunda variável não deve mudar na execução posterior do programa

mas toda vez que a primeira variável é alterada, o valor da segunda variável muda, o que não deve ser

Sempre que a variável externa é alterada, a EA é reiniciada, o que leva à inicialização das variáveis declaradas em nível global. Isto é correto. Se você quiser evitar isto, use as Variáveis Globais.
 
Sepulca:
Quando a variável externa é alterada, a EA é reiniciada, o que leva à inicialização das variáveis, declaradas em nível global. Isto é correto. Se você quiser evitar isso, use as Variáveis Globais.

errado - nenhuma inicialização

aqui está uma prova da ajuda

As variáveis globais são inicializadas apenas uma vez, logo após o programa ser carregado na memória do terminal do cliente.

e, em geral, não se trata de inicialização, mas de mudança variável

Por favor, leia o código cuidadosamente

 

E o problema ocorre apenas com variáveis do tipo string

Com outros tipos não há problema!

 
wlad:

aqui está a segunda opção

Acontece que as variáveis apontam para o mesmo local de memória após a primeira atribuição

Eu gostaria de saber de onde vem esta construção


Aqui está um exemplo

você sempre tem o StringVal != backup e a primeira vez será sempre verdadeiro porque ele (init) é iniciado apenas uma vez , mas toda vez que você reinicia o EA e um novo é iniciado quando você muda a janela de informações ou quando você muda o set no início do terminal . Assim, quando você muda oStringVal, você começa o init novamente.