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($05804, @erg, dwResult) then begin
   if FSUIPC_Process(dwResult) then begin
      a:= erg  *360/(65536*65536);
      Label6.Caption := floattostr(a); 
      [...]


Viele Grüße

Moderiert von user profile iconMartok: 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