2016-06-27 10 views
-1

私は幾何学的形状に基づいて線、長方形、円を使って衝突チェック関数を作成しています。if-elseブロック "制御が空でない関数の終わりに達しました"警告

bool check_collision(jLine L1, jLine L2, double singular_threshold=1e-6){ 
    /*Variable definitions omitted for brevity*/ 

    if (parallel){ 
     return false; 
    } 
    else if (infinite){ 
     return true; 
    } 
    else{ 
     jVector t; 
     t = M.inverse()*(s2 - s1); 
     double t1 = t.get_x(), t2 = t.get_y(); 

     on1 = (0. <= t1) and (t1 <= 1.); 
     on2 = (0. <= t2) and (t2 <= 1.); 

     if (seg1){ 
      if (not on1){ 
       return false; 
      } 
      else if (seg2){ 
       if (not on2){ 
        return false; 
       } 
       else{ 
        return true; 
       } 
      } 
     } 
     else{ 
      if (on2){ 
       return true; 
      } 
      else{ 
       return false; 
      } 
     } 
    } 
} 

すべての変数と型は正しく定義されており問題はありません。しかし、このコードをコンパイルすると、 "制御が非空白関数の終わりに達する"という警告が与えられます。この警告は、if-elseツリーにreturnステートメントがないブランチが含まれていることを示しています。しかし、私が知る限り、すべての支店はboolタイプのオブジェクトの返却で終わります。何か不足していますか?

機能の最後にreturn true;を追加すると警告が削除されますが、これは必要ないはずです。私はまた、この警告は、if-elseチェーンが使用されるたびに発生すると仮定しました。私は完全に構成され、他の機能でこれを論破場合、elifの - 他のチェーン:

bool check_collision(jRect R1, jRect R2){ 
    if (R2.left() > R1.right()){ 
     return false; 
    } 
    else if (R2.right() < R1.left()){ 
     return false; 
    } 
    else if (R2.top() > R1.bottom()){ 
     return false; 
    } 
    else if (R2.bottom() < R1.top()){ 
     return false; 
    } 
    else{ 
     return true; 
    } 
} 

この関数がコンパイルされたときに警告が発生しません。誰かが私が行方不明になっていることについて何らかの光を当てることはできますかどんな助けでも大歓迎です。

+2

"私が知る限り、すべての支店はブールの復帰で終わる" - 間違っている。 'else'の場合は何も返されません。これは' return'ステートメントにはなりません: 'if(seg1){if(not1){else} if(seg2){{}}}' (提供されていません)。 –

+1

@JamesAdkison:こんにちは。これは、コメントを批評し、明確にするためのコメントセクションです。あなたはこのコメントの下にある回答セクションに答えを投稿することを歓迎します。 Stack Exchangeでは、Q&Aモデルがあります。質疑応答は投票、審査、共同編集で行うことができます。コメントはできないので、回答を与えるのには適切ではありません。ありがとう! –

+0

@LightnessRacesinOrbit私は答えのセクションを知っていて、私はあなたの意見をアップしました。私が答えに対してコメントを残した理由は、自分の意見だけでは答えが十分に完成していないと思っていて、それ以上の精緻化のような気がしなかったからです。しかし、私はまだOPを正しい方向に向けることを望んでいました。 –

答えて

3

私が知る限り、すべてのブランチはブール型オブジェクトの復帰で終了します。何か不足していますか?

コードのこのセクションでは

 if (not on1){ 
      return false; 
     } 
     else if (seg2){ 
      if (not on2){ 
       return false; 
      } 
      else{ 
       return true; 
      } 
     } 

、あなたのifelse ifが、何のelseを持っていません。 elseが "トリガされた"場合、関数はreturnステートメントを実行する前にコードが不足しています。

コンパイラは、on1 && !seg2を処理するコードを記述していないことを警告しています。この状態が不可能な場合は、seg2を見ることができないため、言うことはできません。しかし、より多くのポイントには、コンパイラはいずれかを言うことができません。

+0

ありがとう、非常に感謝します。あなたとジェームズ・アドキンソンは私が見逃した部分を見つけました。 – Johan

関連する問題