ich weiß nicht, ob es einige hier sowieso schon so machen, aber hier ist mal
ein Beispiel, wie man sein Interface in die entsprechende Structure einbaut,
damit man auf Structure-Element gleichermaßen gut zugreifen kann wie auf
die Interface-Procedures.
Code: Alles auswählen
Interface Bruch_I
Set(zaehler.q, nenner.q) ;#False, wenn nenner = 0
Double.d()
Kehrwert() ;#False, wenn zaehler = 0
Kuerzen()
Str.s()
EndInterface
Structure Bruch
*VTable
I.Bruch_I
zaehler.q
nenner.q
EndStructure
Macro New(Struc)
Struc#_New()
EndMacro
Procedure Bruch_New()
Protected *bruch.Bruch
*bruch = AllocateMemory(SizeOf(Bruch))
If Not *bruch : ProcedureReturn #False : EndIf
*bruch\VTable = ?Bruch_VTable
*bruch\I = *bruch
*bruch\zaehler = 0
*bruch\nenner = 1
ProcedureReturn *bruch
EndProcedure
Procedure Bruch_Set(*bruch.Bruch, zaehler.q, nenner.q)
If nenner
*bruch\zaehler = zaehler
*bruch\nenner = nenner
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
Procedure.d Bruch_Double(*bruch.Bruch)
ProcedureReturn *bruch\zaehler / *bruch\nenner
EndProcedure
Procedure Bruch_Kehrwert(*bruch.Bruch)
If *bruch\zaehler
Swap *bruch\zaehler, *bruch\nenner
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
Procedure Bruch_Kuerzen(*bruch.Bruch)
Protected k.l = 0, t.q, a.q = *bruch\zaehler, b.q = *bruch\nenner
If *bruch\zaehler = 0
*bruch\nenner = 1
ProcedureReturn
EndIf
If *bruch\nenner < 0
*bruch\zaehler = -*bruch\zaehler
*bruch\nenner = -*bruch\nenner
EndIf
a = *bruch\zaehler
If a < 0 : a = -a : EndIf
b = *bruch\nenner
While Not (a & 1 Or b & 1)
a >> 1
b >> 1
k + 1
Wend
If a & 1 : t = -b : Else : t = a : EndIf
While t
While Not t & 1
t >> 1
Wend
If t > 0 : a = t : t - b : Else : b = -t : t + a : EndIf
Wend
a << k
*bruch\zaehler / a
*bruch\nenner / a
EndProcedure
Procedure.s Bruch_Str(*bruch.Bruch)
ProcedureReturn StrQ(*bruch\zaehler) + "/" + StrQ(*bruch\nenner)
EndProcedure
DataSection
Bruch_VTable:
Data.l @Bruch_Set(), @Bruch_Double(), @Bruch_Kehrwert(), @Bruch_Kuerzen(), @Bruch_Str()
EndDataSection
*zahl.Bruch = new(Bruch)
*zahl\zaehler = 208
*zahl\nenner = 26
Debug *zahl\I\Str()
*zahl\I\Kuerzen()
Debug *zahl\I\Str()
*zahl\I\Kehrwert()
Debug *zahl\I\Str()
Debug *zahl\I\Double()