Допоможіть з Invalid floating point operation !!
Народ!
Підкажіть плиз що я роблю не так?
маємо змінні:
MaxRowId: integer;
r: double;
При спробі виконати: r: = MaxRowId / 2 вискакує помилка "Invalid floating point operation". Що я роблю не так?
причому якщо перед цим обчисленням постваіть ShowMessage (MaxRowId) все працює.
Адже ясно ж написано: "Invalid floating point operation". Зроби відповідні висновки.
procedure TForm1.FormCreate (Sender: TObject);
var
# XA0; MaxRowId: integer;
# XA0; R: double;
begin
# XA0; MaxRowId: = Handle;
# XA0; R: = MaxRowId / 2;
# XA0; ShowMessage (FloatToStr (R))
end;
І все працює. Значить, відповідь на питання "Що я роблю не так?" потрібно шукати в іншому місці коду.
) Я теж був учень здивований такому повороту подій, однак в MaxRowId завжди знаходилося нормальне нульове значення, та й до простого поділу на 2 особливо не причепишся. Може Delphi глюканул? У будь-якому випадку дякую всім! А я обійшовся без цього поділу :)
Були такі приколи, WinAPI в деяких місцях (частіше у викликах kernel32) змінює прапори співпроцесора - Delphi де може це фікс (SafeLoadLibrary наприклад), але в основному покладається на ексклюзивне володіння співпроцесором (і глобально незмінне стан), що іноді призводить до некоректно роботі System ._FSafeDivide.
Рятує asm FINIT end; перед поділом.
З.И. Глюк йде ще з часів BP7.0 / D1 під DPMI.
З.З.И. Причому глюк завжди саме при розподілі цілих з приведенням до плаваючою крапкою.
> Invalid floating point operation
А у мене таке часто траплялося на D7, коли з датами працював і брейкпойнти в процедурах обробки дат ставив. Ставиш точку переривання - отримуєш виняток, прибираєш - все работат як годинник.