| 
| 
 | Вопрос # 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. Поэтому и генерирую разные ошибки
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |