← →
Petrovski
(2006-10-16 17:22)
[0]
Источником информации через ADODataSet является хранимая процедура. При отображении/прокрутке информации в сетке появляется вышеуказанное сообщение. В самой процедуре из того, что могло бы влиять на ситуацию — умножение/деление смешанных целых и дробных значений. Может кто сталкивался с подобной ситуацией или знает, где искать причину ошибки?
← →
ANB ©
(2006-10-16 17:23)
[1]
Неправильная операция на числом с плавающей точкой.
← →
clickmaker ©
(2006-10-16 17:24)
[2]
Например, пытаешься из поля типа float получить целое (AsInteger)
← →
Stanislav ©
(2006-10-16 17:32)
[3]
Я с такой фигней сталкивался, когда запускал приложение под некоторыми win98, на XP было все ок!
Спасало обновление MDAC, либо копирование папки
Program FilesCommon FilesSystem
с рабочей win98 на нерабочую, когда это непомогало, спасала переустановка винды
← →
ANB ©
(2006-10-16 17:39)
[4]
Проверь типы полей в наборе данных. Скорее всего неправильно определились.
← →
clickmaker ©
(2006-10-16 18:11)
[5]
> спасала переустановка винды
ну-ну. «Если в кране нет воды, то виной тому — Винды»
← →
Petr V.Abramov
(2006-10-17 01:12)
[6]
это глюк, который м.б. от чего угодно, лечится патчами ADO, windows, программы
> clickmaker © (16.10.06 18:11) [5]
если глючит монитор — микрософт развертку спер
счет пришел за интернет — вот от микрософта вред
← →
Stanislav ©
(2006-10-17 08:36)
[7]
>clickmaker © (16.10.06 18:11) [5]
Не исключино что комп был заражен червем, может он чего-то наделал.
Разбираться небыло времени, быстрее было винду переставить.
← →
ANB ©
(2006-10-17 13:03)
[8]
> лечится патчами ADO, windows, программы
и мозгов
← →
Petrovski
(2006-10-17 13:21)
[9]
Никаких видимых нарушений в определении полей не нашел — поля типа Curency из MS SQL передаются как BCDField, Integer — как IntegerField.
Удалось локализовать источник ошибки. Это вычисляемое поле, в котором одно BCDField делилось на другое BCDField и умножалось на 100, причем только в том случае, если в числителе был 0.
Почему так — не понимаю.
Спасибо всем за соучастие.
← →
ANB ©
(2006-10-17 13:34)
[10]
> Petrovski (17.10.06 13:21) [9]
Вот это уже ближе.
1) Перенеси вычисления на сервер.
2) Имхо — у тебя там и в знаменателе 0. Поставь проверку — если ноль в числителе, то не считать ничего, сразу ноль писать (case).
← →
Petrovski
(2006-10-17 13:59)
[11]
> ANB [10]
Спасибо!
Я, собственно, и сделал по второму варианту. (Нулей в знаменателе нет). Сейчас попробую и первый вариант реализовать.
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже.
Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; Edit5: TEdit; Edit6: TEdit; Edit7: TEdit; Edit8: TEdit; Button1: TButton; Edit9: TEdit; Edit10: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label8: TLabel; Label9: TLabel; Label10: TLabel; Label11: TLabel; Label12: TLabel; Label13: TLabel; Label14: TLabel; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; dHandle : THandle; implementation {$R *.dfm} function SSS (AB,DC,S1,S2,BD:real;H,x1,x2,x3,y1,y2,y3,x4,y4:integer):real; external 'dll3.dll'; procedure TForm1.Button1Click(Sender: TObject); var AB,DC,S1,S2,BD,d:real; H,x1,x2,x3,y1,y2,y3,x4,y4:integer; SSS: function(AB,DC,S1,S2,BD:real;H,x1,x2,x3,y1,y2,y3,x4,y4:integer):real; stdcall; begin @SSS:=nil; dHandle:=LoadLibrary('dll3.dll'); if dHandle<>0 then begin @SSS:=GetProcAddress(dHandle,'SSS'); if @SSS<>nil then begin x1:=StrToInt(edit1.Text); y1:=StrToInt(edit2.Text); x2:=StrToInt(edit3.Text); y2:=StrToInt(edit4.Text); x3:=StrToInt(edit5.Text); y3:=StrToInt(edit6.Text); x4:=StrToInt(edit7.Text); y4:=StrToInt(edit8.Text); D:=SSS(AB,DC,S1,S2,BD,H,x1,x2,x3,x4,y1,y2,y3,y4); \ Пишет что здесь ошибка "invalid floating point operation" Edit9.Text:=FloatToStr(S1); Edit10.Text:=FloatToStr(S2); end else begin ShowMessage('ошибка.Функция не найдена в DLL'); Exit; end; FreeLibrary(dHandle); end else begin ShowMessage('Ошибка.Библиотека не найдена'); Exit; end; end; end. |
Здравствуйте!
Часто начала появляться ошибка «invalid floating point operation», обычно закрывается нажатием кнопки «ОК». Ошибка появляется при заполнении/редактировании сметы.
Не могу понять причину появления ошибки и её связь с какими либо действиями. Иногда совсем не появляется. Иногда появляется один раз и закрывается нажатием кнопки «ОК». А иногда появляется окно с ошибкой, при нажатии на кнопку «ОК» ошибка закрывается и тут же появляется это же окно с ошибкой, далее программу приходится закрывать из диспетчера задач.
А иногда, после нескольких появлений вышеуказанной ошибки, РИК самостоятельно закрывается без каких либо сообщений.
Подозреваю что, что-то не так с системой, так как на другом компе проблем не возникает.
Система Win10, ошибка начала появляться после последнего крупного обновления винды за май 2020.
Если кто знает решение данной проблемы, будьте добры, помогите пожалуйста… усталлл
Код на Delphi. После запуска ввожу в поле значение для H (с запятой, т.к вещественное число), запускаю сию процедуру. Выскакивает ошибка «Invalid floating point operation». Помогите найти, пожалуйста.
procedure TForm1.Button1Click(Sender: TObject);
const
Xmin = -3.0;
Xmax = 3.0;
var
W, y, H, x: real;
i: integer;
begin
i := 1;
x := Xmin;
Series1.Clear;
H := StrToFloat(Edit1.Text);
StringGrid1.Cells[0, 0] := 'x';
StringGrid1.Cells[1, 0] := 'W';
StringGrid1.Cells[2, 0] := 'y';
repeat
if ((x > 0.1) and (x < 2.0)) then
W := ln(x) + Exp((1 / 3) * ln(x))
else if (x <= 0.1) then
W := 4 * x + Exp(2 * ln(Sin(x)))
else
W := 2.6 * Exp(2 * ln(x) - 3.7);
y := (ln(Exp(2*ln(W)) + W + 1) * cos(4 * x)) / (Exp(-2) + 2);
Series1.AddXY(x, y);
StringGrid1.Cells[0, i] := FloatToStr(y);
StringGrid1.Cells[1, i] := FloatToStr(W);
StringGrid1.Cells[2, i] := FloatToStr(x);
x := x + H;
i := i + 1;
until x >= Xmax;
end;