Autor Beitrag
DEMOA
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Do 12.03.15 14:11 
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..

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6388
Erhaltene Danke: 146

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Do 12.03.15 14: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 328
Erhaltene Danke: 101



BeitragVerfasst: Do 12.03.15 15: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)
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Do 12.03.15 15: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