4. Typen und Datenstrukturen | |||||||||||||||||||||
|
|||||||||||||||||||||
4.3.3 Zugriffstypen
Es gibt drei Arten von Zugriffstypen:
So sind die beiden Deklarationen "z1" und "z2" äquivalent, da die Werte von "z1" und "z2" beide "null" sind. z1 : access_type := null; Die explizite Zuweisung des Literals "null" ist also unnötig. z2 : access_type; Typisierte Zugriffstypen Im Prinzip können für beliebige Objekttypen entsprechende Zugriffstypen eingeführt werden. Der wohl wichtigste Anwendungsbereich erschließt sich durch Zugriffe auf Verbundtypen, wie sie in dynamischen Datenstrukturen vorkommen. Ein Beispiel für eine Zugriffstypdeklaration (access_type_definition <BNF>) ist:
Deklaration eines Zeigerobjektes Die Deklaration eines Zeigerobjektes sieht wie gewohnt aus. Der Wert des Objekts wird implizit mit "null" initialisiert.
Zugriff auf ein Objekt Ein Zugriff auf den "Inhalt" von "z" erfolgt durch
löst im gegenwärtigen Zustand einen Constraint_Error aus, da der Speicher, auf den z verweisen soll, noch nicht alloziert wurde. Die Allozierung geschieht mit dem Allokator "new" gemäß z := new Complex.Cartesian; Jetzt können die obigen Zugriffe auf "z" durchgeführt werden. Allerdings sollte der Inhalt von "z" noch initialisiert werden. Initialisierung
Initialisierung gleich bei der Allozierung
Initialisierung direkt bei der Deklaration des Zugriffsobjekts
Wenn die Komponenten "re" und "im" vorbesetzt wären, würde die reine Allozierung ausreichen, um das referenzierte Objekt z mit dieser Defaultinitialisierung zu besetzen. Zugriffstypen auf Unterprogramme In Ada können Zugriffstypen auf Unterprogramme (access_to_subprogram_definition <BNF>) definiert werden. Diese können dann als Komponenten in strukturierte Typen aufgenommen oder direkt als Parameter an Unterprogramme übergeben werden. Mit dieser Sprachkonstruktion lassen sich viele Probleme der Numerik elegant lösen. Die für grafische Benutzungsoberflächen übliche Programmierung mit sogenannten Call-back-Routinen ist damit ebenfalls möglich. Über diese Call-back-Routinen werden Funktionalitäten angebunden, die aufgrund bestimmter Benutzeraktionen ausgeführt werden. Ein einfaches Beispiel ist die numerische Integration. Hier hat man einen allgemeinen Integrationsalgorithmus, dem man die zu integrierende Funktion als Parameter übergeben kann. In der einfachsten Form kann die Konstruktion so aussehen:
Das Integral z. B. von exp(x) zwischen bestimmten Grenzen kann man dann so berechnen:
Die Funktion wird also mit dem 'Access-Attribut übergeben. In der Funktion "Integral" wird "Funktion" mit der Qualifikation ".all" benutzt gemäß:
Allgemeine Zugriffstypen In Ada können sogenannte allgemeine Zugriffstypen (access_to_object_definition <BNF>) deklariert werden. Damit ist ein Zugriff nicht nur auf Objekte eines mit "new" allozierten Objekts möglich. Deklaration eines allgemeinen Zugriffstyps
Das Schlüsselwort "all" unterscheidet diesen allgemeinen Zugriffstyp von einem typisierten der Art
Ganzzahlige Werte, auf die mit Objekten vom Typ Integer_Access zugegriffen werden soll, müssen als "aliased" (object_declaration <BNF>) gekennzeichnet werden:
Bei einer Typdeklaration kann durch das Schlüsselwort "constant" angezeigt werden, daß über die Objekte dieser allgemeinen Zugriffstypen nur ein lesender Zugriff auf Objekte möglich ist.
Die Benutzung sieht so aus:
Das Schlüsselwort "Constant" in der Zugriffstypdeklaration bezieht sich also nicht auf die mit "aliased" gekennzeichneten referenzierten Objekte (die nicht konstant sein müssen), sondern auf die Benutzung dieser Objekte über Objekte des allgemeinen Zugriffstyps. Die letzte Zeile ist daher genauso fehlerhaft wie eine Zuweisung an eine Konstante. ine Zuweisung an eine Konstante. Ein sinnvoller Einsatz von Zugriffstypen ist im Zusammenhang mit strukturierten Typen, uneingeschränkten Typen und rekursiven Datenstrukturen gegeben. Ein sinnvoller Einsatz von Zugriffstypen ist im Zusammenhang mit strukturierten Typen gegeben. Die Benutzung von Komponenten dieser Typen erfolgt dann genauso wie bei Zugriffen auf Komponenten von Objekten des referenzierten Typs. Das Schlüsselwort "all" kann verwendet werden.
Zugriff auf uneingeschränkte Typen Sollen strukturierte Objekte Komponenten uneingeschränkter Typen haben, so gibt es zwei Möglichkeiten. Entweder werden die Diskriminanten vom äußeren Objekt an die inneren Komponenten übergeben oder die Komponenten sind von einem Zugriffstyp. Die relevanten Daten der ganzen Belegschaft eines Betriebes könnten so gespeichert werden:
Alle 10000 Komponenten des Feldes Mitarbeiter sind mit null initialisiert. Zugriff bei rekursiven Datenstrukturen Das wichtigste Einsatzgebiet für Zugriffstypen sind rekursive Datenstrukturen. Einfach verkettete Listen werden nach folgendem Schema vereinbart:
Dieses Beispiel zeigt den grundsätzlichen Aufbau einfach verketteter Datenstrukturen. Die unvollständige Typdeklaration
ist nötig, da die nachfolgende Zugriffsdeklaration
den Typ Zelle benötigt. Damit kann dann die vollständige Verbunddeklaration für Zelle vereinbart werden.
|
|||||||||||||||||||||
|