IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

 
 Ответить  Открыть новую тему 
> C++, Непонятная ошибка
TS*
сообщение 20.01.2007 23:01
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 71
Пол: Мужской
Реальное имя: Max

Репутация: -  0  +


Выдает ошибку "Case bypasses initalization of local variable", если закоментировать кейс "DIV" или "Default" ошибка пропадает. Может быть баг компилятора (Borland C++ for DOS)?:

enum token_value {
NAME, NUMBER, END,
PLUS='+', MINUS='-', MUL='*', DIV='/',
PRINT=';', ASSIGN='=', LP='(', RP=')'
};
token_value curr_tok;

double term();
double prim();
double expr();
double error(const char* s);
token_value get_token();

double term() {
double left=prim();
for(;;)
switch(curr_tok) {
MUL:
get_token();
left*=prim();
break;
DIV:
get_token();
double d = prim();
if(d==0) return(error("Division by zero"));
left/=prim();
break;
default:
return(left);
}
}

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 20.01.2007 23:07
Сообщение #2


просто человек
******

Группа: Модераторы
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


{ и } поставь...


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 20.01.2007 23:13
Сообщение #3


Гость






Цитата
Может быть баг компилятора
Да что ты? Какой же баг компилятора, если Стандарт не позволяет обходить неинициализированные переменные? У тебя scope (область видимости переменной d) это что? Весь блок switch, правда? Представь себе, что будет, например, если ты перейдешь по default, и попытаешься использовать переменную d, которая, как правильно говорит компилятор, НЕ инициализирована? (то, что ты ее не используешь, компилятору неинтересно. Факт тот, что ты МОЖЕШЬ ее использовать)...

Что делаем? Либо
1) описываем d видимой во всей функции:
double term()   {  
double d, left=prim();
...
DIV:
get_token();
d = prim();
...
, либо
2) делаем внутренний блок, за пределами которого d невидима:
	 DIV:
{
get_token();
double d = prim();
if(d==0) return(error("Division by zero"));
left/=prim();
}
break;


Я бы выбрал второй вариант...
 К началу страницы 
+ Ответить 
TS*
сообщение 20.01.2007 23:34
Сообщение #4


Пионер
**

Группа: Пользователи
Сообщений: 71
Пол: Мужской
Реальное имя: Max

Репутация: -  0  +


Спасибо volvo и мисс_граффити, исправил на второй вариант
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 22.07.2025 2:34
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"