Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
wladimir
1160
wladimir  

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

то при изменении 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() { }
wladimir
1160
wladimir  

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

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

 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() {  }
Sergey Guliaev
2301
Sergey Guliaev  
wlad:

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

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

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

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


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

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

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

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

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

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

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

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

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

wladimir
1160
wladimir  

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

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

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

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);                              
}
Mikhail Kozhemyako
1262
Mikhail Kozhemyako  
wlad:

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

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

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

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

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

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

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

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

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

wladimir
1160
wladimir  

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

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

Sergey Guliaev
2301
Sergey Guliaev  
wlad:

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

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

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


вот пример

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

1234567
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий