В чем дело? - страница 3

 

Scriptong:
Приведите пример кода и пошаговую инструкцию воспроизведения. Потому как "на пальцах" ничего непонятно. Если код секретный, то оставьте в нем только то, что показывает проблему, остальное выбросьте.

А тара, вроде понял без кода. Только я что-то не понял про инпут, что они константы, а не переменные. Привожу "пошаговую инструкцию воспроизведения секретного кода". 

Запускаем.

Видим первое сообщение, которое с инициализированным i: "блабла1=0"

код изменяет значение i с 0 на 5

Видим второе сообщение, с текущим i: "блабла2=5" 

Меняем значение второй переменной, которая extern. Теперь она не блабла, а крякря.

Советник работает

Жму Ф7

Видим в свойствах Бла=блабла.  Меняем его на "опля"

 Видим первое сообщение, с почему-то неинициализированным i: "опля1=5"

Видим второе сообщение, с текущим i: "опля2=5"  

Советник работает 

 Жму Ф7

 Видим в свойствах Бла=опля. Жмем ОК.

 Видим первое сообщение, с почему-то неинициализированным i: "опля1=5"

Видим второе сообщение, с текущим i: "опля2=5"  

 

Секретный код:

#property strict

extern string Bla="blabla";

int i;

//+------------------------------------------------------------------+

//| Expert initialization function                                   |

//+------------------------------------------------------------------+

int OnInit()

  {

  MessageBox(Bla+"1 = "+ IntegerToString(i));//=0 при запуске и =5 при перезапуске по F7

  i=5;

  MessageBox(Bla+"2 = "+ IntegerToString(i));

  Bla="krja";//при перезапуске будет "blabla", как и положено

//--- create timer

   EventSetTimer(60);      

//---

   return(INIT_SUCCEEDED);

  }

//+------------------------------------------------------------------+

//| Expert deinitialization function                                 |

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

  {

//--- destroy timer

   EventKillTimer();

      

  }

//+------------------------------------------------------------------+

//| Expert tick function                                             |

//+------------------------------------------------------------------+

void OnTick()

  {

//---

   

  }

//+------------------------------------------------------------------+

//| Timer function                                                   |

//+------------------------------------------------------------------+

void OnTimer()

  {

//---

   

  }

//+------------------------------------------------------------------+


 

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

 

Распишем по шагам:

Меняем значение второй переменной, которая extern. Теперь она не блабла, а крякря.

Советник работает

 В OnInit изменено значение переменной Bla, но это не значит, что поменялось состояние поля, которое используется при вводе значения для extern-переменной Bla. Руками никто его не менял, следовательно, оно осталось неизменным.

Жму Ф7

Видим в свойствах Бла=блабла.  Меняем его на "опля"

 Видим первое сообщение, с почему-то неинициализированным i: "опля1=5"

Видим второе сообщение, с текущим i: "опля2=5"  

Советник работает 

 Если здесь претензии к значению i, то они также необоснованы, т. к. при объявлении переменной она не была инициализирована. Ее значение может быть равно чему угодно. Вполне возможно, что попадете на ситуацию, при которой будет и не 0, и не 5. 

 Жму Ф7

 Видим в свойствах Бла=опля. Жмем ОК.

 Видим первое сообщение, с почему-то неинициализированным i: "опля1=5"

Видим второе сообщение, с текущим i: "опля2=5"  

К этому моменту изменено значение поля в свойствах эксперта, отвечающего за инициализацию переменной Bla. Поэтому мы видим значение "опля", а не "blabla" и, тем более, не "krja". Со значением переменной i та же ситуация, что и описанная выше.

 Проведите инициализацию значения i при объявлении и получите всегда один и тот же гарантированный результат.

Итак, что имеем в сухом остатке:

1. Глобальные переменные при любой повторной инициализации эксперта инициализируются заново, не сохраняют свое значение. Так и должно быть.

2. Переменные типа extern или input при инициализации получают свое значение из соответствующего поля свойств эксперта. Именно это поле остается неизменным после ввода в него значения и повторной компиляции (любой переинициализации) эксперта.

 
Scriptong:


2. Переменные типа extern или input при инициализации получают свое значение из соответствующего поля свойств эксперта. Именно это поле остается неизменным после ввода в него значения и повторной компиляции (любой переинициализации) эксперта.

 

Простой и понятный тест: 

1. Объявите A extern, B input. 

2. Модифицируйте А и В.

3. Смотрите результат удачной модификации А и сообщение  об ошибке модификации В. 

Второй простой и понятный тест:

1. Устраняете причину ошибки в первом тесте, при этом изменяете значение "переменной" В по умолчанию. 

2. Перекомпилируете программу.

3. Переменная А сохраняет модифицированное значение, а "переменная" В обретает новое, Вами заданное. 

ЗЫ Не бывает переменных типа extern, равно как и "переменных" типа input. 

 
tara:

Простой и понятный тест: 

1. Объявите A extern, B input. 

2. Модифицируйте А и В.

3. Смотрите результат удачной модификации А и сообщение  об ошибке модификации В. 

Суть написанного - "знаете ли Вы о том, что один равно одному?" Да, знаю.

Второй простой и понятный тест:

1. Устраняете причину ошибки в первом тесте, при этом изменяете значение "переменной" В по умолчанию. 

По этому пункту возникает сразу два вопроса:

1. Каким именно образом устраняется причина ошибки? Однозначного пути нет - есть множество возможностей, все они приведут к разным результатам. Приведите свой путь.

2. Что имеется в виду под фразой: "при этом изменяете значение "переменной" В по умолчанию"? Попробуйте выразить мысль другими словами.

ЗЫ Не бывает переменных типа extern, равно как и "переменных" типа input. 

С этим не ко мне. Использую терминологию справочника по MQL4:

 

 

Да и цепляние к словам, когда Вы и без того все поняли, это некрасиво.

 
Scriptong:

Суть написанного - "знаете ли Вы о том, что один равно одному?" Да, знаю.

По этому пункту возникает сразу два вопроса:

1. Каким именно образом устраняется причина ошибки? Однозначного пути нет - есть множество возможностей, все они приведут к разным результатам. Приведите свой путь.

2. Что имеется в виду под фразой: "при этом изменяете значение "переменной" В по умолчанию"? Попробуйте выразить мысль другими словами.

С этим не ко мне. Использую терминологию справочника по MQL4:

 

 

Да и цепляние к словам, когда Вы и без того все поняли, это некрасиво.

Понял, знаете, что один равно одному, но возникает сразу два вопроса. Отвечаю на них: 

1. Единственный способ устранить причину ошибки модификации константы - не модифицировать константу.  имхенько, само-собою. 

2.  Значение любой переменной "по умолчанию" (default value) обычно задается при инициализации, хотя - я не программист... 

По пунктам без номера: Извините, действительно некрасиво.  

 
tara:

Понял, знаете, что один равно одному, но возникает сразу два вопроса. Отвечаю на них: 

1. Единственный способ устранить причину ошибки модификации константы - не модифицировать константу.  имхенько, само-собою. 

2.  Значение любой переменной "по умолчанию" (default value) обычно задается при инициализации, хотя - я не программист... 

И, все же, давайте на конкретном примере. А то я пока так и не понимаю, какая проблема Вами указывается.

 Итак, код советника:

extern int A = 5;
input  int B = 10;

int OnInit()
{
   //Print("Измененная версия!");
   Print("До модификации A = ", A);
   A = 15;   
   Print("После модификации A = ", A);
   Print("B = ", B);


   return(INIT_SUCCEEDED);
}

1. Прикрепляем к графику.

2. В коде переменной А присваиваем 20 и раскомментируем строку "Измененная версия".

3. Компилируем.

 

Все наши действия в журнале выглядят так: 

0       19:15:44.094    Expert TestInputParam EURUSD,H1: loaded successfully
0       19:15:45.966    TestInputParam EURUSD,H1 inputs: A=5; B=10; 
0       19:15:45.981    TestInputParam EURUSD,H1: До модификации A = 5
0       19:15:45.981    TestInputParam EURUSD,H1: После модификации A = 15
0       19:15:45.981    TestInputParam EURUSD,H1: B = 10
0       19:15:45.981    TestInputParam EURUSD,H1: initialized
0       19:15:54.608    TestInputParam EURUSD,H1: uninit reason 2
0       19:15:54.608    Expert TestInputParam EURUSD,H1: removed
0       19:15:54.608    Expert TestInputParam EURUSD,H1: loaded successfully
0       19:15:54.608    TestInputParam EURUSD,H1: Измененная версия!
0       19:15:54.608    TestInputParam EURUSD,H1: До модификации A = 5
0       19:15:54.608    TestInputParam EURUSD,H1: После модификации A = 15
0       19:15:54.608    TestInputParam EURUSD,H1: B = 10
0       19:15:54.608    TestInputParam EURUSD,H1: initialized

 Ни одна из переменных не изменила своего значения после внесения изменений:

1. Переменная А - потому что изменения были внесены не в поле редактирования свойств советника, а в код.

2. Переменная В - потому что произошла переинициализация советника, в ходе которой переменная В была инициализирована значением из поля редактирования свойств советника. 

Конечно, вряд ли, угадал именно Вашу последовательность. Но - попытка не пытка ))

Приведите свою последовательность и укажите, где именно видите проблему. 

 
Scriptong:

И, все же, давайте на конкретном примере. А то я пока так и не понимаю, какая проблема Вами указывается.

 Итак, код советника:

1. Прикрепляем к графику.

2. В коде переменной А присваиваем 20 и раскомментируем строку "Измененная версия".

3. Компилируем.

 

Все наши действия в журнале выглядят так: 

 Ни одна из переменных не изменила своего значения после внесения изменений:

1. Переменная А - потому что изменения были внесены не в поле редактирования свойств советника, а в код.

2. Переменная В - потому что произошла переинициализация советника, в ходе которой переменная В была инициализирована значением из поля редактирования свойств советника. 

Конечно, вряд ли, угадал именно Вашу последовательность. Но - попытка не пытка ))

Приведите свою последовательность и укажите, где именно видите проблему. 

Да Вы не со мною боритесь, а в суть вникайте. Не было никакой переинициализации советника, потому как он от графика не откреплялся и обратно не прикреплялся, а это - единственный критерий для переининициализации. 
 

tara:
Да Вы не со мною боритесь, а в суть вникайте. Не было никакой переинициализации советника, потому как он от графика не откреплялся и обратно не прикреплялся, а это - единственный критерий для переининициализации. 

 

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

#property strict

extern string Bla="blabla";

int i;//вот здесь пауза

//+------------------------------------------------------------------+

//| Expert initialization function                                   |

//+------------------------------------------------------------------+

int OnInit()

...

 

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

Запускаюсь из дебаггера по Ф5. Советник останавливается в строке с инициализацией i. Т.е. инициализация  при запуске, конечно, есть. Жму еще раз Ф5.

Советник работает. На графике советника перезапускаю его по Ф7. Видим окно свойств с параметрами, жмем ОК, код так же как и при запуске ДОХОДИТ до строки инициализации   i, там остановка. Т.е. строка кода инициализации отработала. Жму Ф5, советник продолжает работать, но инициализация, как Вы и обещали, не состоялась. Почему? ведь строка отработала!

 

 

tara:
Да Вы не со мною боритесь, а в суть вникайте.

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

А в суть проблемы я вникаю. Но с Вашей стороны она, к сожалению, так и не была озвучена. 

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

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

evnt:

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

Запускаюсь из дебаггера по Ф5. Советник останавливается в строке с инициализацией i. Т.е. инициализация  при запуске, конечно, есть. Жму еще раз Ф5.

Советник работает. На графике советника перезапускаю его по Ф7. Видим окно свойств с параметрами, жмем ОК, код так же как и при запуске ДОХОДИТ до строки инициализации   i, там остановка. Т.е. строка кода инициализации отработала. Жму Ф5, советник продолжает работать, но инициализация, как Вы и обещали, не состоялась. Почему? ведь строка отработала!

Потому что в описанном Вами случае F5 является запуском продолжения выполнения, а не началом очередной отладки. Вы к этому моменту не завершили предыдущий процесс отладки. Завершите его и запустите заново - получите инициализацию.
Причина обращения: