在C代码中间奇怪地改变了vAriable

时间:2014-04-27 17:50:49

标签: c arrays

我编写了一个计算非线性积分方程的程序。 C代码写在下面。问题是我初始化阵列" Delta"在由*"/*表示的步骤I中,初始化theta和Delta的数组,并检查数组delta是否为1 * /" *。给我一个delta数组,其值介于0和1之间,单调递增。之后我不再使用该阵列了。

然而,在我运行了我用*"/*表示的循环之后现在我们初始化矩阵Kernel */"*,,Delta中元素的值变为荒谬值。这很奇怪,因为我没有在此循环中为Delta分配任何新值。实际上,通过在该循环中打印Delta的值,我发现一切顺利,直到循环的最后一次运行:在此运行中,Delta的值被更改。

我一直盯着这一天,但我找不到问题。也许别人可以发现我的错误?

#include <stdio.h>
#include <math.h>
#define PI 3.14159265
main()
{
  int i,j,k;

  int gridsize, gridsizetwo = 200;

  printf("What gridsize would you like to use?\n");
  scanf("%d",&gridsize);

  float Theta[gridsize-1], Delta[gridsize-1], sum=0;
  double Kernel[gridsize-1][gridsize-1];

  /* Initialize the array for theta and Delta and check whether the array delta sums to one*/

  for (i=0 ; i<gridsize ; i++)
    {
      Theta[i] = PI/2*(i+1)/(gridsize + 1);

      if (i==0)
      { Delta[i] = 1 - 0.5*(cos(PI/2*(i+1)/(gridsize + 1)) + cos(PI/2*(i+2)/(gridsize + 1)));
        sum = sum + Delta[i]; }
      else if (i==gridsize-1)
      { Delta[i] = 0.5*(cos(PI/2*gridsize/(gridsize + 1)) + cos(PI/2*(gridsize-1)/(gridsize + 1)));
        sum = sum + Delta[i]; }
      else
      { Delta[i] = 0.5*(cos(PI/2*(i)/(gridsize + 1)) - cos(PI/2*(i+2)/(gridsize + 1)));
        sum = sum + Delta[i]; }
      printf("Theta %f   Delta %f    Sum of Delta %f\n", Theta[i], Delta[i], sum); 
    } 

  /* Initialize array for Phi seperately */
  float Phi[gridsizetwo-1];
  for (i=0 ; i<gridsizetwo ; i++)
  {
    Phi[i] = 2*PI*(i+1)/(gridsizetwo + 1);
    /* printf("Phi: %f\n",Phi[i]); */
  }

  /* Now we initialize the matrix Kernel */
  float help, helpp, helppp;

  for (i=0 ; i<gridsize ; i++)
    {
    for(j=0 ; j<gridsize-1 ; j++)
      {
        /* Use help variables to calculate lengthy parts of matrix kernel seperately */
        help = sqrt(1 - pow(cos(Theta[i])*cos(Theta[j]) + sin(Theta[i])*sin(Theta[j])*cos(Phi[0]),2));
        helppp = sqrt(1 - pow(cos(Theta[i])*cos(Theta[j]) + sin(Theta[i])*sin(Theta[j])*cos(Phi[gridsizetwo-1]),2));

        for (k=1 ; k<=gridsizetwo-2 ; k++)
        { if (k==1) { helpp=0; }
          helpp = helpp + sqrt(1-pow(cos(Theta[i])*cos(Theta[j])+sin(Theta[i])*sin(Theta[j])*cos(Phi[k]),2)); }
        /* Correct combination of help variables now yields matrix kernel */
        Kernel[i][j] = 2*PI/(gridsizetwo+1)*(3/2*help + helpp + 3/2*helppp);
      }
      for (k=0 ; k<gridsize ; k++)
      {
        printf("Delta = %f\n",Delta[k]);
      }
    }  
/* End the program */
}

2 个答案:

答案 0 :(得分:2)

  double Kernel[gridsize-1][gridsize-1];
  // ...
  for (i=0 ; i<gridsize ; i++)
    {
    for(j=0 ; j<gridsize-1 ; j++)
      {
        // ...
        Kernel[i][j] = 2*PI/(gridsizetwo+1)*(3/2*help + helpp + 3/2*helppp);
      }
      // ...
    }  

注意ij的奇怪之处? 您正在访问不存在的Kernel元素。

答案 1 :(得分:0)

如果您声明float Theta[gridsize-1];,则元素数量为gridsize-1,允许的索引为0,1,......,gridsize-2

确保您的阵列足够大,以满足您的需求,并且不要使用太小或太大的索引。在这种情况下,它可以像在声明中将gridsize-1更改为gridsize一样简单。如果这不能解决问题,请使用新尺寸更新问题。