2013-03-04 86 views
1

你好傢伙我有三個功能,我得到4個警告......!功能警告在C

第一個是這個

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

對於這一個編譯器警告我THA變量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; 
    } 
} 

對於這一個,我得到兩個警告,該變量worst_mem和best_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; 
      } 
     } 
    } 
} 

爲此,我得到的是一個變量,可以使用未初始化.. !!但它已初始化..!

你能告訴我這些功能有什麼問題嗎?

預先感謝您

+3

請注意,額外的感嘆號不會改善您的問題的質量。 – Matthias 2013-03-04 11:46:59

+1

也許你應該粘貼實際的編譯器警告,這可能會讓人們更容易幫助你理解它們的含義。 – Christoffer 2013-03-04 11:47:08

+0

你在條件內初始化你的變量。編譯器無法證明這種情況永遠存在(你能嗎?)只要在任何條件或循環之外初始化它們以確保安全。至於未使用的變量警告,我沒有看到你在哪裏使用它。 – 2013-03-04 11:52:15

回答

4

在你的第一個功能,您可以設定(分配)X,但你永遠不寫它讀它,因此你不使用它......你不僅浪費CPU週期。 (還請注意,因爲您將其編入i+1,因此您將其編寫爲超出您分配的空間)。

在第二個函數中,對這些變量的初始化是在條件塊中。你可以在所有初始化的條件下看到(也許我沒有驗證),但是你的編譯器不是那麼聰明。

在你的第三個函數中,似乎one可能被引用到未經初始化。

+0

同樣的問題在這裏,我可能會失明,但我沒有看到第三個函數(雖然它不漂亮)可以使用單值化的值? – Jite 2013-03-04 13:19:33

0
  1. x變量僅用於左側(即賦值)。您沒有在右側使用該值,或將其傳遞給函數。
  2. 如果沒有給定值的變量,可能會到達循環for(i = 0; i < POPSIZE - 1; i++)的末尾。爲什麼不把它們放在聲明中。
  3. one未設置時,可調用。行int mem,one;更改爲int mem,one = <some value>;
+0

關於第3點,現在我可能會失明,但在這種情況下,我沒有在實踐中看到第三種選擇。 – Jite 2013-03-04 13:18:41

+0

@Jite - 編譯器無法證明總是定義「one」的情況。據瞭解,「rand」就像其他任何函數一樣。所以可以想象,if(x 2013-03-04 13:30:41

+0

我明白爲什麼編譯器無法看到它......我說盡管我看不到'one'可以如何使用未初始化。你說'random_Xover()'可以用未初始化的變量'one'調用,但實際上如果我不是盲目的,就不能這樣做。 – Jite 2013-03-04 14:00:37

1

第一條:您設置x但做使用它。這是一個局部變量,它被設置,但只要函數返回就會被刪除。

第二:可能存在的值使得您的best_mem/worst_mem從未在您的if/else中設置,但您稍後會使用它們。如果它們尚未設置,則它們包含垃圾,如果未初始化。

第三:雖然不會發生你試圖在你的代碼中使用一個未初始化的變量,但它仍然看起來很奇怪,編譯器也沒有看到它不會第一次發生。

當您收到編譯器警告時,請對待,因爲您正在做錯某處或者更確切地說不建議使用,並且可以以更好的方式完成。