Allgemeine Fragen zur PROFAN Programmierung
Views (Heute): 249196 (10632)
  Suchen
 Zurück zur Übersicht
 AutorThema: Profan und DLL
Stefan Schnell
Datum:08.02.02 22:38 Antwortenals Email verschicken (mail@stschnell.de) 


Hallo Community,
ich kämpfe im Moment gerade mit folgendem Problem:
Ich möchte einer DLL Routine eine FloatVariable übergeben, das sieht ungefähr so aus:

DLL in Delphi:

Library Test;

Function SingleTest(x, y: Single):Single; StdCall;
Begin
Result:=x+y;
End;

Exports
SingleTest Index 1;

Begin
End.

Profan Programm:

Declare i!
Def @SingleTest(2) !"Test.DLL", "SingleTest"

i! = Double(@SingleTest(Single(2.599), Single(2.123))

Als Resultat bekomme ich jedoch immer nur 2.599 zurückgeliefert und nicht 4.722 (wie eigentlich zu erwarten wäre). Mit den Variablentypen Cardinal und LongInteger funktioniert es so sehr gut, nur eben mit Single nicht.
Was mache ich falsch?
Danke für Eure Antworten.
Tschüss
Stefan Schnell


Roland G. Hülsmann
Datum:09.02.02 00:27 Antwortenals Email verschicken (rgh-soft@t-online.de) 


Warum das so nicht funktioniert, ist mir auch nicht 100%ig klar. Offensichtlich macht Single als Rückgabeparameter Probleme. Wenn Du das Ergebnis aber vor der Rückgabe als Bitfolge in ein Longint kopierst und dieses zurückgibst, dann klappt es.
So geht es:

Library test;

uses windows;

Function SingleTest(x, y: Single):Longint; StdCall;
var longvar:longint;
    singlevar:Single;
Begin
  singlevar := x+y;
  movememory(addr(longvar),addr(singlevar),4);
  result := longvar;
End;

Exports

singleTest Index 1;

Begin
End.



Stefan Schnell
Datum:09.02.02 18:53 Antwortenals Email verschicken (mail@stschnell.de) 


Hallo Roland,
ohne jetzt schwer von Begriff wirken zu wollen, aber wie kann ich die übergebene Bitfolge in der LongIntVariable wieder in eine "brauchbare" FloatZahl verwandeln?
Danke und tschüss
Stefan



Roland G. Hülsmann
Datum: 09.02.02 20:24 Antwortenals Email verschicken (rgh-soft@t-online.de) 


Hallo Stefan,
diese Umwandlung macht doch Dein im Posting erwähntes PROFAN-Programm schon! Genau das ist die Aufgabe der Funktion Double!



 Zurück zur Übersicht