C++ 函数因调试行而工作

C++ 函数因调试行而工作,c++,function,debugging,cout,C++,Function,Debugging,Cout,我在寻找调和数,函数循环,直到找到正确的调和数,只要我用来调试程序的那一行是输入,它就是 最后一行。如果我删除cout的任何部分,程序就会再次失败。我完全不知道议会是如何影响这个计划的。没有它,一切都存储零 struct fraction { long nume, denom; }; void add (fraction x, fraction y, fraction& result) { long Numerator, Denominator, GCD, Higher, Lo

我在寻找调和数,函数循环,直到找到正确的调和数,只要我用来调试程序的那一行是输入,它就是 最后一行。如果我删除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;
结构分数
{
长努姆,德南;
};
添加空隙(分数x、分数y、分数和结果)
{
长分子、分母、GCD、较高、较低;
分子=(x.nume*y.denom+x.denom*y.nume);
分母=(x.denom*y.denom);
if(分子>分母)
{
下限=分母;
较高=分子;
}
else if(分子<分母)
{
较高=分母;
下限=分子;
}
而(较高百分比较低>0)
{                                                                              
GCD=较高%较低;
高=低;
较低=GCD;
}
result.nume=分子/GCD;
result.denom=分母/GCD;

cout您没有“较高”和“较低”的默认值,因此当这两个条件都不成立时,将出现未定义的行为:

if (Numerator > Denominator)
。。。 else if(分子<分母)

我建议您打开编译器警告,以便报告此类错误。如果您使用GCC/Clang,请打开“-Wall”


当你使用调试器时,这应该是一个很容易理解的问题。

所以我把上下两个都改为等于0,得到了一个浮点异常,然后我尝试了1和同样的事情。然后我把分子改为分母,得到了一个浮点异常。你可能应该充实你原来的帖子,然后形成一个a,否则这就是错误将变成20个问题。另外,您使用的是哪个调试器?您是对的,我还必须将GCD设置为等于1。感谢您的帮助。不用担心-我建议您将基于GCD减少分数的代码拆分为它自己的函数reduce,并从简化版的“add”调用它。