Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> не возникает исключение, в windows XP 
V
    Опции темы
drkot
Дата 9.1.2012, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 5
Всего: 8



операционка XP
при выполнении ниже приведенного кода не возникает исключение
причем floattostr® = 'INF'

Код

  a:=0;
  b:=1;
  try
    r:=b/a;
    ShowMessage('нет исключения');
   except
    ShowMessage('исключение');
  end;



в 2003, 2008 исключение возникает нормально

может кто подскажет в чем дело и как это дело привести к норме.

Добавлено через 1 минуту и 56 секунд
пока такая ситуация выявлена только при делении на ноль


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
northener
Дата 9.1.2012, 23:45 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 8
Всего: 20



Цитата(drkot @  9.1.2012,  23:33 Найти цитируемый пост)
  a:=0;
  b:=1;
  try
    r:=b/a;

Если код в точности такой, то исключения и не должно возникать никогда. Ибо операции деления в исполняемом коде не будет. Компилятор её не включит в код.


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
drkot
Дата 10.1.2012, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 5
Всего: 8




и с каких это он ее не включит? 


Это сообщение отредактировал(а) bems - 10.1.2012, 01:23


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
northener
Дата 10.1.2012, 00:43 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 8
Всего: 20



Цитата(drkot @  10.1.2012,  00:11 Найти цитируемый пост)

и с каких это он ее не включит? 



С очень давних пор,  компилятор Дельфи научился не включать в исполняемый код заведомо неверные операции. 
То бишь. Если на этапе компиляции компилятор уверен, что будет "деление на ноль", он эту операцию в код не включит!

Для проверки достаточно включить сей код в проект, поставить breakepoint и посмотреть ViewCPU.
За Д1-Д3 не ручаюсь.

Это сообщение отредактировал(а) bems - 10.1.2012, 01:31


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
bems
Дата 10.1.2012, 01:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



SetExceptionMask(GetExceptionMask - [exZeroDivide]);
это юнит Math. В старых версиях возможно только SetFpuExceptionMask

Модератор: northener, drkot, прекращаем спор о личностях

Это сообщение отредактировал(а) bems - 10.1.2012, 01:27


--------------------
Обижено школьников: 8
PM MAIL   Вверх
drkot
Дата 10.1.2012, 01:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 5
Всего: 8




bems,  уже прекратил

Цитата(bems @  10.1.2012,  01:22 Найти цитируемый пост)
SetExceptionMask(GetExceptionMask - [exZeroDivide]);это юнит Math. В старых версиях возможно только SetFpuExceptionMask

можно чуть яснее, как для тупых полуночников

Это сообщение отредактировал(а) bems - 10.1.2012, 01:35


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
bems
Дата 10.1.2012, 01:34 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



попробуй перед этим твоим куском кода выполнить SetExceptionMask(GetExceptionMask + [exZeroDivide]); 
Если исключение вернется, значит какой-то из подключаемых юнитов выключил тебе это исключение (с помощью той же SetExceptionMask). Как она работает можно узнать в хелпе (вкратце если exZeroDivide есть в маске, то исключения нет, иначе исключение есть)

Добавлено через 3 минуты и 16 секунд
Цитата(bems @  10.1.2012,  01:22 Найти цитируемый пост)
В старых версиях возможно только SetFpuExceptionMask

эт оя о версии дельфи. Если в юните Math у тебя нету SetExceptionMask, то пробуешь вместо неё SetFpuExceptionMask

Добавлено через 7 минут и 3 секунды
Цитата(northener @  10.1.2012,  00:43 Найти цитируемый пост)
Если на этапе компиляции компилятор уверен, что будет "деление на ноль", он эту операцию в код не включит!
под ХЕ2 мне удалось воспроизвести это только если результат операции нигде не используется (и вручную включить оптимизацию, потому что её убрали в дебажной версии)



--------------------
Обижено школьников: 8
PM MAIL   Вверх
drkot
Дата 10.1.2012, 01:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 5
Всего: 8



к сожалению не помогает.
данная ситуация наблюдается только в XP, в серверных системах все отрабатывает нормально.
возможно это особенность ядра а не delphi

Добавлено через 10 минут и 39 секунд
bems,  в любом случае спасибо
буду переделывать алгоритм


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
БелАмор
Дата 10.1.2012, 06:15 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 10.6.2010
Где: Россия

Репутация: 5
Всего: 17



GetExceptionMask/SetExceptionMask работают с управляющим словом сопроцессора, которое может испортить любая программа.
Почитайте об этом здесь:
Неочевидные особенности вещественных чисел

Кстати:
Цитата(bems @  10.1.2012,  01:34 Найти цитируемый пост)
попробуй перед этим твоим куском кода выполнить SetExceptionMask(GetExceptionMask + [exZeroDivide]); 

Внимательнее читаем справку:
"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
PM   Вверх
bems
Дата 10.1.2012, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Цитата(БелАмор @  10.1.2012,  06:15 Найти цитируемый пост)
Внимательнее читаем справку:
в первый раз я написал правильно, кста. при повторном объяснении перепутал




Это сообщение отредактировал(а) bems - 10.1.2012, 21:41


--------------------
Обижено школьников: 8
PM MAIL   Вверх
bems
Дата 10.1.2012, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Цитата(БелАмор @  10.1.2012,  06:15 Найти цитируемый пост)
GetExceptionMask/SetExceptionMask работают с управляющим словом сопроцессора, которое может испортить любая программа.
нет, только код, работающий в том же процессе



--------------------
Обижено школьников: 8
PM MAIL   Вверх
northener
Дата 11.1.2012, 01:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 8
Всего: 20



2 bems
Я тоже прекратил. И даже не стал отвечать на приватное письмо ТС.

Но вот кто мне тогда скажет почему на Д2007 такой код:
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  a , b : Integer;
  r : Extended;
begin
  a:=0;
  b:=1;
  try
    r:=b/a;
    ShowMessage('нет исключения');
   except
    ShowMessage('исключение');
  end;
end;
 не только не выдаёт исключение, но и на брейпойнты плюёт?
Проверено и с {$O+}  и с {$O-}


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
bems
Дата 11.1.2012, 01:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



у меня нет 2007 под рукой, но попробуй добавить в конец вывод r в консоль


--------------------
Обижено школьников: 8
PM MAIL   Вверх
northener
Дата 11.1.2012, 01:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 8
Всего: 20



Цитата(bems @  11.1.2012,  01:20 Найти цитируемый пост)
у меня нет 2007 под рукой, но попробуй добавить в конец вывод r в консоль 

Но ТС ничего не говорил о каком-то выводе результата деления. Он только упомянул что-то про "floattostr® = 'INF'".



--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
bems
Дата 11.1.2012, 01:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



ну это означает что у деления таки есть результат. А если нет использования результата (например вывода) компилятор вообще вправе выкинуть переменную

Это сообщение отредактировал(а) bems - 11.1.2012, 01:30


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0672 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.