数组初始化问题:意外行为

时间:2015-03-05 10:58:36

标签: c++ array-initialization

以下程序完美构建。但是,在执行期间,无论我提供的degree值是多少,程序只需要2个数组元素作为输入。我想重新声明数组f[]fDash[]可能存在问题。在JAVA中,可以使用new关键字轻松重新声明数组。这在c ++中也可能吗?如果没有,有什么替代方案? 附:我正在使用CodeBlocks 13.12并且编译器设置是标准的。

#include <iostream>
#include <cmath>
using namespace std;
class Polynomial
{
    public:
        void input(void);
        void expression(void);
        void derivative(void);
        double value(double var);
        double der(double var);

    private:
        int f[];
        int fDash[];
        int degree;
};

void Polynomial::input()
{
   cout<<"Enter degree of polynomial:\t";
   cin>>degree;
   f[degree+1];
   fDash[degree];
   for(int i=0;i<=degree;i++)
   {
       cout<<"Enter coefficient of x^"<<i<<":\t";
       cin>>f[i];
   }
   for(int i=0;i<degree;i++)
   {
       fDash[i]=f[i+1]*(i+1);
   }
}
void Polynomial::expression()
{
    cout<<f[0];
    for(int i=1;i<=degree;i++)
    {
        cout<<" + "<<f[i]<<"*x^"<<i;
    }
}
void Polynomial::derivative()
{
    cout<<fDash[0];
    for(int i=1;i<degree;i++)
    {
        cout<<" + "<<fDash[i]<<"*x^"<<i;
    }
}
double Polynomial::value(double var)
{
    double val=0.0;
    for(int i=0;i<=degree;i++)
    {
        val+=f[i]*pow(var,i);
    }
    return val;
}
double Polynomial::der(double var)
{
    double val=0.0;
    for(int i=0;i<degree;i++)
    {
        val+=fDash[i]*pow(var,i);
    }
    return val;
}
int main()
{
   double lb,ub,step,var,accum=0.0,rms;
   int counter=0;

   Polynomial p;
   p.input();
   cout<<"\n\n\nPolynomial is:\nf(x) = ";
   p.expression();
   cout<<"\n\n\nDerivative is:\nf'(x) = ";
   p.derivative();
   cout<<"\n\n\nEnter x0,x1,Step:\t";
   cin>>lb;
   cin>>ub;
   cin>>step;
   cout<<"\n\n\n====================================";
   cout<<"\n\nx\t|\tf\t|\tf'\n\n\n";

   var=lb;
   while(var<=ub)
   {
        cout<<var<<"\t|\t"<<p.value(var)<<"\t|\t"<<p.der(var)<<"\n";
        accum+=pow(p.value(var),2.0);
        var+=step;
        counter++;
   }
   cout<<"\n====================================";

   accum/=counter;
   rms=sqrt(accum);
   cout<<"\nRMS energy of f(x) = "<<rms;
   return 0;
}

2 个答案:

答案 0 :(得分:2)

这不会在clang上编译,它会失败并显示“error:field has incomplete type'int []'int f [];”同样适用于fDash。

让我们看看您如何声明这些字段:

int f[];
int fDash[];

在C ++中,您可以声明具有静态定义大小的数组,如下所示:

int f[5];
int fDash[6];

如果你想要在这种情况下需要的动态数组,你必须声明

int* f;
int* fDash;

并使用

为他们分配内存
f = new int[5];

你也必须在某处释放那个记忆

delete [] f;

但要注意 - 像这样管理自己的内存很容易出错,应该避免。您应该使用std::vector代替java.util.ArrayList

std::vector<int> f;
std::vector<int> fDash;

并修改您的input功能,如下所示:

void Polynomial::input()
{
    cout<<"Enter degree of polynomial:\t";
    cin>>degree;

    int input;

    for(int i=0;i<=degree;i++)
    {
        cout<<"Enter coefficient of x^"<<i<<":\t";
        cin>>input;
        f.push_back(input);
    }
    for(int i=0;i<degree;i++)
    {
        fDash.push_back(f[i+1]*(i+1));
    }
}

答案 1 :(得分:-1)

您没有正确使用数组。如果要使用可变长度数组,则需要分配内存。如何在c ++ see thisthis中使用数组,或使用std::vector