我正在处理10个变量的数组。我正在计算互相关。当我插入一个printf语句(返回0的最后两行)来包含返回的值时,从第二次迭代开始的sxy的值被改变(将其中的2个以粗体显示)。看到我得到的值 - 没有printf语句:
sxy = 0.000000
sxy = -0.441021, denom=0.944295
-5 -0.467037
sxy = 0.000000
sxy = **-0.232003**, denom=0.944295
-4 -0.245689
sxy = 0.000000
sxy = **0.066825**, denom=0.944295
-3 0.070767
sxy = 0.000000
sxy = -0.080936, denom=0.944295
-2 -0.085711
sxy = 0.000000
sxy = 0.304371, denom=0.944295
-1 0.322326
只需包含printf语句:
sxy = 0.000000
sxy = -0.441021, denom=0.944295
sxy = 0.000000
sxy = **-0.341112**, denom=0.944295
sxy = 0.000000
sxy = **-0.064583**, denom=0.944295
sxy = 0.000000
sxy = -0.085263, denom=0.944295
sxy = 0.000000
sxy = 0.333693, denom=0.944295
sxy = 0.000000
sxy = 0.625614, denom=0.944295
sxy = 0.000000
sxy = 0.074215, denom=0.944295
以下是代码:
int cxcor(float x[], float y[], float r[])
{
/* Calculate the mean of the two series x[], y[] */
int i, j, delay, maxdelay = MAXM/2, n = MAXM;
float sx, sxy, mx = 0;
float sy, denom, my = 0;
float rr[MAXM];
for (i=0;i<n;i++) {
mx += x[i];
my += y[i];
}
mx /= n;
my /= n;
/* Calculate the denominator */
sx = 0;
sy = 0;
for (i=0;i<n;i++) {
sx += (x[i] - mx) * (x[i] - mx);
sy += (y[i] - my) * (y[i] - my);
}
denom = sqrt(sx*sy);
/* Calculate the correlation series */
for (delay = -maxdelay; delay < maxdelay; delay++) {
sxy = 0;
printf ("sxy = %f \n", sxy );
for (i=0;i<n;i++) {
j = i + delay;
while (j < 0)
j += n;
j %= n;
sxy += (x[i] - mx) * (y[j] - my);
}
printf ("sxy = %f, denom=%f\n", sxy, denom);
tr = sxy / denom;
k = delay;
r[ k] = tr;
printf ("%d\t %f\n", k, r[k]);
}
return 0;
}
答案 0 :(得分:0)
答案 1 :(得分:0)
这些线是主要问题:
k = delay;
r[ k] = tr;
因为delay
的范围从-maxm/2
到+maxm/2
和数组的负偏移量(例如r[-maxm/2]
)
将踩到内存中的内存(堆栈)
在r[]
的定义之前。
这就是破坏价值观的原因。
这种动作,其中数组外部的内存地址绑定 踩到是未定义的行为 并且/将导致seg故障事件
建议:
k = delay+(maxm/2);
r[ k] = tr;
此外,此算法会产生不准确的结果
当maxm
是奇数时。