0

私は高調波数を見つけています。関数は、プログラムのデバッグに使用していた行が最後の cout 行である入力である限り、正しい高調波数を見つけるまで循環します。cout の一部を削除すると、プログラムが再び失敗し始めます。cout がプログラムにどのように影響しているかについて、私は完全に途方に暮れています。それがなければ、すべてがゼロを格納します。

struct fraction
{
  long nume, denom;
};

void add (fraction x, fraction y, fraction& result)
{
  long Numerator, Denominator, GCD, Higher, Lower;
  Numerator = (x.nume * y.denom + x.denom * y.nume);                                                                                       
  Denominator = (x.denom * y.denom);  

if (Numerator > Denominator)
  {
    Lower = Denominator;
    Higher = Numerator;
  }
else if (Numerator < Denominator)
  {
    Higher = Denominator;
    Lower = Numerator;
  }

while (Higher % Lower > 0)
  {                                                                              
    GCD = Higher % Lower;                                                                                                  
    Higher = Lower;                                                                                                 
    Lower = GCD;
  }

result.nume = Numerator/GCD;
result.denom = Denominator/GCD;
cout << "d " << result.nume << "   " << GCD << "   " << Denominator/GCD << " " << result.denom << endl;

}

4

1 に答える 1

0

Higher と Lower のデフォルト値がないため、次の 2 つの条件のいずれにも当てはまらない場合、未定義の動作が発生します。

if (Numerator > Denominator)

... else if (分子 < 分母)

このようなエラーが報告されるように、コンパイラの警告を大きくすることをお勧めします。GCC/Clang を使用している場合は、「-Wall」をオンにします。

これは、デバッガーでステップスルーするときに簡単にキャッチできるはずです。

于 2013-09-05T05:33:51.063 に答える