-1

我的问题是,当我将函数“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);
}
4

1 回答 1

0
float *q=(float *)malloc(sizeof(float));

你分配了多少floats?一。

for(i=0;i<NCELLS;i++)
            printf("%f\t", q[i]);

float您尝试访问多少个 s?五。你看到这里有问题吗?如果你想要五个浮点数,分配五个浮点数:

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;
    }
}

PS 请注意此处使用的一致的空格和描述性标识符。我什至把大括号放在人们期望的地方,不管这看起来多么不必要。我希望如果我的代码很可怕,你不会想破译它。您可能会忽略答案并等待新的答案,就像大多数人会忽略您的问题并等待新的答案一样......当您向我们提供代码时请记住这一点。

于 2013-06-02T19:39:37.303 回答