我想編碼前向差分方法來求解熱方程,但是我的代碼在第13次迭代期間總是得到分段錯誤。所以我通過將一些printf添加到循環中並檢查某些變量的值來進行調試。一旦我堅持使用printf,我的循環就成功地繼續了它之前Faulted的地步。但是,如果我只是將這些printf註釋掉,那麼代碼將再次出錯......任何人都知道爲什麼會出現這種情況?分段錯誤只發生在未打印到屏幕時
/////////////////////////////////////////////////////////////
//
// Math 448 Assignment 5 Gauss-Seidel
//
/////////////////////////////////////////////////////////////
#include <stdio.h>
#include <iostream>
#include <math.h>
#define I 9
#define J 100
#define M 10
double w[M][J] = {0};
double v[M] = {0};
double K = 0.005;
double H = 0.1;
// J is time, t
// I is distance, x
int main(void){
// First build up t=0
int i,j;
double lambda;
double t = 0;
printf("k=%lf\th=%lf\n", K, H);
lambda = (0.5)*(double)K/(H*H);
for(i=0;i<=M-1;i++){
if(i<=5)
{
w[i][0] = i*H;
}else{
w[i][0] = (double)(1-i*H);
}
}
printf("lam=%lf\n",lambda);
for(j=1;j<=J;j++){
v[0] = 0;
v[I-1] = 0;
for(i=1;i<=M-1;i++){
if(t>=0.06){
// THESE ARE THE PRINTS THAT CAUSE IT TO WORK
//printf("i=%d\n1) %lf\n2) %lf\n3) %lf\n",i, w[i-1][j-1], w[i][j-1], w[i+1][j-1]);
//getchar();
}
v[i] = lambda*w[i-1][j-1] + (1-2*lambda)*w[i][j-1] + lambda*w[i+1][j-1];
}
t = j*K;
printf("t=%.4lf\t",t);
for(i=0;i<M;i++){
printf("%.4lf\t", v[i]);
}
for(i=1;i<M-1;i++){
w[i][j] = v[i];
}
printf("\n");
}
/*
//Psuedocode
for j=1 to N
v0 = 0
vm = 0
for i=1 to m-1
vi = LAM*Wi-1 + (1-2LAM)*Wi + LAM*Wi+1
end for
t = i*k
output(v0, v1, v2...)
end for
*/
return 0;
}
內存損壞。你有沒有試過通過valgrind跑步? – 2013-04-30 19:23:04
看起來這是超出限制'w [i] [j] = v [i];'因爲'j'可以上升到值'J' – 2013-04-30 19:24:26
w [i + 1]超出界限i = M-1,第54行,cppcheck說 – Lol4t0 2013-04-30 19:24:55