Build 220: Афигительно интересная ошибка!

 

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

Суть её в следующем коде:

//+------------------------------------------------------------------+
//|                                                   Global_Bag.mq4 |
//|                      Copyright © 2008, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

int per1 = 0;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   for(int x = 0; x <= 100; x += 1){
      per1++;
   }   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   Comment(per1);
//----
   return(0);
  }
//+------------------------------------------------------------------+

Если переключаться с таймфрейма на таймфрейм, получается такая лабуда, уххххх. В большой программе о корректность её работы вообще не гарантируется.



Учить как исправить этот баг меня не нужно, догадливый я, но разве должно быть так?

 
И где ошибка?
 

Уже обсуждалось. По-моему, даже в книге Сергея Ковалёва про такое поведение написано.

Это - не ошибка, а так задумано. Чтобы эксперт "не рождался каждый раз заново" при переинициализации.

Избежать можно запросто - инициализировать переменную в функции init.

 

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

Но такой ньюанс стоит осветить поглубже, не все читали учебник. Я лично нарвался на такие грабли случайно.

 

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

Если описывать все нюансы, то получится книга поболее учебника Сергея Ковалёва. Чем толще книга, тем меньше у неё читателей

 
stringo >>:

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

Если описывать все нюансы, то получится книга поболее учебника Сергея Ковалёва. Чем толще книга, тем меньше у неё читателей

Чем меньше Вы нам рассказали, тем больше мы слили денег. Парадокс.

 
HIDDEN писал(а) >>

Чем меньше Вы нам рассказали, тем больше мы слили денег. Парадокс.

Мы очень много рассказываем. Как много статей на нашем сайте Вы прочитали? А учебник Сергея Вы читали? А я, между прочим, принимал непосредственное участие в редактировании материала. Зря что ли?

 
HIDDEN >>:

Чем меньше Вы нам рассказали, тем больше мы слили денег. Парадокс.

Неинициализация глобальных переменных - это ошибка программиста. Init как раз и предназначен для инициализации.

 

Это великое преимущество экспертов перед индикаторами.

Сохранение глобальных переменных и массивов при переинициализации очень полезное качество.

 
HIDDEN писал(а) >>

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

Но такой ньюанс стоит осветить поглубже, не все читали учебник. Я лично нарвался на такие грабли случайно.

По моим грубым подсчётам MQL4 содержит около 220 стандартных функций. При создании учебника не ставилась задача разобрать по косточкам их все. Представьте какого размера был бы учебник, если бы в него включить весь материал с картинками и примерами. Учебник ориентирован на широкого читателя, не имеющего никакой программистской практики, и сосавил ок. 350 стр. В таком подходе нет ничего нового. Например, в области математики известен замечательный 3-томник Фихтенгольца общим объёмом ок. 1300 стр для математиков и 2-томник Пискунова объёмом ок. 500 стр для ВТУЗов. В математике также есть множество всевозможных прикладных материалов - профильных справочников. В MQL такую роль играет справка в МЕ.

Посмотрите в справке функцию UninitializeReason().

 

Можно вопрос, а сохранение значений также распостряняется и на статические переменные?

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