непонятки с поведением переменных

 

если компилирую как эксперт

то при изменении StringVal сразу же меняется backup

причем последний Print не вызывается

где собака зарыта?

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

вот и второй варинт

выходит так что переменные указывают на одно и тоже место в памяти после первого присвоения

 if(firsttime) { backup = StringVal; 

хотел бы я знать с какого билда эта лебеда тянется


вот пример

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:

если компилирую как эксперт

то при изменении StringVal сразу же меняется backup

причем последний Print не вызывается

где собака зарыта?


Ну вы же StringVal вручную меняете и сразу инит отрабатывает, все верно...
 

понятно что init() срабатывает

проблема в том что 2. переменная обнавляется независимо от других условий

нет условия на обновление - а обновление происходит!

 
Когда меняете StringVal, тогда же меняйте и firsttime на false
 

да всё это понятно

проблема в том что 2. переменная обнавляется независимо от других условий

причём ВСЕГДА

КОСЯК СЕРЪЁЗНЫЙ

 

приведу подобный пример

значение первой переменной передаётся второй переменной всего лишь один раз и значение второй переменной не должно менятся при дальнейшем исполнении программы

однако при каждом изменении первой переменной - меняется и вторая, что не должно быть

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:

приведу подобный пример

значение первой переменной передаётся второй переменной всего лишь один раз и значение второй переменной не должно менятся при дальнейшем исполнении программы

однако при каждом изменении первой переменной - меняется и вторая, что не должно быть

При изменении extern переменной происходит перезапуск советника, что приводит к инициализации переменных, объявленных на глобальном уровне. Все правильно. Если хотите этого избежать - используйте Глобальные переменные.
 
Sepulca:
При изменении extern переменной происходит перезапуск советника, что приводит к инициализации переменных, объявленных на глобальном уровне. Все правильно. Если хотите этого избежать - используйте Глобальные переменные.

неправильно - никакой инициализации не производитсья

вот доказательство из справки

Инициализация глобальных переменных производится однократно сразу после загрузки программы в память клиентского терминала.

и вообще здесь дело не в инициализации а в изменении переменной

прошу внимательно код прочитать

 

причём проблема возникает только с переменными типа string

c другими типами без проблем!

 
wlad:

вот и второй варинт

выходит так что переменные указывают на одно и тоже место в памяти после первого присвоения

хотел бы я знать с какого билда эта лебеда тянется


вот пример

у вас всегда выполнено условие StringVal != backup и firsttime всегда будет true, поскольку он (инит) запускается единственный раз но при КАЖДОМ перезапуске советника, а новый пуск происходит при смене тф окна, при изменении сета при запуске терминала. То есть когда вы изменяете StringVal вы снова запускаете инит.

Причина обращения: