Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 888

/ вопрос открыт /

Приветствую, уважаемые эксперты!
Поясните странную работу перехвата деления на ноль. Есть пункт меню "вес", куда можно вводить значения от 40 до 170 (по условию лабораторной). Я искусственно делаю исключительные ситуации, чтобы обработать значения меньше 40 и больше 170. Лаба на работу с исключительными ситуациями и компонентом Memo. У меня явное деление на ноль, но перехвата не происходит. Но если я уберу комментарий со строки

ShowMessage(FloatToStr(sngFlag));
то все работает нормально. Почему так?

Приложение:
  1. procedure TfmLab3.mmVesClick(Sender: TObject);
  2. var
  3. sngVes, sngFlag: single;
  4. intFlag: integer;
  5. begin
  6. try
  7.  
  8. sngFlag:=sqrt(sngVes-40);
  9. if sngVes>170 then
  10. begin
  11. sngFlag:=1/intFlag;
  12. //ShowMessage(FloatToStr(sngFlag));
  13. end;
  14. edWeight.Text:=FloatToStr(sngVes);
  15. except
  16.  
  17.  
  18.  
  19. end;
  20.  
  21. end;
  22.  
  23.  


KwaK Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: 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

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

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

bugmenot (статус: 3-ий класс), 7 января 2011, 14:12 [#6]:

Брутальненько так. И да, в переменной - мусор из стека. Гамма-функцию можно взять, от 170 точно грохнется =)
виконання програми розпочинається з того самого мiсця, де призупинилося.

KwaK

KwaK (статус: Посетитель), 7 января 2011, 16:07 [#7]:

Почему аналогично не написать сравнение с 170?:
sngFlag:=sqrt(170-sngVes);


тогда будет запускаться один и тот же обработчик на разные события >170 и <40. Поэтому и генерирую разные ошибки

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:26
Выполнено за 0.03 сек.