Die Implementierung des Vereins-Objektes geschieht nun völlig analog.
Eine Besonderheit besteht hier aber durch die Benutzung eines Array-Objektes zum Aufnehmen der Mannschaftsaufstellung. Dabei ist es erforderlich, nach dem Anlegen eines neuen Array-Eintrages diesen durch Aufruf der passenden init-Prozedur zu initialisieren, bzw. beim Entfernen einen Array-Eintrages diesen durch Aufruf der exit-Prozedur wieder "herunterzufahren", da diese beiden Vorgänge ja das Anlegen bzw. Freigeben von Objektspeichern beinhalten. Die entsprechenden Stellen sind gekennzeichnet:
FUNCTION verein(name$,staerke&) !call ' ' name$ => Vereinsname (bspw. "FC 08 Homburg") ' staerke& => Stärke der Spieler des Vereins im Mittel. ' (0 = sehr schlecht, 100 = sehr gut) ' ' Außerdem sind die Namen der 11 aufzustellenden Fußballspieler zu ' übergeben. Diese Namen müssen dazu in DATA-Zeilen abgelegt werden ' und der _DATA-Zeiger muß mit RESTORE auf den ersten Namen gesetzt ' werden. ' LOCAL ob# LET ob#=@ob_create(verein_%) @verein_init(ob#,name$,staerke&) RETURN ob# ENDFUNC PROCEDURE verein_init(ob#,name$,staerke&) !call LOCAL aufstellung#,spieler% LOCAL position&,spielername$ ' ' *** konkrete Attribute initialisieren *** ' @string_init(@ob_attrib(ob#,verein_%,verein_name_%)) ' ' Hier muß nun der Typ der Arrayelemente (hier: fussballspieler) ' und die anfängliche Arraygröße (hier 11, da 11 Spieler) angegeben ' werden. Anschließend muß jeder einzelne Spieler initialisiert ' werden: ' LET aufstellung#=@ob_attrib(ob#,verein_%,verein_aufstellung_%)
Hier wird nun zunächst das Array ganz normal wie jedes konkrete Attribut initialisert. Dabei wird der Typ der Arrayelemente (fussballspieler_%) und der Größenparameter (11) übergeben. Auf diese Weise wird ein Array mit 11 Spieler angelegt.
Danach wird dann für jedes einzelne Array-Element die init-Prozedur aufgerufen:
@array_init(aufstellung#,fussballspieler_%,11)
'
' --- Torwart: ---
'
LET position&=fussballspieler_position_tor_&
READ spielername$
@fussballspieler_init(@array_get(aufstellung#,0),spielername$,
position&,staerke&)
'
' --- Abwehr: ---
'
LET position&=fussballspieler_position_abwehr_&
FOR spieler%=1 TO 3
READ spielername$
@fussballspieler_init(@array_get(aufstellung#,spieler%),
spielername$,position&,staerke&)
NEXT spieler%
'
' --- Mitte: ---
'
LET position&=fussballspieler_position_mitte_&
FOR spieler%=4 TO 7
READ spielername$
@fussballspieler_init(@array_get(aufstellung#,spieler%),
spielername$,position&,staerke&)
NEXT spieler%
'
' --- Sturm: ---
'
LET position&=fussballspieler_position_sturm_&
FOR spieler%=8 TO 10
READ spielername$
@fussballspieler_init(@array_get(aufstellung#,spieler%)
spielername$,position&,staerke&)
NEXT spieler%
'
' *** Verein einrichten ***
'
' +++ Vereinsname +++
'
@verein_name_set(ob#,name$)
'
RETURN
PROCEDURE verein_exit(ob#) !call
LOCAL aufstellung#,spieler%
'
@string_exit(@ob_attrib(ob#,verein_%,verein_name_%))
'
' Nun muß umgekehrt zunächst jedes einzelne Arrayelement
' "aufgeräumt" werden - dann erst das Array selbst:
'
LET aufstellung#=@ob_attrib(ob#,verein_%,verein_aufstellung_%)
FOR spieler%=0 TO 10
@fussballspieler_exit(@array_get(aufstellung#,spieler%))
NEXT spieler%
@array_exit(aufstellung#)
'
RETURN
PROCEDURE verein_free(ob#) !call
@verein_exit(ob#)
@ob_free(ob#,verein_%)
RETURN
FUNCTION verein_name$(ob#) !call
'
' Ermittelt den Vereinsnamen.
'
RETURN @string_get$(@ob_attrib(ob#,verein_%,verein_name_%))
ENDFUNC
FUNCTION verein_spieler(ob#,spieler%) !call
'
' Gibt den Spieler mit der Nummer spieler% aus der Aufstellung
' zurück (also dessen Objektkennung).
'
RETURN @array_get(@ob_attrib(ob#,verein_%,verein_aufstellung_%),
spieler%)
'
ENDFUNC
PROCEDURE verein_name_set(ob#,name$)
@string_set(@ob_attrib(ob#,verein_%,verein_name_%),name$)
RETURN