|
Вопрос # 4 888/ вопрос открыт / |
|
Приветствую, уважаемые эксперты!
Поясните странную работу перехвата деления на ноль. Есть пункт меню "вес", куда можно вводить значения от 40 до 170 (по условию лабораторной). Я искусственно делаю исключительные ситуации, чтобы обработать значения меньше 40 и больше 170. Лаба на работу с исключительными ситуациями и компонентом Memo. У меня явное деление на ноль, но перехвата не происходит. Но если я уберу комментарий со строки
ShowMessage(FloatToStr(sngFlag));
то все работает нормально. Почему так?
Приложение: Переключить в обычный режим- procedure TfmLab3.mmVesClick(Sender: TObject);
- var
- sngVes, sngFlag: single;
- intFlag: integer;
- begin
- try
-
- sngFlag:=sqrt(sngVes-40);
- if sngVes>170 then
- begin
- sngFlag:=1/intFlag;
- //ShowMessage(FloatToStr(sngFlag));
- end;
- edWeight.Text:=FloatToStr(sngVes);
- except
-
-
-
- end;
-
- end;
-
-
 |
Вопрос задал: KwaK (статус: Посетитель)
Вопрос отправлен: 7 января 2011, 07:41
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Мережников Андрей
Здравствуйте, KwaK!
а что такое intFlag и где присваивается значение этой переменной? Если думаете, что по умолчанию должен быть 0, то ошибаетесь. Так что нет здесь явного деления на ноль. И зачем городить такой огород с исключительными ситуациями?
 |
Ответ отправил: Мережников Андрей (статус: Абитуриент)
Время отправки: 7 января 2011, 08:52
|
Мини-форум вопроса
Всего сообщений: 7; последнее сообщение — 7 января 2011, 16:07; участников в обсуждении: 3.
|
Мережников Андрей (статус: Абитуриент), 7 января 2011, 08:50 [#1]:
а что такое intFlag и где присваивается значение этой переменной? Если думаете, что по умолчанию должен быть 0, то ошибаетесь. И зачем городить такой огород с исключительными ситуациями?
|
|
KwaK (статус: Посетитель), 7 января 2011, 09:39 [#2]:
именно на intFlag=0 и рассчитано. И работало, правда во втором месте не сработало. Принудительно добавил intFlag:=0. а зачем надо - по условию лабы требуется предусмотреть исключительную ситуацию, я ее и сделал. Понятно, что если бы для себя код писал, то решил бы проблемму >40 <170 проще.
Но суть вопроса не в этом. Почему, если строка
ShowMessage(FloatToStr(sngFlag));
закомментирована перехвата ошибки нет, а если снять комментарий то все идет нормально. Ведь деление на ноль в предыдущей строке.
|
|
Мережников Андрей (статус: Абитуриент), 7 января 2011, 09:51 [#3]:
деления на ноль нет! В переменной intFlag может быть все что угодно. А то, что ошибка появляется при снятии комментария, значит что ошибка происходит в той строке, которая закомментирована
|
|
Мережников Андрей (статус: Абитуриент), 7 января 2011, 09:52 [#4]:
напишите просто sngFlag:=1/0; или intFlag:=1 div 0;
|
|
KwaK (статус: Посетитель), 7 января 2011, 11:44 [#5]:
писал - не работает. Изначально так и было. Сейчас внес изменения в ранее написанный код ввел
if sngVes>170 then
begin
intFlag:=0;
sngFlag:=1/0;
//ShowMessage(FloatToStr(sngFlag));
end;
в едит записал 177 в этом варианте вносит в едит 177 без сообщений. Убрал комментарий выходит сообщение "INF" (непонятно почему и откуда). Вернул к старому варианту sngFlag:=1/intFlag; - все работает как задумано
|
|
bugmenot (статус: 3-ий класс), 7 января 2011, 14:12 [#6]:
Брутальненько так. И да, в переменной - мусор из стека. Гамма-функцию можно взять, от 170 точно грохнется =)
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
|
KwaK (статус: Посетитель), 7 января 2011, 16:07 [#7]:
Почему аналогично не написать сравнение с 170?:
sngFlag:=sqrt(170-sngVes);
тогда будет запускаться один и тот же обработчик на разные события >170 и <40. Поэтому и генерирую разные ошибки
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|