Ошибки, баги, вопросы - страница 312

 
Academic:

Этого предупреждения не должно даваться, так как в функцию ObjectGetDouble передается ссылка и в операторе if проверяется истинность возвращаемых обоими вызовами, и следовательно только если обе функции вернули истину то производится работа с этими переменными, а значит обе эти переменные не могут быть не установлены в корректное значение.


Компилятор не настолько расширяет свое сознание, чтобы быть уверенным, что в результате выполнения вызова ObjectGetDouble эти переменные обязательно будут инициализированы. Попробуйте вместо нее написать свою, где явным образом будет задаваться значение для входного параметра, переданного по ссылке. Что скажет компилятор?
 
Rosh:
Компилятор не настолько расширяет свое сознание, чтобы быть уверенным, что в результате выполнения вызова ObjectGetDouble эти переменные обязательно будут инициализированы. Попробуйте вместо нее написать свою, где явным образом будет задаваться значение для входного параметра, переданного по ссылке. Что скажет компилятор?


Рашид, это на самом деле совсем "не сознание",  это математика.

 
Academic:


Рашид, это на самом деле совсем "не сознание",  это математика.

 

1. Есть такое понятие "укороченная оценка логических выражений"

2. Компилятор не может точно знать, будет ли заполнена переменная, переданная по ссылке.

3. Предупреждение на то и предупреждение, чтобы обратить ваше внимание на возможность появления проблемы. 

Документация по MQL5: Основы языка / Типы данных / Целые типы / Тип bool
Документация по MQL5: Основы языка / Типы данных / Целые типы / Тип bool
  • www.mql5.com
Основы языка / Типы данных / Целые типы / Тип bool - Документация по MQL5
 
Academic:


Рашид, это на самом деле совсем "не сознание",  это математика.

Ok, давайте определим такую фурнкцию

bool AlwaysGood( double & param)
  {
   return true;
  }
Есть тут гарантия, что переменная param будет проинициализирована?
 
Rosh:

Ok, давайте определим такую фурнкцию

Есть тут гарантия, что переменная param будет проинициализирована?

Это функция в которой результат "param" ТОЧНО НЕ меняется. Так что тут предупреждение должно выдаваться 1000% :)

Суть стандартного решения  тут такая - если есть ветка выполнения кода где значение может быть не изменено, то считается что эта функция не меняет значение. И выдавать предупреждение.

Рашид, хотите я возьму любой из современных компиляторов С++ и С и откомпилирую подобный код, и я уверен что ни один не выдаст левого предупреждения. 

Это явная не доработка, тем более если есть такие "проблемы" с детектированием таких вещей то вкрадывается БОЛЬШОЕ сомнение о том что оптимизации как таковой вообще нет. Или есть?

 
Academic:

Рашид, хотите я возьму любой из современных компиляторов С++ и С и откомпилирую подобный код, и я уверен что ни один не выдаст левого предупреждения. 

Об чём спорим? w0 не ставить

PS Сообщение обязательно будет (возможно несколькими строчками ниже) 

 
Academic:

Это явная не доработка, тем более если есть такие "проблемы" с детектированием таких вещей то вкрадывается БОЛЬШОЕ сомнение о том что оптимизации как таковой вообще нет. Или есть?

Функция ObjectGetDouble неподконтрольна компилятору, так как имеет независимую (то есть библиотечную) реализацию
Документация по MQL5: Графические объекты / ObjectGetDouble
Документация по MQL5: Графические объекты / ObjectGetDouble
  • www.mql5.com
Графические объекты / ObjectGetDouble - Документация по MQL5
 
Academic:


Если посмотреть справку на ObjectGetDouble:


Возвращает true или false в зависимости от успешности выполнения функции.  В случае успеха значение свойства помещается в приемную переменную, передаваемую по ссылке последним параметром.


Отсюда делаем вывод, что заполнение приемной переменной не гарантируется в случае той или иной ошибки. Поэтому сообщение компилятора правомерно.

ИМХО.

 

Что то все рассинхронизировалось в последнем билде. 

Делаю маленький советник:

int OnInit()
  {
   Print("Все нормально!"); 
   return(0);
  }

 Запускаю тестер,

 2011.02.22 11:54:21 Core 1 2011.02.07 00:00:00   Все нормально!

Вношу изменения в советник:

int OnInit()
  {
   Print("Тестер, Аууу, ты где?"); 
   return(0);
  }

 Компилирую, запускаю тестер - он отвечает:

 2011.02.22 11:57:55 Core 1 2011.02.07 00:00:00   Все нормально!

Помогает только перезагрузка терминала.  

 
Serj_Che:

Что то все рассинхронизировалось в последнем билде. 

Делаю маленький советник:

 Запускаю тестер,

 2011.02.22 11:54:21 Core 1 2011.02.07 00:00:00   Все нормально!

Вношу изменения в советник:

 Компилирую, запускаю тестер - он отвечает:

 2011.02.22 11:57:55 Core 1 2011.02.07 00:00:00   Все нормально!

Помогает только перезагрузка терминала.  

Извините. Сегодня-завтра будет выпущен новый билд без этой досадной ошибки.
Причина обращения: