2013-04-30 59 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范围内。