2013-04-30 54 views
0

我想編碼前向差分方法來求解熱方程,但是我的代碼在第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; 
} 
+2

內存損壞。你有沒有試過通過valgrind跑步? – 2013-04-30 19:23:04

+1

看起來這是超出限制'w [i] [j] = v [i];'因爲'j'可以上升到值'J' – 2013-04-30 19:24:26

+1

w [i + 1]超出界限i = M-1,第54行,cppcheck說 – Lol4t0 2013-04-30 19:24:55

回答

1

就在這裏:

for(j=1;j<=J;j++) 

您從0迭代jJ,但陣列可以被索引從0J-1

此外,基於Lol4t0的評論,在這裏:

w[i+1][j-1];

i = M

0

您試圖從j == J的數組邊界中訪問一個插槽。指數在0...J-1範圍內。