我的问题是,当我将函数“sense”收集的指针数组“q”传递给其他函数“move”时,“q”中的值会随机变化。任何回应都将非常感激。 这是我的代码:
Main()
int main(int argc,char *argv[])
{
int i,j,k;
float *p=(float *)malloc(sizeof(float));
float *q=(float *)malloc(sizeof(float));
j=0;
k=0;
for(i=0;i<NCELLS;i++)
p[i]=1.0/NCELLS;
q=sense(p,j); //Gives write values in q
j++;
q=move(q,motion[k]); // when passed to "move" values of q randomly changes
k++;
printf("\n");
for(i=0;i<NCELLS;i++)
printf("%f\t", q[i]);
printf("\n");
return 0;
}
functions:
float* move(float *p,int U)
{
int i;
float temp;
float *next=(float *)malloc(sizeof(float));
printf("\n");
for(i=0;i<NCELLS;i++)
printf("%f\t", p[i]); //Here I am checking for change in values
for(i=0;i<NCELLS;i++)
{
temp=pGoal*p[mod(i-U,NCELLS)];
temp=temp+pOvershoot*p[mod(i-U+1,NCELLS)];
temp=temp+pUndershoot*p[mod(i-U-1,NCELLS)];
next[i]=temp;
}
return(next);
}
float* sense(float *p,int j)
{
int i;
float *q, sum;
q=(float *)malloc(sizeof(float));
sum=0;
for(i=0;i<NCELLS;i++)
{
if(strcmp(World[i],Sense[j])==0)
q[i]=pHit*p[i];
else
q[i]=pMiss*p[i];
sum+=q[i];
}
for(i=0;i<NCELLS;i++)
q[i]=q[i]/sum;
return(q);
}
答案 0 :(得分:0)
float *q=(float *)malloc(sizeof(float));
您分配了多少float
个?之一。
for(i=0;i<NCELLS;i++)
printf("%f\t", q[i]);
您尝试访问了多少float
个?五。你觉得这里有问题吗?如果你想要五个浮点数,请分配五个浮点数:
float *q = malloc(5 * sizeof *q);
在move
函数中,分配并返回一个新数组,仅丢弃旧数组而不会在返回后丢弃旧数组(使用free
)。这会导致内存泄漏。为什么你甚至需要malloc
?不要在这些功能中调用malloc
;保留调用者(main
)的决定。在这种情况下,调用者不需要动态分配,因此它从选择中获益匪浅。使用正确的工具......
我建议为这些功能采用与memcpy
一致的样式。任何外部变量都应作为参数或在作为参数提供的结构内部提供。
void find_move(float *, float const *, size_t, size_t, float, float, float);
void find_sense(float *, float const *, size_t, char const * const *, char const *, float, float);
int main(void)
{
float p[NCELLS], q[NCELLS];
for (size_t i = 0; i < NCELLS; i++)
{
p[i] = 1.0 / NCELLS;
}
find_sense(q, p, NCELLS, world, sense[1], hit, miss);
find_move(p, q, NCELLS, 0, goal, overshoot, undershoot);
for (size_t i = 0; i < NCELLS; i++)
{
printf("%f\t", p[i]);
}
putchar('\n');
}
void find_move(float *destination, float const *source, size_t length, size_t offset, float goal, float overshoot, float undershoot)
{
for (size_t i = 0; i < length; i++)
{
float temp = goal * source[mod(i - offset, length)]
+ overshoot * source[mod(i - offset + 1, length)]
+ undershoot * source[mod(i - offset - 1, length)];
printf("%f\t", source[i]);
destination[i] = temp;
}
putchar('\n');
}
void find_sense(float *destination, float const *source, size_t length, char const * const *world, char const *sense, float hit, float miss)
{
float sum = 0;
for (size_t i = 0; i < NCELLS; i++)
{
if (strcmp(world[i], sense) == 0)
{
destination[i] = hit * source[i];
}
else
{
destination[i] = miss * source[i];
}
sum += destination[i];
}
for (size_t i = 0; i < length; i++)
{
destination[i] /= sum;
}
}
P.S。请注意此处使用的一致空格和描述性标识符。我甚至把支撑放在人们期望的地方,不管看起来多么不必要。我希望如果我的代码很可怕,你就不想破译它。您可能会忽略答案并等待新答案,就像大多数人会忽略您的问题并等待新问题一样......当您向我们提供代码时请记住这一点。