*"/*
表示的步骤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 */
}
答案 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);
}
// ...
}
注意i
和j
的奇怪之处?
您正在访问不存在的Kernel
元素。
答案 1 :(得分:0)
如果您声明float Theta[gridsize-1];
,则元素数量为gridsize-1
,允许的索引为0,1,......,gridsize-2
。
确保您的阵列足够大,以满足您的需求,并且不要使用太小或太大的索引。在这种情况下,它可以像在声明中将gridsize-1
更改为gridsize
一样简单。如果这不能解决问题,请使用新尺寸更新问题。