während der arbeit mit Prototype und dem dynamischen aufrufen von Prozeduren bin ich auf seltsamme Effekte gestoße (zB. das Sprites verschwinden).
Inzwischen bin ich bei folgender Fragestellung angekommen:
Gibt es gefahren bei einer Typenkollision zwischen dem Prototyp-Rückgabetyp und dem wahren Prozedur-Pointer-Rückgabetyp?
Beispiele:
- Ich habe eine Prozedur welche eine Float zurück gibt, rufe sie aber über ein Prototyp auf der eine Integer zurückgibt.
- Ich habe eine Prozedur welche eine Integer zurück gibt, rufe sie aber über ein Prototyp auf der eine Float zurückgibt.
Scheinbar darf sowas nicht gemacht erden, auch wenn einem der Rückgabewert egal ist, scheint es Probleme im Stack zu verursachen, wie folgendes Beispiel zeigt:
Code: Alles auswählen
Procedure.f GetF(*Pointer)
Debug "INNEN: "+Str(*Pointer)
ProcedureReturn *Pointer
EndProcedure
Procedure.i GetI(*Pointer)
Debug "INNEN: "+Str(*Pointer)
ProcedureReturn *Pointer
EndProcedure
Procedure.i Beispiel(Integer.i)
Debug "Beispiel: "+Str(Integer)
EndProcedure
Prototype.f ReturnF(*Pointer)
Prototype.i ReturnI(*Pointer)
Define f.f, i.i, *p = 16
; Alles OK
GetF_ReturnF.ReturnF = @GetF()
GetI_ReturnI.ReturnI = @GetI()
f = GetF_ReturnF(*p)
Debug f ; 16.0 richtig
i = GetI_ReturnI(*p)
Debug i ; 16 richtig
Debug "---"
; Probleme
GetF_ReturnI.ReturnI = @GetF()
GetI_ReturnF.ReturnF = @GetI()
f = GetI_ReturnF(*p)
Debug f ; NaN verständlich, ist halt müll
i = GetF_ReturnI(*p)
Debug i ; 2147340288 verständlich, ist halt müll
f = GetI_ReturnF(*p)
Debug f ; 16.0 seltsam, da der Aufruf ja der selbe ist wie beim ersten mal.
f = GetI_ReturnF(*p)
Debug f ; NaN ok, Stack wieder "frei" von ungenutzer Float von GetF_ReturnI()
Daher meine Frage: Wie kann ich solch ein Problem umgehen.
Hintergrund ist:
Ich möchte eine Beliebige Prozedure ausführen (über ein Pointer), wo mit der Rückgabewert aber egal ist.
Oder führt das in jedem fall zu Speicherlecks? Weil zB eine Prozedur einen String zurück gibt. aber der Aufruf (über Prototyp) garkein string erwartet, und der dann "ungenutzt" im Speicher gleibt?
Wäre nett, wenn einer ein bisschen Licht in die Sache bringen würde.
Scheinbar ändert sich der ASM-Code:
