Я продолжаю получать эту ошибку «Недопустимая операция с плавающей запятой».
Я на Делфи 7.
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
TlHelp32, Dialogs, StdCtrls, ExtCtrls, Buttons, ComCtrls;
var //global
PHandle, cancel, bytes, scantype: integer;
...
procedure Tmain.scanbtnClick(Sender: TObject);
var max, address: Integer;
floatinput, floatinput1, floatinput2, datafloat: Real;
x: cardinal;
itm: TListItem;
begin
floatinput := StrToFloat(Trim(valueinput.Text));
floatinput1 := StrToFloat(Trim(valueinput1.Text));
floatinput2 := StrToFloat(Trim(valueinput2.Text));
if floatinput2 < floatinput1 then
begin
floatinput1 := floatinput1 + floatinput2;
floatinput2 := floatinput1 - floatinput2;
floatinput1 := floatinput1 - floatinput2;
end;
result.Show;
x := 0;
address := 0;
result.resultlist.Clear;
repeat
Application.ProcessMessages;
statusbar1.Panels.Items[1].Text := 'Searching... ' + IntToStr(address * 100 div max) + '% (' + IntToStr(address div bytes) + ' out of ' + IntToStr(max div bytes) + ').';
if ReadprocessMemory(PHandle, Ptr(address), @datafloat, bytes, x) then
begin
if (x > 0) then
begin
if scantype = 0 then
begin
if datafloat = floatinput then //error here
begin
itm := result.resultlist.Items.Add;
itm.Caption := '0x' + IntToHex(address,8);
itm.SubItems.Add(FormatFloat('0.0#########', datafloat));
end;
end;
if scantype = 1 then
begin
if datafloat > floatinput //also here
then begin
itm := result.resultlist.Items.Add;
itm.Caption := '0x' + IntToHex(address,8);
itm.SubItems.Add(FormatFloat('0.0#########', datafloat));
end;
end;
if scantype = 2 then
begin
if datafloat < floatinput //here too
then begin
itm := result.resultlist.Items.Add;
itm.Caption := '0x' + IntToHex(address,8);
itm.SubItems.Add(FormatFloat('0.0#########', datafloat));
end;
end;
if scantype = 2 then
begin
if (dataint <= intinput2) and (dataint >= intinput1) //even here
then begin
itm := result.resultlist.Items.Add;
itm.Caption := '0x' + IntToHex(address,8);
itm.SubItems.Add(FormatFloat('0.0#########', datafloat));
end;
end;
end;
end;
if x <> 0
then address := address + x
else address := address + bytes;
until (address >= Max) or (cancel = 1);
end;
Я даже проверил окно процессора, и это происходит потому, что он пытается загрузить значение с плавающей запятой из указателя, указывающего на нулевое значение.
Это не ReadMemory, потому что этот небольшой фрагмент кода находится в цикле while и возвращает несколько допустимых значений, прежде чем столкнуться с этой ошибкой.
Что я должен делать?
Заранее спасибо.
NULL
в Delphi — это использование вариантов. Опубликуйте полный фактический код, который вы используете. Просить нас отладить код, который на самом деле не является вашим кодом, — пустая трата как вашего, так и нашего времени. Опубликуйте компилируемый MCVE, демонстрирующий проблему, если вам нужна помощь здесь. - person Ken White   schedule 27.11.2015Null
используется для вариантов, а не для простых типов данных.real
не может быть равно нулю или дажеNil
, если на то пошло, это не похоже на типы, допускающие значение null, в .net. - person Gerry Coll   schedule 27.11.2015result
иTmain
) и не имеют отношения к проблеме, другой код пользовательского интерфейса (список и редактирование), который также не имеет смысла для вопроса . Консольное приложение без содержимого пользовательского интерфейса было бы значительно лучше. Кроме того, почему вы просто произвольноReadProcessMemory
вводите значения в элементы управления редактированием, а затем делаете предположение, что то, что вы читаете, будет значением с плавающей запятой? - person Ken White   schedule 27.11.2015