检测到堆栈崩溃C++;。求解拉普拉斯方程 我用C++求解Laplace方程。我在解P,压强场。在我的代码中,你可以在下面看到,P是x和y的函数。我将其声明为长度为nx和ny的2d数组
我得到的最终矩阵结果p是正确的。然而,当我尝试使用“printf”打印这个矩阵P时,尽管数字是完美的,但我得到了如下错误:检测到堆栈崩溃C++;。求解拉普拉斯方程 我用C++求解Laplace方程。我在解P,压强场。在我的代码中,你可以在下面看到,P是x和y的函数。我将其声明为长度为nx和ny的2d数组,c++,logic,stack-smash,C++,Logic,Stack Smash,我得到的最终矩阵结果p是正确的。然而,当我尝试使用“printf”打印这个矩阵P时,尽管数字是完美的,但我得到了如下错误: *** stack smashing detected *** /bin/bash: line 1: 11738 Aborted 以下是我的节目: #include <cmath> #include <stdio.h> const int nx = 5; // number of elements in x-direction const in
*** stack smashing detected ***
/bin/bash: line 1: 11738 Aborted
以下是我的节目:
#include <cmath>
#include <stdio.h>
const int nx = 5; // number of elements in x-direction
const int ny = 5; // number of elements in x-direction
const int niter = 100; //# of iterations
int main(){
double dx = 2/double((nx-1));
double dy = 1/double((ny-1));
int xmax = 2; int xmin = 0;
int ymax = 1; int ymin = 0;
double p[nx][ny];
double pn[nx][ny];
double x[nx];
double y[ny];
//populate p with zeros
for (int xi = 1; xi <=nx;xi++){
for (int yi = 1;yi<=ny;yi++){
p[xi][yi] = 0;
}
}
//populate x and y
//X
for (int xnum = 1; xnum <=nx; xnum++){
x[1] = 0;
x[xnum+1] = x[xnum] + dx;
}
//Y
for (int ynum = 1; ynum <=ny; ynum++){
y[1] = 0;
y[ynum+1] = y[ynum] + dy;
}
//initial condition
for (int yrange = 1; yrange<=ny;yrange++){
p[nx][yrange] = y[yrange];
}
//SOLVING FOR P
for (int iter = 1; iter<=niter; iter++){
//copy values
for (int xiter= 1; xiter<=nx;xiter++){
for (int yiter = 1; yiter<=ny;yiter++){
pn[xiter][yiter]=p[xiter][yiter];
}
}
//main loop
for (int i = 2; i<=nx-1;i++){
for (int j = 2; j<=ny-1;j++){
p[i][j] = ((pow(dy,2)*(pn[i+1][j]+pn[i-1][j]))+(pow(dx,2)*(p[i][j+1]+pn[i][j-1])))/(2*(pow(dx,2)+pow(dy,2)));
}
}
for (int xrange = 2; xrange<=nx-1;xrange++){
p[xrange][1] = p[xrange][2];
p[xrange][ny] = p[xrange][ny-1];
}
}
//Testing matrix
for (int x = 1; x<=nx;x++){
for (int y =1; y<=ny;y++){
printf("%1.3f\t",p[x][y]);
}
printf("\n");
}
return 0;
}
#包括
#包括
常数int nx=5;//x方向上的元素数
常数int ny=5;//x方向上的元素数
常数int niter=100;/#迭代次数
int main(){
双dx=2/double((nx-1));
双dy=1/双((ny-1));
int-xmax=2;int-xmin=0;
int-ymax=1;int-ymin=0;
双p[nx][ny];
双pn[nx][ny];
双x[nx];
双y[ny];
//用零填充p
对于(席席=1;X您的循环一直到<代码> nx<代码>,因为您正在访问超出界限。索引开始于0,直到<代码> i < nx > /p>
这:
用于(席)=1;席西:当C++无法打印时,你如何知道结果是正确的?在C++中,原点是0。你似乎用循环的原点1来对它们进行初始化。你好,我在Matlab有一个类似的程序,在准确的条件下,我把矩阵打印在Matlab,看到数字是正确的。谢谢。我还有1个问题:知道C++在0开始,但是在循环中,可以指定它在1开始,或者如果我想这样做,我需要循环到NX+1?谢谢。again@mle0312你为什么要这么做?我用一个例子编辑了答案
for (int xi = 1; xi <= nx; xi++){
for (int yi = 1; yi <= ny; yi++){
p[xi][yi] = 0;
}
}
for (int xi = 0; xi < nx; xi++){
for (int yi = 0; yi < ny; yi++){
p[xi][yi] = 0;
}
}
//copy values (!!! WRONG CODE !!! spot the error to win a FORTRAN fanshirt)
for (int xiter= 1; xiter < nx+1; xiter++){
for (int yiter = 1; yiter < ny+1; yiter++){
pn[xiter-1][yiter-1] = p[xiter][yiter-1];
}
}