переменная установлена, но не используется Предупреждение, но также и необъявленный идентификатор ошибки - PullRequest
0 голосов
/ 19 января 2020

Отладчик говорит мне, что я не использую свою переменную, но она не объявлена. Что здесь происходит? заявление if это его собственная сфера? Почему-то кажется, что массив фиксированной длины не находится в той же области видимости внутри блока if.

Мой минимальный пример

#include <stdio.h>
#include <stdlib.h>

void nullarray(int start,int end,  char array[]){
if(start<end) // TODO used to be <=
    {
    array[start]='0';
    nullarray(++start,end,array);
    }else{array[start]='\0';}

}


int main()
{
    int commaindex2=-1;
    int mostdecimaldigits=6;

      if(commaindex2==-1){
            char decimalnum2[1];decimalnum2[0]='0';
            }
    else{
    char decimalnum2[mostdecimaldigits]; // get enought store incl filling up zeros
    nullarray(0,mostdecimaldigits,decimalnum2); // write zeros to array

    }
     printf("%s", decimalnum2);
}

Вывод отладчика

||=== Build: Debug in test4 (compiler: GNU GCC Compiler) ===|
D:\main.c||In function 'main':|
D:\main.c|20|warning: variable 'decimalnum2' set but not used [-Wunused-but-set-variable]|
D:\main.c|27|error: 'decimalnum2' undeclared (first use in this function)|
D:\main.c|27|note: each undeclared identifier is reported only once for each function it appears in|
||=== Build failed: 1 error(s), 1 warning(s) (0 minute(s), 0 second(s)) ===|

однако это прекрасно работает

int main()
{
    int commaindex2=55;
    int mostdecimaldigits=6;
    int num;
      if(commaindex2==-1){
           num=1 ;
            }
    else{
   num=mostdecimaldigits;

    }
     char decimalnum2[num];
     nullarray(0,num,decimalnum2);
     printf("%s", decimalnum2);
}

Ответы [ 3 ]

4 голосов
/ 19 января 2020

Что здесь происходит? Является ли оператор if его собственной областью действия?

Да - оператор if (или, если быть точным, фигурные скобки, следующие за ним) определяет свою собственную область, как и фигурные скобки после else оператор (но это другая область).

Таким образом, ваши объявления char decimalnum2[1]; и char decimalnum2[mostdecimaldigits]; (в блоках if и else соответственно) определяют переменные ( отдельные, не связанные), действительные только в фигурных скобках, в которых они встречаются .

Итак, утверждение: printf("%s", decimalnum2);, находящееся вне обоих блоков, пытается использовать необъявленное переменная - отсюда и ошибка.

Кроме того, оператор decimalnum2[0]='0'; (в блоке if) присваивает значение (локальной) блоку переменной, которая затем никогда не используется - отсюда и предупреждение.

Быстрое решение: Вам необходимо поместить объявление char decimalnum2[mostdecimaldigits]; как перед и вне if … else блоков, и удалить два объявления внутри эти блоки.

2 голосов
/ 19 января 2020

Набор фигурных скобок начинает новую область видимости, поэтому в вашем первом фрагменте кода decimalnum2 объявляется в двух различных областях: одна внутри блока if и одна внутри блока else. Обе они являются различными переменными и больше не существуют, когда эта область остается.

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

0 голосов
/ 19 января 2020

Как указано в UnholySheep, в C есть область видимости блока. Это означает, что переменная перестает существовать после} блока if. Таким образом, значения не могут быть напечатаны.

Подробности об этом

...