Выпущена бета-версия MetaTrader 4 Build 529 с новым компилятором - страница 17

 
Barbarian:

А раньше все работало? Не могу понять, где у тебя объявляется переменная i для:


В глобальных переменных, я один раз инициализирую i и потом пользую её во всех циклах, так удобнее и проще ...
 
ALXIMIKS:

Так и должно быть, что при изменении параметров индикатора, который запущен уже и работает, методом двойного клика на нем,

не происходит обновление статик переменных, в виду чего он, гад индикатор, не перерисовывается ???


Статические переменные сохраняют свое значение при переинициализациии программы. Значения не сохраняются только при удалении программы с чарта и новом ее присоединении. Чтобы статические переменные сбрасывались при переинициализации, я использую такую конструкцию:

bool g_init;

void OnInit()
{
   g_init = true;
}

void MyFunction()
{
   static int myStatic;
   if (g_init)
   {
      myStatic = 0;
      g_init = false;
   }
}
 
VOLDEMAR:
В таком виде работает ...

В таком виде не работает


Во втором случае область видимости массива, объявленного в функции - функция.

В коде

for(i=Coment-1; i>=1; i--){info[i]=info[i-1]; cv  [i]=cv  [i-1];}info[0]=txt;cv[0]=et;


вы уверены что инициализируете все элементы массивов значениями txt и et? Вероятно последние 2 присваивания должны стоять перед циклом и цикл цикл должен быть построен иначе. Или это такая задумка?

 
Scriptong:


Статические переменные сохраняют свое значение при переинициализациии программы. Значения не сохраняются только при удалении программы с чарта и новом ее присоединении. Чтобы статические переменные сбрасывались при переинициализации, я использую такую конструкцию:


и что теперь по библиотеке лазить и переписывать все? бредово както, ведь в 509 все было нормально, а тут ......
 
alexvd:


Во втором случае область видимости массива, объявленного в функции - функция.

В коде


вы уверены что инициализируете все элементы массивов значениями txt и et? Вероятно последние 2 присваивания должны стоять перед циклом. Или это такая задумка?


Сначала происходит смещение текста на один уровень в цикле, затем нулевым значениям присваивается новый текст...

Данные массивы используются только в в функциях которые я представил выше ...

Раньше в 509 и более ранних билдах все работало в обоих случаях ... Сейчас только в первом ...

 
ALXIMIKS:

и что теперь по библиотеке лазить и переписывать все? бредово както, ведь в 509 все было нормально, а тут ......


Просто луче все переменные, которые планируется использовать в коде, инициализировать в самом начале кода ...

Это упрощает работу, и дает возможность видеть и правильно обнулять переменные при старте программы и дальнейшем ее использовании ...

 
ALXIMIKS:

Так и должно быть, что при изменении параметров индикатора, который запущен уже и работает, методом двойного клика на нем,

не происходит обновление статик переменных, в виду чего он, гад индикатор, не перерисовывается ???

Насколько я помню, так было всегда (в 509 билде точно). Это фича.

VOLDEMAR:

Заметил странную вещь на разных компах один с ХР другой с W 7

При инициализации массива внутри функции, массив не заполняется весь, только 0 значение ...

При инициализации массива на глобальном уровне за пределами всех функций, массивы заполняются полностью как и должно быть ...

Про это тоже тысячу раз говорили - инициализируйте массивы и переменные явно, не ждите "небесного благословения".

В случае с локальным объявлением вам просто везет и в них не попадает мусор. Но я бы на это не рассчитывал.

 
Обратите внимание, что новый компилятор и новая среда исполнения в разы жестче контролируют качество кода. Много MQL4 кода было написано сторонними разработчиками спустя рукава и теперь эти огрехи будут сразу видны.
 

Поправьте если не так понял.

Использую в индикаторе библиотечную функцию, в данной функции происходит объявление неких static переменной, которые участвуют в расчете индикаторного массива.

Если я желаю изменить параметры индикатора, то, что бы индикатор рассчитывался верно (в виду зависимости от static переменных),

должен передать в библиотечную функцию флаг отвечающий за переинициализацию (придется расширить входные параметры каждой функции, что имеет static переменные),

в теле произвести обнуление значений static переменных, и не забыть снять флаг перед завершением всего расчета.

На много проще было если бы static переменные имели какой-то параметр, задаваемый при их объявлении, отвечающий за то, будет или нет обнуляться значение этих переменных при переинициализации.

 
Renat:
Обратите внимание, что новый компилятор и новая среда исполнения в разы жестче контролируют качество кода. Много MQL4 кода было написано сторонними разработчиками спустя рукава и теперь эти огрехи будут сразу видны.
а справочник MQL4 (который в эдиторе) тоже обновился соответственно?