непонятки с поведением переменных
вот и второй варинт
выходит так что переменные указывают на одно и тоже место в памяти после первого присвоения
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() { }
если компилирую как эксперт
то при изменении StringVal сразу же меняется backup
причем последний Print не вызывается
где собака зарыта?
Ну вы же StringVal вручную меняете и сразу инит отрабатывает, все верно...
понятно что init() срабатывает
проблема в том что 2. переменная обнавляется независимо от других условий
нет условия на обновление - а обновление происходит!
да всё это понятно
проблема в том что 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); }
приведу подобный пример
значение первой переменной передаётся второй переменной всего лишь один раз и значение второй переменной не должно менятся при дальнейшем исполнении программы
однако при каждом изменении первой переменной - меняется и вторая, что не должно быть
При изменении extern переменной происходит перезапуск советника, что приводит к инициализации переменных, объявленных на глобальном уровне. Все правильно. Если хотите этого избежать - используйте Глобальные переменные.
неправильно - никакой инициализации не производитсья
вот доказательство из справки
Инициализация глобальных переменных производится однократно сразу после загрузки программы в память клиентского терминала.
и вообще здесь дело не в инициализации а в изменении переменной
прошу внимательно код прочитать
причём проблема возникает только с переменными типа string
c другими типами без проблем!
вот и второй варинт
выходит так что переменные указывают на одно и тоже место в памяти после первого присвоения
хотел бы я знать с какого билда эта лебеда тянется
вот пример
у вас всегда выполнено условие StringVal != backup и firsttime всегда будет true, поскольку он (инит) запускается единственный раз но при КАЖДОМ перезапуске советника, а новый пуск происходит при смене тф окна, при изменении сета при запуске терминала. То есть когда вы изменяете StringVal вы снова запускаете инит.
если компилирую как эксперт
то при изменении StringVal сразу же меняется backup
причем последний Print не вызывается
где собака зарыта?