![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| drkot |
|
|||
![]() Ищущий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1042 Регистрация: 5.5.2006 Репутация: 5 Всего: 8 |
операционка XP
при выполнении ниже приведенного кода не возникает исключение причем floattostr® = 'INF'
в 2003, 2008 исключение возникает нормально может кто подскажет в чем дело и как это дело привести к норме. Добавлено через 1 минуту и 56 секунд пока такая ситуация выявлена только при делении на ноль -------------------- Ошибка не становится истиной по причине широкого распространения, как и Истина не становится Ошибкой из-за того, что никто её не видит. |
|||
|
||||
| northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: 8 Всего: 20 |
Если код в точности такой, то исключения и не должно возникать никогда. Ибо операции деления в исполняемом коде не будет. Компилятор её не включит в код. -------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
| drkot |
|
|||
![]() Ищущий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1042 Регистрация: 5.5.2006 Репутация: 5 Всего: 8 |
и с каких это он ее не включит? Это сообщение отредактировал(а) bems - 10.1.2012, 01:23 -------------------- Ошибка не становится истиной по причине широкого распространения, как и Истина не становится Ошибкой из-за того, что никто её не видит. |
|||
|
||||
| northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: 8 Всего: 20 |
С очень давних пор, компилятор Дельфи научился не включать в исполняемый код заведомо неверные операции. То бишь. Если на этапе компиляции компилятор уверен, что будет "деление на ноль", он эту операцию в код не включит! Для проверки достаточно включить сей код в проект, поставить breakepoint и посмотреть ViewCPU. За Д1-Д3 не ручаюсь. Это сообщение отредактировал(а) bems - 10.1.2012, 01:31 -------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
SetExceptionMask(GetExceptionMask - [exZeroDivide]);
это юнит Math. В старых версиях возможно только SetFpuExceptionMask Модератор: northener, drkot, прекращаем спор о личностях Это сообщение отредактировал(а) bems - 10.1.2012, 01:27 -------------------- Обижено школьников: 8 |
|||
|
||||
| drkot |
|
|||
![]() Ищущий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1042 Регистрация: 5.5.2006 Репутация: 5 Всего: 8 |
bems, уже прекратил
можно чуть яснее, как для тупых полуночников Это сообщение отредактировал(а) bems - 10.1.2012, 01:35 -------------------- Ошибка не становится истиной по причине широкого распространения, как и Истина не становится Ошибкой из-за того, что никто её не видит. |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
попробуй перед этим твоим куском кода выполнить SetExceptionMask(GetExceptionMask + [exZeroDivide]);
Если исключение вернется, значит какой-то из подключаемых юнитов выключил тебе это исключение (с помощью той же SetExceptionMask). Как она работает можно узнать в хелпе (вкратце если exZeroDivide есть в маске, то исключения нет, иначе исключение есть) Добавлено через 3 минуты и 16 секунд эт оя о версии дельфи. Если в юните Math у тебя нету SetExceptionMask, то пробуешь вместо неё SetFpuExceptionMask Добавлено через 7 минут и 3 секунды
-------------------- Обижено школьников: 8 |
|||
|
||||
| drkot |
|
|||
![]() Ищущий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1042 Регистрация: 5.5.2006 Репутация: 5 Всего: 8 |
к сожалению не помогает.
данная ситуация наблюдается только в XP, в серверных системах все отрабатывает нормально. возможно это особенность ядра а не delphi Добавлено через 10 минут и 39 секунд bems, в любом случае спасибо буду переделывать алгоритм -------------------- Ошибка не становится истиной по причине широкого распространения, как и Истина не становится Ошибкой из-за того, что никто её не видит. |
|||
|
||||
| БелАмор |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 10.6.2010 Где: Россия Репутация: 5 Всего: 17 |
GetExceptionMask/SetExceptionMask работают с управляющим словом сопроцессора, которое может испортить любая программа.
Почитайте об этом здесь: Неочевидные особенности вещественных чисел Кстати:
Внимательнее читаем справку: "Call SetExceptionMask to specify the types of exceptions the FPU (floating-point unit) generates. Any element set in this mask prevents the FPU from raising the corresponding type of exception. Instead, the FPU returns its best attempt at a value – often NaN, Infinity, or NegInfinity." Перевод подчёркнутого: Любой элемент множества в этой маске предотвращает возникновение соответствующего типа исключения. Это сообщение отредактировал(а) БелАмор - 10.1.2012, 06:34 |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
в первый раз я написал правильно, кста. при повторном объяснении перепутал
Это сообщение отредактировал(а) bems - 10.1.2012, 21:41 -------------------- Обижено школьников: 8 |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
-------------------- Обижено школьников: 8 |
|||
|
||||
| northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: 8 Всего: 20 |
2 bems
Я тоже прекратил. И даже не стал отвечать на приватное письмо ТС. Но вот кто мне тогда скажет почему на Д2007 такой код:
Проверено и с {$O+} и с {$O-} -------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
у меня нет 2007 под рукой, но попробуй добавить в конец вывод r в консоль
-------------------- Обижено школьников: 8 |
|||
|
||||
| northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: 8 Всего: 20 |
Но ТС ничего не говорил о каком-то выводе результата деления. Он только упомянул что-то про "floattostr® = 'INF'". -------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
ну это означает что у деления таки есть результат. А если нет использования результата (например вывода) компилятор вообще вправе выкинуть переменную
Это сообщение отредактировал(а) bems - 11.1.2012, 01:30 -------------------- Обижено школьников: 8 |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |