我正在研究关于多项式的任务。其中一项任务是计算两个多项式的和,并将结果返回到新的多项式中。但是当我运行程序时,程序终止了。当我试图测试哪个部分是错误的时,似乎创建动态数组的行是错误的。我不明白为什么,请帮忙。
这是头文件。
class polynomial
{
private:
double* coefficient;
int degree;
public:
// CONSTRUCTOR member functions
polynomial(void);
polynomial(int degree, const double* coeff);
polynomial(const polynomial& p);
//DESTRUCTOR member function
~polynomial(void);
//ACCESSOR member functions
void print(void) const;
polynomial add(const polynomial& p) const;
double evaluate(double x) const;
//MUTATOR member functions
void scale(int scale);
};
这是关于构造函数的cpp文件。
polynomial::polynomial(void)
{
degree = 0;
coefficient = new double [degree+1];
coefficient[0] = 0;
}
polynomial::polynomial(const polynomial& p)
{
coefficient = new double [p.degree+1];
for (int i = 0; i < p.degree+1; i++)
coefficient[i] = p.coefficient[i];
degree = p.degree;
}
polynomial::polynomial(int degree, const double* coeff)
{
coefficient = new double [degree+1];
for (int i = 0; i < degree+1; i++)
coefficient[i] = coeff[i];
polynomial::degree = degree;
}
这是cpp文件。主要问题是add(const polynomial&amp; p)const部分。其他人只是为了更好地理解该计划。
polynomial polynomial::add(const polynomial& p) const
{
int degree_diff;
if (degree >= p.degree)
{
int i;
degree_diff = degree - p.degree;
polynomial result; // The program terminates here.
result.coefficient = new double[degree+1];
for (i = 0; i < p.degree+1; i++)
result.coefficient[i] = coefficient[i] + p.coefficient[i];
while (degree_diff != 0)
{
result.coefficient[i] = coefficient[i];
degree_diff--;
i++;
}
result.degree = degree;
return result;
}
else // The case when (degree < p.degree)
{
int j;
degree_diff = p.degree - degree;
polynomial result;
result.coefficient = new double[p.degree+1];
for (int j = 0; j < degree+1; j++)
result.coefficient[j] = coefficient[j] + p.coefficient[j];
while (degree_diff != 0)
{
result.coefficient[j] = p.coefficient[j];
degree_diff--;
j++;
}
result.degree = p.degree;
return result;
}
}
我无法找出程序崩溃的原因。请帮忙。 Fyi,Eg,对于多项式“3 * x ^ 5 + 2 * x ^ 3 -x ^ 2 + 7”,其度数为5,系数数组为{7.0,0.0,-1.0,2.0,0.0,3.0} < / p>
答案 0 :(得分:0)
您所指示的行中的不是。
当您通过具有足够高警告级别的编译器运行此代码时,您可能会看到如下消息:
i_am = Silly()
i_am.silly = 'No, I'm clever'
print i_am.silly
它将指向以下行:
warning C4700: uninitialized local variable 'j' used
int j;
degree_diff = p.degree - degree;
polynomial result;
result.coefficient = new double[p.degree+1];
for (int j = 0; j < degree+1; j++)
result.coefficient[j] = coefficient[j] + p.coefficient[j];
while (degree_diff != 0)
{
result.coefficient[j] = p.coefficient[j]; // <----- WARNING
degree_diff--;
j++;
}
未初始化,因为上面j
循环中的j
是一个不相关的变量,与外部for
无关。外j
未被初始化。当您尝试使用它作为数组索引读取变量时,这会导致未定义的行为。崩溃只是未定义行为的一种可能结果; 任何都可以发生。
所以你应该初始化j
:
j
或者您在两个循环中使用相同的int j = 0; // <----- INITIALISED
degree_diff = p.degree - degree;
polynomial result;
result.coefficient = new double[p.degree+1];
for (int j = 0; j < degree+1; j++)
result.coefficient[j] = coefficient[j] + p.coefficient[j];
while (degree_diff != 0)
{
result.coefficient[j] = p.coefficient[j];
degree_diff--;
j++;
}
:
j
当然,您的代码真正的大问题是您不使用int j = 0; // still a good idea
degree_diff = p.degree - degree;
polynomial result;
result.coefficient = new double[p.degree+1];
for (j = 0; j < degree+1; j++) // <----- same j
result.coefficient[j] = coefficient[j] + p.coefficient[j];
while (degree_diff != 0)
{
result.coefficient[j] = p.coefficient[j];
degree_diff--;
j++;
}
。