1

こんにちは、私は 4 つの警告を受け取る 3 つの機能を持っています...!!

一枚目はこれ

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 を使用しています...!!!

2番目の関数はこれです...

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

これについては、この関数で変数most_memとbest_memが初期化されていない可能性があるという2つの警告が表示されます..!! しかし、私はそれらの両方に値を初期化します..!!

そして3つ目の機能がこれ…

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

そのために、変数1が初期化されて使用される可能性があることがわかりました.. !! しかし、それは初期化されています..!

これらの関数の何が問題なのか教えてください...??

前もって感謝します

4

3 に答える 3

4

最初の関数では、x を設定 (割り当て) しましたが、それを読み取ったことがないため、使用していません...書き込みによって CPU サイクルを浪費しているだけです。i+1(また、割り当てたスペースを超えて書き込むときにインデックスを作成するため、注意してください)。

2 番目の関数では、これらの変数の初期化は条件付きブロックで行われます。すべての条件でそれらが初期化されていることがわかります (おそらく? 私は確認しませんでした) が、コンパイラはそれほどスマートではありません。

3 番目の関数では、one最初に初期化せずに参照できるようです。

于 2013-03-04T11:48:28.953 に答える
1

最初に:設定xしますが、使用しませ。これは設定されるローカル変数ですが、関数が戻るとすぐに削除されます。

best_mem/worst_mem2番目:が設定されないようにする値があるかもしれませんがif/else、後でそれらを使用しています。設定されていない場合、初期化されていないとガベージが含まれます。

3番目:コードで初期化されていない変数を使用しようとしても発生しないはずですが、それでも奇妙に見え、コンパイラーはそれが最初に発生しないことを認識しません。

コンパイラの警告が表示された場合は、何か間違ったことをしている、または推奨されていないことを処理し、より良い方法で実行できることを扱います。

于 2013-03-04T11:52:58.683 に答える
0
  1. x変数は左側でのみ使用されます (つまり、値が割り当てられます) 。右側でその値を使用していないか、関数に渡しています。
  2. for(i = 0; i < POPSIZE - 1; i++)これらの変数に値を指定しなくても、ループの最後に到達する可能性があります。それらを宣言に設定してみませんか。
  3. への呼び出しは、 が設定されていないrandom_Xover(one,mem);ときに呼び出される可能性がありますoneint mem,one;行を次のように変更しますint mem,one = <some value>;
于 2013-03-04T11:51:33.593 に答える