also ich hab ein kleines problem: es ist ja denk ich bekannt, dass die Funktion 'CallFunctionFast()' nicht sehr flexibel ist. deshalb wollte ich mal eine eigene Funktion schreiben, bei der zur compilierzeit noch nicht bekannt ist, von welchem Typ die Parameter sein sollen, und es überhaupt möglich ist auch Floats, Doubles und Quads zu übergeben. Da ich aber wenig bis gar keine Ahnung von ASM habe, hab ich nach drei stunden ausprobieren erfolglos aufgegeben. vielleicht könnt ihr mir ja weiter helfen. meine grundidee ist folgende:
Code: Alles auswählen
Structure param
type.b
StructureUnion
byte.b
word.w
long.l
quad.q
float.f
double.d
char.c
*pointer
EndStructureUnion
EndStructure
#Pointer = 127
Procedure.f test(a.l, b.d, c.b)
Debug a ; sollte ausgeben: 10000000
Debug b ; -12.3
Debug c ; 13
ProcedureReturn 0.003
EndProcedure
Procedure callfunc(*func, result.param, param.param())
ForEach param()
Select param()\type
Case #Byte
; 'param()\byte' der Parameterliste hinzufügen
Case #Word
; 'param()\word' der Parameterliste hinzufügen
Case #Long
; 'param()\long' der Parameterliste hinzufügen
Case #Quad
; 'param()\quad' der Parameterliste hinzufügen
Case #Float
; 'param()\float' der Parameterliste hinzufügen
Case #Double
; 'param()\double' der Parameterliste hinzufügen
Case #Character
; 'param()\char' der Parameterliste hinzufügen
Case #Pointer
; 'param()\pointer' der Parameterliste hinzufügen
EndSelect
Next
; Die Funktion '*func' mit der Parameterliste aufrufen
Select result\type
Case #Byte
; Speichert den Rückgabewert in 'result\byte'
Case #Word
; Speichert den Rückgabewert in 'result\word'
Case #Long
; Speichert den Rückgabewert in 'result\long'
Case #Quad
; Speichert den Rückgabewert in 'result\quad'
Case #Float
; Speichert den Rückgabewert in 'result\float'
Case #Double
; Speichert den Rückgabewert in 'result\double'
Case #Character
; Speichert den Rückgabewert in 'result\char'
Case #Pointer
; Speichert den Rückgabewert in 'result\pointer'
EndSelect
EndProcedure
NewList param.param()
InsertElement(param())
param()\type = #Long
param()\long = 10000000
InsertElement(param())
param()\type = #Double
param()\double = -12.3
InsertElement(param())
param()\type = #Byte
param()\long = 13
result\type = #Float
callfunc(@test(), result, param())
Debug result\float ;sollte 0.003 ausgeben
danke schon mal im vorraus.
