Entwickler-Ecke
Free Pascal - Offsets auslesen
DEMOA - Do 12.03.15 15:11
Titel: Offsets auslesen
Hallo zusammenn,
ich wage mich gerade an das arbeiten mit FSUIPC und dem auslesen von Offsets.
Addr = $0580
Var.Type = U32
Size = 4
Anschließend muss der Wert noch wie folgt berechnet werden: #*360/(65536*65536)
Da das auslesen von Werten von FSUIPC geregelt wird, habe ich erstmal nur Fragen zum notwendigen Dateitypen.
U32 ist, wie ich verstanden habe, ein unsigned Integer (32 bits, 4bytes). Ich habe daher LongInt gewählt. Zwecks späterer Berechnung habe ich noch var a als real Variable eingeführt. Leider kommen dabei immer falsche Werte raus und ich weiß nicht woran das liegt. Da das Thema für mich noch sehr neu ist, würde ich gern wissen ob der Code soweit korrekt ist oder ich komplett falsch liege..
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| var dwResult : DWORD; erg :LongInt; a: real; begin if FSUIPC_Read($0580, 4, @erg, dwResult) then begin if FSUIPC_Process(dwResult) then begin a:= erg *360/(65536*65536); Label6.Caption := floattostr(a); [...] |
Viele Grüße
Moderiert von Martok: Delphi-Tags hinzugefügt
jasocul - Do 12.03.15 15:36
Auch wenn ich mich nicht mit Lazarus wirklich auskenne:
LongInt kann nicht funktionieren, da es nicht Unsigned ist. Wenn Lazarus das hat, nimm Cardinal. Das ist in Delphi 32bit unsigned.
Gammatester - Do 12.03.15 16:13
Neben dem longint Problem, kann auch noch Overflow das Ergebnis verfälschen, man sollte besser mit Fließkomma rechnen (hier mit FPC 2.6.4 / Win32)
Delphi-Quelltext
1: 2: 3: 4: 5:
| erg := 12345678; a := erg*360/(65536*65536); writeln(a); a := erg*360.0/(65536.0*65536.0); writeln(a); |
Das erste writeln liefert falsch
3.48027758300304E-002, das zweite richtig
1.03480277583003E+000
DEMOA - Do 12.03.15 16:21
Hallo und danke erstmal für die Antworten!
Ich habe jetzt Cardinal verwendet, das hat aber zunächst weiterhin falsche Ergebnisse angezeigt. Ich hab mir die Werte vor der Berechnung anzeigen lassen und mal mit dem Taschenrechner überprüft, wie Gammatester schon meinte hat wohl Overflow das Ergebnis verfälscht. Ich hab jetzt erst durch (65536*65536) geteilt und dann im zweiten Schritt mit 360 multipliziert. Jetzt funktioniert es gut.
Ich hab eben noch die Version mit den .0 ausprobiert, das klappt auch gut. Ich bastel dann mal ein bisschen weiter, Danke euch
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!