エラー、バグ、質問 - ページ 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

続けてコメントすれば問題ないです。変だと思うのは私だけでしょうか?

 
traveller00:

そんなアドバイザーがいるんですね。エラーを投げます

続けてコメントすれば問題ないです。おかしいと思うのは私だけでしょうか?

関数が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を削除しても正常にビルドされるのはなぜでしょうか?

コンパイラは、ループが処理され、コードがリターンに到達するかどうか分からないので、安全機能を必要とします。

 
Alexey Viktorov:

コンパイラは、ループが処理されるかどうか、コードの実行がリターンに到達するかどうかを知らない。そのため、安全対策が必要なのだ。

C/C++コンパイラは、このことを完全に理解している。MQLコンパイラは、私の理解では、C/C++コンパイラの1つをベースにしているようです。しかし、それにしても、仮に独自のロジックを持っているとしても、なぜcontinueがなければわからないのに、continueがあればその知識がなくなるのでしょうか?

 
traveller00:

C/C++コンパイラは、このことを完全に理解している。MQLコンパイラは、私の理解では、C/C++コンパイラの1つをベースにしているようです。しかし、それにしても、仮に独自のロジックを持っているとしても、なぜcontinueがなければわからないのに、continueがあればその知識がなくなるのでしょうか?

おそらく、このようなコードを見るのは一見さんだけなので

bool Func()
{
  for(int i=1;;++i)
  {
    if(i==100)
      continue;
    if(i==100)
      return false;
  }
}
は、何も考えずに何が起こるかわかる。私見では、文句はMQLではなくCやC++に言うべきでしょう。そんなうっかりミスを防いでくれるのがmqlなのです。
削除済み  
traveller00:

関数で、値を返す

この機能から抜け出すには、これしかない。つまり、値を返す必要があるのは、ここだけなのです。そして、C/C++コンパイラも私に同意している。 この点、MQLがまだ独自の基準を持っているのであれば、なぜcontinueを外すと正常にビルドされるのでしょうか?

あなたのこの機能はバグです。i==100の場合、次の同じi==100のチェックは機能しません。そして、無限ループに陥ります。

削除済み  
開発者の皆様、誤りの ご指摘をお願いします。
Обсуждение статьи "Торговый эксперт с графическим интерфейсом: Наполнение функционалом (Часть II)"
Обсуждение статьи "Торговый эксперт с графическим интерфейсом: Наполнение функционалом (Часть II)"
  • 2018.06.10
  • www.mql5.com
Опубликована статья Торговый эксперт с графическим интерфейсом: Наполнение функционалом (Часть II): Автор: Anatoli Kazharski...