2016-03-30 9 views
-4

私はしきい値を持つ数学的操作の束を持っていますが、何を変更しても、ifステートメントは常にtrueを返します。コンパイルエラーはなく、デバッガを動作させることはできません。これは関数であり、X YとZの配列はすべて正しい(私はそれらを先にチェックするために印刷した)。数学は少なくともブレード距離チェックのためには正しいが、それでも常に真を返す。私は同じコードを(明らかに書き直された)matlabを使って実行し、私のデータに応じて真または偽を返します。これをスリム化する方法もありますか?C++ ifステートメントは常にtrueを返します

bool Device::_SafeD(char _Type, float _Data[20][3]) { 
    bool S; 
    double x[20], y[20], z[20]; 
    for (int i=0; i<20; i++) { 
     x[i] = _Data[i][0]; 
     y[i] = _Data[i][1]; 
     z[i] = _Data[i][2]; 
    } 

    // Check angles for needle 
    if (_Type == 'n') { 
     for (int i=0; i<20; i++) { 
      float dot, moda, modb, c, angle; 
      dot = ((x[i]*x[i+1]) + (y[i]*y[i+1]) + (z[i]*z[i+1])); 
      moda = sqrt(pow(x[i],2)+pow(y[i],2)+pow(z[i],2)); 
      modb = sqrt(pow(x[i+1],2)+(y[i+1],2)+(z[i+1],2)); 
      c = dot/(moda*modb); 
      angle = acos(c); 

      if (angle > 45){ 
       S = 0; 
      } else { 
       S = 1; 
      } 
     } 
    } 

    // Check distance for blade 
    if (_Type == 'b'){ 
     for (int i=0; i<19; i++) { 
      float distance = (x[i+1]-x[i]) + (y[i+1]-y[i]) + (z[i+1]-z[i]); 
      cout << "distance " << distance << endl; 

      if (distance > 5.0) { 
       S = 0; 
      } else { 
       S = 1; 
      } 
     } 
    } 
    if (S == 0) { 
     return 0; 
    } 
    if(S == 1) { 
     return 1; 
    } 
} 

乾杯

+7

おそらく問題ではありませんが、アンダースコアで始まり、 '_Type'のような大文字の名前は実装用に予約されているので、使用しないでください。 – NathanOliver

+6

'acos()'は一般的に[ - pi、pi]の範囲の値を返します。あなたのコードが示唆しているように45を超えるとは思わないでしょう。 – Logicrat

+0

@NathanOliver私は、そのようなクラス属性を宣言するように教えられました。認可された関数ではないはずですが、それが動作するまで私はそれを変更する必要があります... –

答えて

0

最も可能性の高いエラーがacosの戻り値はラジアンであるときは、度の角度にangleを比較しているということです。

 if (angle > 45){ 

角度を45度に変換する前に角度を度に変換してください。これは問題ありません。

double radians_to_degrees(double in) 
{ 
    return (in*180/M_PI); 
} 

 if (radians_to_degrees(angle) > 45){ 

別のオプションラジアンで45度の等価を計算しangleとそれを比較することです。

double const radian_45 = M_PI*45.0/180; 

及び他のエラーが@Bob__によってコメントで明確に綴られる

 if (angle > radian_45){ 

を使用:

OPは、それらの内部に、角度及び距離を確認するために2つのループを使用してループ(S)は0または1に設定されていますが、配列内のすべてのインデックスに対して行われるため、上書きされます。関数全体(指定されたコード内)の戻り値は、配列の最後の2つの要素によってのみ決まります。

+3

変換のために関数を呼び出すのではなく、ラジアン定数を45度使用することをお勧めします。定数は '45.0 * 180/M_PI'と宣言できます。 –

+0

であり、 'angle> 45'または 'distance> 5' –

+0

@Bob__の場合は、ループから' S = 0; 'がセットされていません。詳しく教える? –

関連する問題