Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Продавай свои разработки в Маркете. Это безопасно!
wladimir
1145
wladimir 2013.12.18 13:22 

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

то при изменении 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
1145
wladimir 2013.12.18 14:09  

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

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

 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
2302
Sergey Guliaev 2013.12.18 14:34  
wlad:

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

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

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

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


Ну вы же StringVal вручную меняете и сразу инит отрабатывает, все верно...
wladimir
1145
wladimir 2013.12.18 14:40  

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

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

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

Alexander
2441
Alexander 2013.12.18 15:13  
Когда меняете StringVal, тогда же меняйте и firsttime на false
wladimir
1145
wladimir 2013.12.18 15:31  

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

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

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

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

wladimir
1145
wladimir 2013.12.18 16:20  

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

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

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

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
1177
Mikhail Kozhemyako 2013.12.18 16:33  
wlad:

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

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

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

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

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

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

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

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

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

wladimir
1145
wladimir 2013.12.18 16:52  

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

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

Sergey Guliaev
2302
Sergey Guliaev 2013.12.18 17:14  
wlad:

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

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

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


вот пример

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

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