-2

我正在尝试解决一个复杂的微分方程系统。我想用高斯值函数填充复数向量 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));        
  }
4

1 回答 1

0

您的代码有很多问题。

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

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

其次,即使n已初始化,使用变量作为条目数来声明数组也是不合法的 C++。在 C++ 中,“可变数组”是通过使用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*yy超过 n/2 时的值远远超出了您的xi数组(或向量)的范围。这是内存覆盖。您需要确保它xi足够大以容纳所有条目。

编辑:

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

你应该做两件事:

1) 将向量中的调用从 更改reserve()resize()

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

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

对于第二项,您通过值传递向量,这意味着参数是临时的,并且会在函数返回后立即消失。

于 2015-04-18T17:47:47.727 回答