Форум: "Основная";
Текущий архив: 2003.11.20;
Скачать: [xml.tar.bz2];
ВнизДеление на ноль Найти похожие ветки
← →
Murad (2003-11-11 11:00) [0]Люди, подскажите в чем дело...
На строке номер 2 исключение не поднимается, хотя должно было быть деление на 0.
Но регистр сопроцессора ZE становится = 1
0 MaxDist := 0;
1 try
2 coef1 := -dist1 / (maxDist * 1.3);
3 if coef1 < 0 then coef1 := 0;
4 except
5 on E: EMathError do coef1 := 0;
6 end;
← →
Dimka Maslov (2003-11-11 11:02) [1]При работе из-под отладчика исключения такого рода не возникают, а результат операции принимает значание INF или NAN. При самостоятельной работе возникают исключения.
← →
Skier (2003-11-11 11:03) [2]Какой знакомый код ! :)
← →
Плохиш_ (2003-11-11 11:06) [3]>Dimka Maslov © (11.11.03 11:02) [1]
В данном примере, телепаты говорят MaxDist есть локальная переменная, поэтому компилятор подставляет в выражение константу 0 и ресультат получается INF не зависимо от отладчика.
Сделай MaxDist глобальной и присвой 0 в соседней процедуре и получишь исключение.
← →
Murad (2003-11-11 11:18) [4]2Плохиш_
Я тут обманул немного всех
MaxDist := f(x);
Т.е. там не простое присвоени 0, а вычисление, результат
которого = 0
← →
Murad (2003-11-11 11:23) [5]2Плохиш_
Твоя Пифия тебя обманула... MaxDist - поле объекта, в чьем
методе мы находимся...
← →
Anatoly Podgoretsky (2003-11-11 11:27) [6]И мы должны гадать, что такое
MaxDist, coef1, dist1, f(x)
← →
Murad (2003-11-11 11:34) [7]2Dimka Maslov
Если бы было, как ты говоришь, то у нас логика выполнения
программы зависила бы от того в отладчике мы или нет...
То что ты написал - не верно. (Я проверял, через ShowMessage)
← →
Murad (2003-11-11 11:35) [8]2Anatoly Podgoretsky
Мне никто ничего не должен... особенно Вы
← →
Anatoly Podgoretsky (2003-11-11 11:35) [9]И ты хочешь получить ответ?
← →
Думкин (2003-11-11 11:36) [10]А откуда ты знаешь, что там 0?
← →
Anatoly Podgoretsky (2003-11-11 11:40) [11]dist1 это константа
← →
REA (2003-11-11 11:43) [12]А они кстати не отключены?
← →
Murad (2003-11-11 11:44) [13]2Думкин
1. Отладчик показывает (хотя я понимаю что это не очень надежно)
2. if maxDist = 0 then showMessage("00000000"); {Высвечивается}
3. После выполнения строки 2, coef1 = INF (хотя это тоже
отладчик показывает)
2Anatoly Podgoretsky
Хочу, но Ваш агрессивный тон мне не понятен... Вы мне вчера
объясняли что модерируете потрепаться, так-как многие посты
противно читать... когда нормальный разговор взвинчивают,
таким образом как Вы, это тоже противно читать...
← →
Murad (2003-11-11 11:48) [14]2Anatoly Podgoretsky
Нет, не константа
MaxDist : Double
coef1, dist1 : Single
2REA
Нет, не отключены
← →
REA (2003-11-11 11:52) [15]Если подключать Си библиотеки или там OpenGL то с мат. сопроцессором могут происходить разные забавные вещи. Как это обходить я уже не помню, но была такая информация (типа вставки asm инструкций).
← →
Anatoly Podgoretsky (2003-11-11 11:53) [16]Murad © (11.11.03 11:44) [13]
Ты все перепутал, это тебе Игорь Шевченко объяснял и не место здесь это обсуждать.
У тебя спросил привести подробную информацию о типах, но ты почему то полех на дыбы. Твой вопрос выглядит так 0 мужики у меня программа не работает, помогите. Вытягивать же информацию из тебя приходится по крохам, отсюда впечателение, что это именно нам нужно.
← →
Murad (2003-11-11 11:54) [17]2REA
Я как раз об этом хотел написать.. там подключается OPENGL
← →
Murad (2003-11-11 11:58) [18]2Anatoly Podgoretsky ©
>Ты все перепутал...
Согласен, но тем не менее...
>У тебя спросил привести подробную информацию о типах
Фраза "И мы должны гадать, что такое MaxDist, coef1, dist1, f
(x)" мной за нормальный вопрос не воспринимается, а
воспринимается как эдакая бравада и снисхождение...
← →
Murad (2003-11-11 12:01) [19]2REA © (11.11.03 11:52) [15]
Да, я и сделал этот обход...
вставка asm FINIT; end; все исправляет,
но я считаю что такой сброс флагов, не очень корректен,
и буду стараться его избежать...
← →
Anatoly Podgoretsky (2003-11-11 12:02) [20]REA © (11.11.03 11:52) [15]
Есть такое дело, некоторые библиотеки меняют флаги процессора.
Но для данного примера если убрать замаскированое исключение, как положено вылетает ошибка деления, и естественно она не вылетает, поскольку автор это запретил.
В тестовом примере только одно изменение, dist1 := 1;
← →
REA (2003-11-11 12:03) [21]Нет гарантиии что он же не отключает исключения. Попробуй их включить (Set8087CW кажется).
← →
REA (2003-11-11 12:05) [22]Ну в принципе да - константы он не вычислит, если не обмануть.
← →
Anatoly Podgoretsky (2003-11-11 12:07) [23]Как же не отключает, именно отключает, явно сказано обрабатывать EMathError
4 except
5 on E: EMathError do coef1 := 0;
6 end;
остальное игнорировать, если бы была добавлена обработка и других исключений, то было бы все нормально, а так все кроме EMathError отключено.
← →
Murad (2003-11-11 12:08) [24]2REA © (11.11.03 12:03) [21]
Все я это уже делал...
2Anatoly Podgoretsky
> В тестовом примере только одно изменение, dist1 := 1;
Что Вы имеете ввиду? Строчка не очень понятна
← →
Murad (2003-11-11 12:11) [25]2Anatoly Podgoretsky © (11.11.03 12:07) [23]
Я здесь отчасти виноват... не написал, что даже если
написать просто
4 except
5 ShowMessage("EEE")
6 end;
то сообщение не высветится (управление не пройдет по строке 5),
← →
Anatoly Podgoretsky (2003-11-11 12:11) [26]Чего не понятного, что бы dist1 не оказалась неинициализированной, в твой пример добавлена эта строка и других изменений нет. Если же убрать отключения обработки исключений то возникает ошибка деления на ноле и наоборот.
В данном примере достаточно написать так
except
coef1 := 0;
end;
← →
Anatoly Podgoretsky (2003-11-11 12:12) [27]Murad © (11.11.03 12:11) [25]
У меня высвечивается
← →
Murad (2003-11-11 12:19) [28]Все нашел... я случайно написал
SetExceptionMask(excMsk+[exZeroDivide]);
а надо было
SetExceptionMask(excMsk-[exZeroDivide]);
2REA & Anatoly Podgoretsky
Большое спасибо за помощь
← →
Anatoly Podgoretsky (2003-11-11 12:25) [29]Это истинная причина, но точно также ты этот код не привел, а насколько я понимаю это твой код
SetExceptionMask(excMsk+[exZeroDivide]);
← →
Murad (2003-11-11 12:37) [30]2Anatoly Podgoretsky
Да это мой код(Вернее код который мне приходится
сопровождать), согласен... Просто я не мог привести весь
код, (а вызов SetExceptionMask(excMsk+[exZeroDivide])
вообще в другом месте ) поэтому привел, тот, в котором (КАК Я
ДУМАЛ :(() ошибка.
А оказалось, что я не правильно понял описание
функции SetExceptionMask, и взвел(оставил взведенным) флаг
exZeroDivide, хотя надо было его снять... Наличие этого флага - это требование OPENGL, видимо при инициализации OPENGL его
взводит. А логика программы к этому не готова... :((( :)).
Еще раз всем большое спасибо.
← →
Anatoly Podgoretsky (2003-11-11 13:12) [31]Это к тому, что без приведения информации, очень трудно дать квалифицированный совет, особенно в таком случае и чем подробнее ты приведешь, тем меньше будет воды в ветке.
И тут нет ничего личного.
Кстати очень редко использвемое программистами, на этот уровень обычно не лезут.
← →
Murad (2003-11-11 13:26) [32]2Anatoly Podgoretsky
> Кстати очень редко использвемое программистами, на этот
уровень обычно не лезут.
Да и я бы не полез, а что делать, иначе далее все начинает
валиться с жуткой руганью... Мне даже несколько функций
пришлось из D6 в D5 перевести, в том числе и SetExceptionMask
← →
Anatoly Podgoretsky (2003-11-11 13:35) [33]Кстати деже если не лезть самому, то это могут сделать и другие, на что мы намекнули, а вот это будет самое отвратительное, не только по исключением, но и по округлению, программа работает, но временами непонятно по каким причинам выдает неправильные результаты. Мне пришлось как наблюдать в борландовских конференциях поиск подобных блох. Сейчас уже не помню на что именно ыли жалобы, но неприятность состояла в каких то системных билиотеках и вроде OpenGl тоже вспоминали.
← →
Murad (2003-11-11 13:55) [34]2Anatoly Podgoretsky
> Кстати деже если не лезть самому, то это могут сделать и
другие, на что мы намекнули...
Это было одно из первых о чем я и подумал, еще до того как
написал в форум. Именно поэтому я и перенес SetExceptionMask
из D6 в D5. И как оказалось - я был прав... Просто я неверно
(невнимательно) прочитал хелп и поэтому это не дало
результатов... Вот тогда я и написал в форум, т.е. это была
крайняя мера... И пост REA © (11.11.03 12:03) [21] ,
натолкнул меня на мысль, что я был на правильном пути, просто
что-то не учел.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.11.20;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.012 c