初始化复杂的<double>数组</double>

时间:2015-04-18 17:25:03

标签: c++ c++11 complex-numbers differential-equations runge-kutta

我正在尝试解决复杂微分方程系统。我想用高斯值函数填充复数向量xi [n]。 但是,当我检查输出文件时,它给了我很多零。我使用cin函数给出了输入值,它起作用了......这段代码中的问题是什么?

using namespace std;       

int main()
{
  int  n;
  int tmax;
  int tt = 5000;                   // number of first-order equations 
  double ti, tf, dt, sigma,mu,z,q,N ;
  complex<double> xi[n], xf[n], eta[tt];
  double  j;
  int i, y,d;
  int m=0;

  ofstream file;
  file.open ("provavet11(om100(2g))).dat"); 

  printf("Number of equations\n");
  scanf("%d", &n);
  printf("Particles in central cav.\n");
  scanf("%d", &N);
  printf("Sigma\n");
  scanf("%d", &q);
  /* initial information */

  ti = 0.0;            
  // initial value for variable t
  for(y=0; y<=n-1; y++)
  {
    //scanf("%f\n", xi[y]);
    //cin >> xi[2*y]
    //   }
    xi[y]=  N*exp(-pow((y-(n-1)/2.),2)/(2*q*q));        
  }

1 个答案:

答案 0 :(得分:0)

您的代码存在多种问题。

首先,您在初始化之前使用n。它可能是0,10,323432,-234,谁知道。

int  n;   
complex<double> xi[n], xf[n], eta[tt];  // <-- n is not initialized

其次,即使n被初始化,使用变量作为条目数声明数组也不合法C ++。在C ++中,一个&#34;变化的数组&#34;是通过使用std::vector完成的。

#include <vector>

int main()
{
    int  n;   
    int tmax;
    int tt = 5000;                   // number of first-order equations 
    double ti, tf, dt, sigma,mu,z,q,N ;
    std::vector<complex<double>> xi, xf, eta(tt);
    //...
    // Once `n` is read in and initialized:
    xi.resize(n);
    xf.resize(n);
    //...
}

第三个问题是,无论您是否使用std::vector,都注释掉了肯定无法正常运行的代码:

  for(y=0; y<=n-1; y++)
  {
    //scanf("%f\n", xi[y]);
    //cin >> xi[2*y]  // way out of bounds!

假设您想要使用您注释掉的代码,2*y超过n / 2时y的值超出了xi数组(或向量)的范围。这是一个内存覆盖。您需要确保xi足以容纳所有条目。

编辑:

根据您在此处发布的代码:http://ideone.com/Eckq3Z

你应该做两件事:

1)将矢量中的呼叫从reserve()更改为resize()

2)在dnx函数中,通过引用传递vector,而不是按值传递:

complex<double> dnx(double t, vector<complex<double> >& x, vector<complex<double> >& dx, int n)

对于第二个项目,您将按值传递矢量,这意味着该参数是临时的,并且一旦函数返回就会消失。