
Donc ici j'ai ceci:
Code : Tout sélectionner
; on déclare les fonctions de notre objet dans une Interface
Interface Math_Interface
SetX(x)
SetY(y)
Add()
Free()
EndInterface
; on déclare une structure pour y stocker les adresses des procédures
Structure Math_Virtual
SetX.l
SetY.l
Add.l
Free.l
EndStructure
; on déclare la structure "interne" de l'objet
Structure Math_Object
*Virtual.Math_Virtual
x.l
y.l
EndStructure
; nos procédures
Procedure SetX(*Object.Math_Object, x)
*Object\x = x
EndProcedure
Procedure SetY(*Object.Math_Object, y)
*Object\y = y
EndProcedure
Procedure Add(*Object.Math_Object)
ProcedureReturn *Object\x + *Object\y
EndProcedure
Procedure Free(*Object.Math_Object)
FreeMemory(*Object)
EndProcedure
; ici on déclare une variable globale contenant les adresses des procédures
Global Math_Global.Math_Virtual
Math_Global\SetX = @SetX()
Math_Global\SetY = @SetY()
Math_Global\Add = @Add()
Math_Global\Free = @Free()
; une procédure d'initialisation qui permet de "créer" un nouvel objet en mémoire, on retourne le pointeur de cet objet
Procedure.l NewMath_Object()
*new.Math_Object = AllocateMemory(SizeOf(Math_Object))
*new\Virtual = Math_Global
ProcedureReturn *new
EndProcedure
; création d'un nouvel objet dans le programme
MonMath.Math_Interface = NewMath_Object()
; utilisation des procédures de l'objet
MonMath\SetX(5)
MonMath\SetY(2)
Debug = MonMath\Add()
; on détruit l'objet
MonMath\Free()
J'ai essayé de faire une "simple" variable dans la procédure (donc pas globale) et de l'assigner mais ça plante.
Dri m'a proposé de faire une variable statique dans la procédure et cela fonctionne.
Code : Tout sélectionner
...
Procedure.l NewMath_Object()
Static Math_Global.Math_Virtual
Math_Global\SetX = @SetX()
Math_Global\SetY = @SetY()
Math_Global\Add = @Add()
Math_Global\Free = @Free()
*new.Math_Object = AllocateMemory(SizeOf(Math_Object))
*new\Virtual = Math_Global
ProcedureReturn *new
EndProcedure
...
Si oui, comment détourner la chose pour avoir un objet qui résiste au threads ?