2016-09-26 8 views
-6

int переменная h объявлена ​​в строке 10, когда пользователь вводит значение.Ошибка «необъявленного идентификатора», хотя переменная была объявлена ​​ранее в коде

Однако, когда код компилирует, он говорит, что он не объявлен.

#include <cs50.h> 
#include <stdio.h> 

int main(void) 
{ 
    printf("How tall would you like your pyramid?\n"); 
    bool inc = true; 
    while (inc) 
    { 
     int h = GetInt(); 
     if (h <= 23 && h >= 1) 
     { 
      inc = false; 
     } 
     else 
     { 
      printf("your value needs to be between 1 and 26\n"); 
     } 
    } 

    for (int i=0; i<=h; i++) 
    { 
     printf("#\n"); 
    } 
} 
+0

c не поддерживает декализацию переменных OTG. – Abhineet

+0

H объявлен в области while, поэтому он не обнародован вне его. –

+1

Вы используете 'h' вне области, где он был объявлен. Голосование, чтобы закрыть это как обычную опечатку. – Lundin

ответ

6

Ваша переменная h находится в другом замке:

while (inc) 
{ 
    int h = GetInt(); 
    if (h <= 23 && h >= 1) 
    { 
     inc = false; 
    } 
    else 
    { 
     printf("your value needs to be between 1 and 26\n"); 
    } 
    // h is destroyed after this line and is no longer visible. 
} 

for (int i=0; i<=h; i++) 
{ 
    printf("#\n"); 
} 

Скобки указывают область видимости, область видимости переменной указывает. h объявлен внутри области цикла while, h не видна за пределами этой области видимости за пределами } цикла. Если вы хотите получить доступ к нему за пределами цикла, вы должны поместить его за пределы цикла:

int h = -1; 
while (inc) 
{ 
    h = GetInt(); 
    if (h <= 23 && h >= 1) 
    { 
     inc = false; 
    } 
    else 
    { 
     printf("your value needs to be between 1 and 26\n"); 
    } 
} 

for (int i=0; i<=h; i++) 
{ 
    printf("#\n"); 
} 
// h is still visible here. 
+3

'h = GetInt();' должно находиться внутри цикла. – interjay

+0

* Если значение '' inc' было бы ложным, то условие прерывания for-loop будет считывать неинициализированный 'h'. Лучше делать 'int h = -1;'. – alk

+1

@alk Программа не имеет смысла тогда, не так ли? Тем не менее, ради хороших практик я отредактирую его. –