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

 
bool Func()
{
  for(int i=1;;++i)
  {
    if(i==1)
      continue;
    if(i==100)
      return false;
  }
}

void OnStart()
{
  Func();
}

Есть такой советник. Выкидывает ошибку

'}' - not all control paths return a value      Test.mq5        10      1

Если закомментировать continue, будет нормально. Мне одному кажется это странным?

 
traveller00:

Есть такой советник. Выкидывает ошибку

Если закомментировать continue, будет нормально. Мне одному кажется это странным?

Если функция объявлена не как void, то обязана возвращать значение:

bool Func()
{
  for(int i=1;;++i)
  {
    if(i==1)
      continue;
    if(i==100)
      return false;
  }
  //---
  return(false);
}
 
Из этой функции единственный выход через i==100. Почему он считает, что появление continue приводит к появлению дополнительного выхода из функции?
 
traveller00:
Из этой функции единственный выход через i==100. Почему он считает, что появление continue приводит к появлению дополнительного выхода из функции?

Единственный или множественный выход - это всё не важно. Важно то, что ВЫ объявили функцию с типом отличным ОТ void - а значит функция ОБЯЗАНА возвращать значение.

 

Функция и возвращает значение

bool Func()
{
  for(int i=1;;++i)
  {
    if(i==1)
      continue;
    if(i==100)
      return false;
  }
}

Это единственный выход из функции. Т.е. единственное место, где она обязана вернуть значение. И компилятор C/C++ со мной согласен. Если всё же в MQL свои стандарты на этот счёт, почему оно нормально собирается, если убрать continue?

 
traveller00:

Функция и возвращает значение

Это единственный выход из функции. Т.е. единственное место, где она обязана вернуть значение. И компилятор C/C++ со мной согласен. Если всё же в MQL свои стандарты на этот счёт, почему оно нормально собирается, если убрать continue?

Компилятор не знает будет-ли обработан цикл и дойдёт-ли выполнение кода до return; Потому и требует подстраховки.

 
Alexey Viktorov:

Компилятор не знает будет-ли обработан цикл и дойдёт-ли выполнение кода до return; Потому и требует подстраховки.

Компилятор C/C++ это прекрасно знает. Компилятор MQL построен на основе одного из компиляторов C/C++, как я понимаю. Но, опять же, даже если логика и своя, почему без continue он знает, а с continue это знание пропадает?

 
traveller00:

Компилятор C/C++ это прекрасно знает. Компилятор MQL построен на основе одного из компиляторов C/C++, как я понимаю. Но, опять же, даже если логика и своя, почему без continue он знает, а с continue это знание пропадает?

Наверное потому, что только человек с первого взгляда на такой код

bool Func()
{
  for(int i=1;;++i)
  {
    if(i==100)
      continue;
    if(i==100)
      return false;
  }
}
не задумываясь может понять что произойдёт. На мой взгляд претензии должны быть к С и С++, а не к MQL. Именно mql защищает от таких случайных косяков.
 
traveller00:

Функция и возвращает значение

Это единственный выход из функции. Т.е. единственное место, где она обязана вернуть значение. И компилятор C/C++ со мной согласен. Если всё же в MQL свои стандарты на этот счёт, почему оно нормально собирается, если убрать continue?

Эта Ваша функция - косяк. Если i==100, то уже следующая проверка на то же i==100 не сработает. И получится бесконечный цикл.

 
Уважаемые разработчики, обратите пожалуйста внимание на ошибку.
Обсуждение статьи "Торговый эксперт с графическим интерфейсом: Наполнение функционалом (Часть II)"
Обсуждение статьи "Торговый эксперт с графическим интерфейсом: Наполнение функционалом (Часть II)"
  • 2018.06.10
  • www.mql5.com
Опубликована статья Торговый эксперт с графическим интерфейсом: Наполнение функционалом (Часть II): Автор: Anatoli Kazharski...