我正在做一个关于多项式的赋值。其中一项任务是计算两个多项式的和,并以新的多项式返回结果。但当我运行程序时,程序自行终止。当我试图测试哪一部分是错误的时,创建动态数组的行似乎是错误的。我不明白为什么,请帮忙。
这是头文件。
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文件。主要的问题是加(const多项式&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,例如,对于多项式"3*x^5+2*x^3-x^2+7",其阶数为5,系数数组为{7.0,0.0,-1.0,2.0,0.0,3.0}
崩溃是而不是在您指示的行中。
当您通过具有足够高警告级别的编译器运行此代码时,您可能会看到如下消息:
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
未初始化,因为来自上述for
循环的j
是不相关的变量,与外部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++;
}
当然,代码真正的大问题是不使用std::vector
。