我正在尝试解决复杂微分方程系统。我想用高斯值函数填充复数向量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));
}
答案 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)
对于第二个项目,您将按值传递矢量,这意味着该参数是临时的,并且一旦函数返回就会消失。