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