Seite 1 von 1

delphi dll mit single rückgabewert?

Verfasst: 03.10.2004 15:51
von Xception
Ist single in Delphi nicht das gleiche wie float in Purebasic?
Haben beide 4 bytes.
Wenn ich aber single an Purebasic zurückgebe erhalte ich immer eine riesige merkwürdige Zahl, auch wenn ich eine ganz kleine zurückgebe.
Integer funktioniert problemlos.

Verfasst: 03.10.2004 19:12
von QuickBasic
Hier mal ein Auszug aus der Delphi Hilfe:

Code: Alles auswählen

Realtypen
Ein Realtyp ist eine Untermenge der reellen Zahlen, die als Gleitkommazahl mit einer festen Stellenanzahl dargestellt werden können.
Es gibt fünf Arten von Realtypen. Sie unterscheiden sich in ihrem Wertebereich, der Genauigkeit der Werte und im Speicherplatzbedarf.


Typ	              Bereich	                                      Stellen	Bytes

Real                  2.9 * 10-39 .. 1.7 * 1038	               11-12      6

Single               1.5 * 10-45 .. 3.4 * 1038	                7-8	   4

Double              5.0 * 10-324 .. 1.7 * 10308	           15-16       8

Extended           3.4 * 10-4932 .. 1.1 * 104932	19-20	   10

Comp                -263+1 .. 263-1	                       19-20	   8

Der Typ Comp speichert nur integrierteWerte von-263+1 bis 263-1 (näherungsweise -9.2 * 1018 bis 9.2 * 1018).
Delphi unterstützt zwei Modelle der Code-Erzeugung, um Operationen mit Realtypen durchzuführen: 

Gleitkommaberechnungen per Software 
	80x87 Gleitkommaberechnungen 

Verwenden Sie die Compileranweisung $N, um das entsprechende Modell auszuwählen.
Und hier eine Definition von Float, ob die allerdings auch für PB
Gültigkeit hat, weiss ich nicht, je nachdem definiert hier jeder
Hersteller seinen ganz "eigenen" Float-Typ

(Ausschnitt aus der Turbo C++- Hilfe)

Code: Alles auswählen

float	32 Bits 	3.4 * (10**-38) bis 3.4 * (10**+38)
Soweit ich das sehe, besteht hier durchaus ein Unterschied, es kommt
darauf an, WIE die Kommazahlen CompilerIntern verarbeitet werden,
und wenn die Verarbeitung GLEICH ist, dann klappts, ansonsten gibts
Probleme, mit der Typgröße hat DAS nichts zu tun!

Verfasst: 06.10.2004 18:04
von FloHimself
Unabhängig von den unterschiedlichen Wertebereichen, werden in Delphi Funktionsergebnisse der Real-Typen im Top-of-Stack-Register des Coprozessors für Gleitkommazahlen (ST(0)) zurückgegeben.

Probier es mal hiermit:

Code: Alles auswählen

RetValue.f = 0.0
CallFunction(0, "GetSingle")
!FST [v_RetValue]
Debug RetValue

Verfasst: 07.10.2004 08:12
von Danilo
Ich vermute das Problem ist hier das CallFunction(Fast) ein
Long zurückgibt. Dieses Long muß man erst speichern und
dann in ein Float ziehen:

Code: Alles auswählen

retval = CallFunction(...)
float.f = PeekF( @retval )
Oder:

Code: Alles auswählen

float.f = 0.0
CallFunction(...)
!MOV [v_float], EAX