Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.011 c
1-65955
AndreyA
2003-11-10 09:35
2003.11.20
Scroll


1-65934
BlackKing
2003-11-11 12:39
2003.11.20
Как определить, есть ли у компонента заданная функция?


14-66061
E1
2003-10-29 16:00
2003.11.20
Самое страшное место на Земле!!! =


8-66014
miek
2003-07-22 22:07
2003.11.20
2D-движок


1-65937
-=GaLaN=-
2003-11-11 14:52
2003.11.20
Изменение переменной в процедуре





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский