1

大家好,我有三个功能,我收到 4 个警告......!

第一个是这个

void evaluatearxikos(void)
{
    int mem;
    int i;
    double x[NVARS+1];

    FILE *controlpointsarxika;

    controlpointsarxika = fopen("controlpointsarxika.txt","r");
    remove("save.txt");


    for(mem = 0; mem < POPSIZE; mem++)
    {
        for(i = 0; i < NVARS; i++)
        {
            x[i+1] = population[mem].gene[i];


        }
        rbsplinearxiki();

        XfoilCall();

        population[mem].fitness = FileRead();
        remove("save.txt");


    }

       fclose(controlpointsarxika);
}

对于这个,编译器警告我变量 x 已设置但未使用...!但实际上我使用的是变量 x...!!!

第二个功能是这个...

void elitist(void)
{
    int i;
    double best,worst;
    int best_mem,worst_mem;

    best = population[0].fitness;
    worst = population[0].fitness;

    for(i = 0; i < POPSIZE - 1; i++)
    {
        if(population[i].fitness > population[i+1].fitness)
        {
            if(population[i].fitness >= best)
            {
                best = population[i].fitness;
                best_mem = i;
            }

            if(population[i+1].fitness <= worst)
            {
                worst = population[i+1].fitness;
                worst_mem = i+1;
            }
        }

        else
        {
            if(population[i].fitness <= worst)
            {
                worst = population[i].fitness;
                worst_mem = i;
            }

            if(population[i+1].fitness >= best)
            {
                best = population[i+1].fitness;
                best_mem = i+1;
            }
        }
    }

    if(best >= population[POPSIZE].fitness)
    {
        for(i = 0; i < NVARS; i++)
        {
            population[POPSIZE].gene[i] = population[best_mem].gene[i];


        }

        population[POPSIZE].fitness = population[best_mem].fitness;
    }

    else
    {
        for(i = 0; i < NVARS; i++)
        {
            population[worst_mem].gene[i] = population[POPSIZE].gene[i];

        }

        population[worst_mem].fitness = population[POPSIZE].fitness;
    }
}

对于这个我收到两个警告,变量最坏的_mem和最好的_mem可能在这个函数中未初始化..!! 但是我初始化了他们两个的值..!!

第三个功能是这个......

void crossover(void)
{
    int mem,one;
    int first = 0;
    double x;

    for(mem =0; mem < POPSIZE; mem++)
    {
        x = rand()%1000/1000;

        if(x < PXOVER)
        {
            first++;

            if(first%2 == 0)
            {
                random_Xover(one,mem);
            }

            else
            {
                one = mem;
            }
        }
    }
}

为此,我知道变量 one 可以被统一使用..!! 但它已初始化..!

你能告诉我这些功能有什么问题吗......?

先感谢您

4

3 回答 3

4

在您的第一个函数中,您设置(分配)x,但您从未读过它,因此您没有使用它……您只是通过写入它来浪费 CPU 周期。(还要注意,因为您i+1在写入超出为它分配的空间时对其进行了索引)。

在第二个函数中,您对这些变量的初始化位于条件块中。您可以看到(也许?我没有验证)在所有情况下它们都已初始化,但您的编译器并不那么聪明。

在您的第三个函数中,似乎one可以在没有首先初始化的情况下引用它。

于 2013-03-04T11:48:28.953 回答
1

第一:你设置x使用它。它是一个被设置的局部变量,但一旦函数返回它就会被删除。

第二:可能有一些值使得你best_mem/worst_mem永远不会在你的 中设置if/else,但你稍后会使用它们。如果它们尚未设置,则如果未初始化,它们将包含垃圾。

第三:虽然您尝试在代码中使用未初始化的变量不应该发生,但它看起来仍然很奇怪,编译器没有看到它不会第一次发生。

当您收到编译器警告时,请视为您做错了什么或者不建议这样做,并且可以以更好的方式完成。

于 2013-03-04T11:52:58.683 回答
0
  1. x变量仅用于左侧(即赋值)。您没有在右侧使用该值或将其传递给函数。
  2. for(i = 0; i < POPSIZE - 1; i++)在没有给这些变量赋值的情况下,可能会到达循环的结尾。为什么不在声明中设置它们。
  3. 未设置random_Xover(one,mem);时可以调用 to 。one将行更改int mem,one;int mem,one = <some value>;
于 2013-03-04T11:51:33.593 回答