Das ATOS-Magazin 3/99
ATOS Programmierpraxis
Moderne Zeiten
Ausfüllen der Prozeduren mit Leben

# Der Verein

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

Rückblick