2013-03-04 60 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中设置,但您稍后会使用它们。如果它们尚未设置,则它们包含垃圾,如果未初始化。

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

当您收到编译器警告时,请对待,因为您正在做错某处或者更确切地说不建议使用,并且可以以更好的方式完成。