Форум: "Основная";
Текущий архив: 2002.08.05;
Скачать: [xml.tar.bz2];
ВнизDelphi 5 не реагирует на ошибки с плавающей точкой Найти похожие ветки
← →
Kudatsky (2002-07-22 10:13) [0]Delphi 5 не реагирует на ошибки с плавающей точкой.
Например:
procedure TForm2.Button1Click(Sender: TObject);
Var
A,B,C:Double;
begin
Try
A:=0;
B:=1;
C:=B/A;
Caption:=FloatToStr(C);
Except
Caption:="Ошибка";
end;
end;
В этом примере управление не попадает в Except, а в
Caption выводится "INF".
Похоже, что-то с отладчиком ?
← →
IlyaA (2002-07-22 10:25) [1]Посмотри в доке параметры компиляции. Там есть параметр. Ругаться или нет.
← →
IlyaA (2002-07-22 10:26) [2]А с отладчиком всё в порядке. Ошибка в коде ( ГЕНЕТИЧЕСКОМ).
ИЗВИНИ. Злая шутка вырвалась наружу
← →
VICTOR_ (2002-07-22 10:31) [3]Прверил, у меня Except обрабатывается. Попробуй поставить break-point на B:=1; и сделать трассировку(F7)
← →
kudatsky (2002-07-22 10:37) [4]За шутку извиню. Но только если подскажешь, какой папаметр.
Иначе буду являться по ночам угрызениями совести ;-)))
← →
kudatsky (2002-07-22 10:45) [5]Кое-что нашёл.
Если снять флажок "Integration debugging",
Except обрабатывается.
Но в варианте
A:=0;
B:=1;
C:=B/A;
Caption:=FloatToStr(C);
появляется сообщение "Floating point division by zero", а
остановки на строке с ошибкой не происходит
← →
Skier (2002-07-22 11:30) [6]>kudatsky
Debbuger Options|Language Exceptions|Stop on Delphi Exceptions ?
← →
kudatsky (2002-07-22 11:44) [7]Опция
Debbuger Options|Language Exceptions|Stop on Delphi Exceptions
включена
← →
Skier (2002-07-22 11:50) [8]>kudatsky
Debbuger Options|General|Integrated debugging := True
← →
kudatsky (2002-07-22 11:56) [9]Опция Integrated debugging включена.
← →
Skier (2002-07-22 11:57) [10]>kudatsky
И что ? На C:=B/A; не останавливается ?
← →
kudatsky (2002-07-22 12:02) [11]Не останавливается.
В Caption выводится "INF"
Может что на страницах OS Exception или Language Exception ?
← →
Skier (2002-07-22 12:08) [12]>kudatsky
У тебя в списке Exceptions на странице OS Exception есть
Float Devide By Zero ?
← →
Viewer (2002-07-22 12:10) [13]INF - infinity (так Борланд реагирует на эти шутки)
← →
kudatsky (2002-07-22 12:11) [14]Есть.
User program:=true
Run unhandled:=true
← →
IlyaA (2002-07-22 13:07) [15]В блоке try-except попробуй-
try
a:=b/0;
except
on EDivByZero do ShowMessage("Error");
end;
← →
kudatsky (2002-07-22 13:43) [16]Сделал.
Исключение не возбуждается.
← →
IlyaA (2002-07-22 13:45) [17]Похоже у тебя уже всё упало.
← →
kudatsky (2002-07-22 13:52) [18]Только-что инстолировал D5 на другую машину. То же самое. Что интересно, никакой реакции на
on E: Exception do ShowMessage("Error");
Может Delphi с глюками ?
← →
Слесарь Матерящийся (2002-07-22 13:59) [19]Может, дело в точности представления вещественного числа?
То есть, присваиваем чистый 0, а получаем 0 + погрешность, и в результате не-ноль.
Попробуйте то же самое с целыми числами.
← →
IlyaA (2002-07-22 14:01) [20]Вот енто из хэлпы. Может что и прояснит
EIntError is the base class for integer math error exceptions.
Unit
SysUtils
Description
EIntError is a generic integer math exception. Although it is never raised in the runtime library, it is the base from which other integer math exceptions descend. These are the integer math exceptions:
Exception Meaning
EDivByZero An attempt was made to divide by zero
ERangeError Number or expression out of range
EIntOverflow Integer operation overflowed
Run-time exception information is saved in fields provided by EExternal.
← →
kudatsky (2002-07-22 14:02) [21]С целыми числами всё в порядке, я уже пробовал.
← →
Слесарь Матерящийся (2002-07-22 15:11) [22]То-то и оно!
← →
kudatsky (2002-07-22 15:19) [23]????????????????
← →
tall (2002-07-22 16:00) [24]Я эту тему пеоднимал уже несколько раз. Кстати и в этой конфе тоже. Куда только не писал. Вразумительный ответ дали только в AMD (у меня эти глюки начались после того как пересел с Pentium 200MMX на AMD 1200. Думал может связано сплатформой). Там мне сказали, что это не глюк, а изменения в компиляторе в соответствии с требованиями новых стандартов ( типа ответ +INF или -INF (бесконечность) и тому подобное это не исключительная ситуация а нормальное явление). И отослели к технической документации по процессору( там, кстати, это действительно написано). Судя по всему это относится и Pentium платформе (мне писали об аналогичных проблемах на Celeron), т.е. характерно для всех новых процессоров. Решить эту проблему удалось только откатившись на DELPHI 4. Чего и вам советую.
← →
kudatsky (2002-07-23 10:27) [25]tall, если Вы ещё здесь!
Где это можно прочитать ?
← →
VICTOR_ (2002-07-23 11:48) [26]У тебя материнка на VIA логике?
← →
Viewer (2002-07-23 12:24) [27]ffmt.asm
; INF and NAN strings
INFNAN DB "INFNAN"
; function FloatToText(Buffer: PChar; const Value; ValueType: TFloatValue;
; Format: TFloatFormat; Precision, Digits: Integer): Integer;
sysutils.pas
function TextToFloat(Buffer: PChar; var Value;
ValueType: TFloatValue): Boolean;
{ FloatToDecimal converts a floating-point value to a decimal representation
that is suited for further formatting. The Value parameter must be a
variable of type Extended or Currency, as indicated by the ValueType
parameter. For values of type Extended, the Precision parameter specifies
the requested number of significant digits in the result--the allowed range
is 1..18. For values of type Currency, the Precision parameter is ignored,
and the implied precision of the conversion is 19 digits. The Decimals
parameter specifies the requested maximum number of digits to the left of
the decimal point in the result. Precision and Decimals together control
how the result is rounded. To produce a result that always has a given
number of significant digits regardless of the magnitude of the number,
specify 9999 for the Decimals parameter. The result of the conversion is
stored in the specified TFloatRec record as follows:
Exponent - Contains the magnitude of the number, i.e. the number of
significant digits to the right of the decimal point. The Exponent field
is negative if the absolute value of the number is less than one. If the
number is a NAN (not-a-number), Exponent is set to -32768. If the number
is INF or -INF (positive or negative infinity), Exponent is set to 32767.
Negative - True if the number is negative, False if the number is zero
or positive.
Digits - Contains up to 18 (for type Extended) or 19 (for type Currency)
significant digits followed by a null terminator. The implied decimal
point (if any) is not stored in Digits. Trailing zeros are removed, and
if the resulting number is zero, NAN, or INF, Digits contains nothing but
the null terminator. }
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.08.05;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.006 c