2013-03-04 3 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); 
} 

Для этого один компилятор предупреждает меня тх переменные й имеет значение, но не используется ... !! Но на самом деле я использую переменную 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_m и 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

+1

Возможно, вы также должны вставить фактические предупреждения компилятора, что, вероятно, облегчит людям помощь в понимании того, что они означают. – Christoffer

+0

Вы инициализируете переменные внутри условий. Компилятор не может доказать, что условие когда-либо было выполнено (не так ли?) Просто инициализируйте их вне любого условия или цикла, чтобы быть в безопасности. Что касается предупреждения неиспользуемой переменной, я не вижу, где вы его используете. –

ответ

4

В вашей первой функции, то набор (назначить) х, но вы никогда не читали его, следовательно, вы не используете это ... вы только тратите циклов процессора путем записи в него , (Заметьте также, что, поскольку вы индексируете его как i+1, вы пишете за пределами пространства, которое вы выделили для него).

Во второй функции ваши инициализации этих переменных находятся в условных блоках. Вы можете видеть, что (возможно, я не проверял) во всех условиях, которые они инициализированы, но ваш компилятор не настолько умный.

В вашей третьей функции, как представляется, можно ссылаться на one без первоначальной инициализации.

+0

Тот же вопрос здесь, я мог бы быть слепым, но я не вижу, чтобы третья функция (хотя это не очень) могла использовать значение, унифицированное? – Jite

0
  1. Переменная x используется только с левой стороны (т. Е. Назначается значение). Вы не используете это значение с правой стороны или передаете его функции.
  2. Может быть возможно дойти до конца цикла for(i = 0; i < POPSIZE - 1; i++) без этих переменных с учетом значения. Почему бы не указать их в декларации.
  3. Вызов можно вызвать, если one не установлен. Измените строку int mem,one; на int mem,one = <some value>;
+0

Что касается пункта 3, теперь я мог бы быть слепым, но в этом случае я не вижу на практике третьего варианта. – Jite

+0

@Jite - компилятор не может доказать, что 'one' всегда определен. Насколько он знает, «rand» - это просто функция, как и любая другая. Поэтому можно предположить, что 'if (x

+0

Я понимаю, почему компилятор не может его увидеть ... Я сказал, что хотя я не могу понять, как использовать «один» неинициализированный. Вы говорите, что 'random_Xover()' может вызываться с неинициализированной переменной 'one', но в пратисе это не может, если я не ослеп. – Jite

1

Первый: Вы можете установить x но сделать не использовать его. Это локальная переменная, которая устанавливается, но она отбрасывается, как только функция возвращается.

Во-вторых: могут быть значения, которые делают так, что ваш best_mem/worst_mem никогда не будет установлен в вашем if/else, но вы используете их позже. Если они не были установлены, они содержат мусор, если не инициализированы.

В-третьих: Хотя вы не должны пытаться использовать неинициализированную переменную в своем коде, она по-прежнему выглядит странно, а компилятор не видит, что это произойдет не первый раз.

Когда вы получаете предупреждения о компиляторе, обращайтесь с тем, что делаете что-то неправильно или, скорее, не рекомендуется, и это можно сделать в лучшем виде.

Смежные вопросы