![]() |
verzweifle an fließkommazahlen....:-(
Hallo,
ich sitze hier schon stundenlang an einem vermutlich simplen Problem aber ich weiß ehrlich gesagt absolut nicht mehr weiter... :gruebel: :wall: :( Also folgendes: Ich schreibe mir in das folgende Array ein paar Speicherinhalte
Code:
wenn ich mir das zur Laufzeit ansehe, was da so drin steht dann ist das z.b. sowas hier: 2.121995791e-314
buffer:array[1..100000] of double;
Jetzt möchte ich diese Zahl mit einer Integer bzw. Longint vergleichen aber egal was ich anstelle ob ich versuche die mit round auf ne Integer-Zahl zu runden oder einfach per floattostr zu nem string konventieren will bekomme ich immer den fehler: Üngültige Gleitkommaoperation Wie kann man so ne Zahl handlen damit man sie mit ner Integer-zahl vergleichen kann...bzw. wie bekomme ich die Integer-Zahl auf dieses Format damit ich sie direkt vergleichen kann... Das nächste Problem ist nämlich die Umwandlung der Double dauert ziemlich lang daher wäre es praktisch wenn man die Integer Zahl anpassen könnte.... Wäre Euch sehr dankbar wenn Ihr da ne Idee hättet.... Bis denne.... |
Re: verzweifle an fließkommazahlen....:-(
Herzlich willkommen in der Delphi-PRAXiS, DJ_Tom.
2.122e-314 ist aus Integer-Sicht nahe bei 0. Was willst du da noch vergleichen? Ansonsten funktionieren Round() und Trunc() auch in Verbindung mit Int64 - zumindest mit meiner Delphi Version. Grüße vom marabu |
Re: verzweifle an fließkommazahlen....:-(
Zitat:
a) mit Round in einen Integerwert (nämlich 0) umgewandelt b) mit FloatToStr korrekt ausgegeben. Bei anderen Werten, (die den Bereich eines Integers überschreiten) wird natürlich die Round Funktion nicht mitspielen, FloatToStr sollte aber funktionieren. Aber es gibt ein paar spezielle Werte, bei denen die FPU eine Exception auslöst. Zitat:
Velleicht beschreibst Du mal, wie Du das Array gefüllt hast. |
Re: verzweifle an fließkommazahlen....:-(
erstmal danke für die schnellen antworten....
also zz benutzte ich folgenden code:
Code:
ich habe einfach mal angenommen das meine gesuchte zahl im bereich FFFFFF bis FFFFFFF liegt, dass müßte eigentlich immer reichen....a:=16777215; while a < 268435455 do begin readprocessmemory(HandleWindow, ptr(a),@buffer, sizeof(buffer), bytesread); for b:= 1 to 100000 do begin if buffer[b] = MeineGesuchteIntegerZahl then begin //habe wert gefunden... end; end; a:=a+100000; end; wenn ich den wert mit artmoney suche dann muss ich nach einem "float 8 Byte" wert suchen oder gibt es eine bessere möglichkeit den speicher nach einer float 8 byte zahl zu durchsuchen? bye Tommy |
Re: verzweifle an fließkommazahlen....:-(
Wenn ich das richtig verstehe, dann transferierst Du mit readprocessmemory einen bestimmten Speicherbereich in Deinen Buffer und nimmst einfach als gegeben an, daß der Speicherbereich den Du in den buffer lädst ausschließich aus Double-Werten besteht.
Wer sagt Dir denn, daß das so ist ? Und dann verläßt Du Dich darauf, daß auch tatsächlich der Buffer vollständig gefüllt ist. Die tatsächlich geladene Anzahl Bytes steht in bytesread, und nur auf den Wert solltest Du Dich verlassen. |
Re: verzweifle an fließkommazahlen....:-(
Hallo Tommy,
was auch immer du vorhast - die Suche nach einem double value funktioniert ohne Konvertierungsroutinen. Verwende einfach SysUtils.CompareMem() und alles wird gut. Grüße vom marabu |
Re: verzweifle an fließkommazahlen....:-(
@Amateurprofi
hmmm ja hast schon recht aber wie soll ich denn nur die double werte auslesen? das mit dem bytesread klingt logisch sollte man berücksichtigen... @marabu :thumb: erstmal thx die compareMem funktion ist wirklich spitze.... wenn ich weiß welche adresse ich auslesen muß funktioniert das mit der funktion super, aber problematisch wird es immer dann wenn ich versuche den speicher in ein array zu packen und später wieder auszuwerten und wie mir scheint kann compareMem ja nicht direkt speicherinhalte von anderen programmen vergleichen oder?! also das ganze funktion wenn ich den buffer als normale double deklariere und jede adresse einzeln durchgehe nur das dauert bei dem umfang des durchzugehenden speichers natürlich ewig... daher nehme ich mal an man muß schon sowas wie mit dem array machen oder? :gruebel: |
Re: verzweifle an fließkommazahlen....:-(
Ich versuche gerade zu verstehen, was du da eigentlich machst. Du suchst einen Integerwert im Hauptspeicher eines anderen Programms? Dazu besorgst du dir den Speicherinhalt in großen Blöcken. Du scheinst davon auszugehen, dass dein Integer-Wert als Double mit festem Alignment gespeichert ist. Darüberhinaus gibt es noch die Fallstricke, auf die dich Amateurprofi hingewiesen hat.
Wenn ein binärer Vergleich zulässig ist, dann kannst du deine Schleife über das Array dadurch beschleunigen, dass du einen Zeiger schiebst:
Delphi-Quellcode:
marabu
var
pd: PDouble; d: Double; i: integer; begin d := 123456; pd := @buffer[1]; for i := 1 to 100000 do // beachte die Obergrenze begin if pd^ = d then Break else Inc(pd); end; // d gefunden bei index i, wenn i <= 1000000 end; Letzten Kommentar präzisiert - wegen Klaus... |
Re: verzweifle an fließkommazahlen....:-(
marabu: sehr schöne und schnelle Lösung
Ich würde das dann aber besser so formulieren
Delphi-Quellcode:
Warum :
var
pd: PDouble; d: Double; i: integer; begin d := 123456; pd := @buffer[1]; for i := 1 to 100000 do // beachte die Obergrenze begin if int64(pd^) = int64(d) then begin // d gefunden bei index i exit; end else Inc(pd); end; // d nicht gefunden end; Wenn der Wert nicht gefunden wurde kommt man nach Beendigung der for-schleife auch zu Deinem "Gefunden" Abschnitt. Gruß, Klaus |
Re: verzweifle an fließkommazahlen....:-(
also zum auswerten is das ja schon so ne prima sache muß ganz ehrlich sagen das mit den zeigern is nicht so meine welt... :?
aber für das durchsuchen des speichers fehlt mir noch die ultimative lösung... :gruebel: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz