next up previous contents index
Weiter: 5.3 Aufruf von Hinauf: 5 Unterprogramme Zurück: 5.1 Deklaration eines

5.2 Formale Parameter

  

Es gibt drei Arten von Parameterübergabe-Mechanismen:   in, out und in out. Bei In-Parametern   wird der Wert des aktuellen Parameters beim Aufruf an das Unterprogramm übergeben. Innerhalb des Unterprogrammes verhält sich ein In-Parameter wie eine Konstante. Out-Parameter   werden vom Unterprogramm mit einem Wert versorgt, der an den aufrufenden Agenden zurückgegeben wird. Ein Out-Parameter kann innerhalb eines Unterprogrammes sowohl geschrieben als auch gelesen werden, allerdings ist er zu Beginn nicht initialisiert. Der Wert eines In-Out-Parameters   wird beim Aufruf an das Unterprogramm übergeben und bei der Rückkehr an den aufrufenden Agenden zurückgegeben. Ein In-Out-Parameter verhält sich innerhalb eines Unterprogrammes wie eine initialisierte Variable.

Ein formaler In-Parameter kann mit einer Access-Definition versehen werden. Man spricht dann von Access-Parametern.  

Gibt man keines der Schlüsselwörter in, out oder in out an, so wird defaultmäßig angenommen, daß der betroffene Parameter ein In-Parameter ist.

Funktionen dürfen nur In-Parameter haben um Nebeneffekte zu vermeiden.

Unconstrained Arrays als formale Parameter erben ihre Grenzen beim Aufruf vom aktuellen Parameter. Dasselbe gilt für die Diskriminanten von unconstrained Records.

Bei einer Unterprogramm-Deklaration werden die formalen Parameter definiert, indem die Bezeichner der Parameter getrennt durch einen Doppelpunkt von ihrem Typ aufgelistet werden. Einzelne Parameter-Definitionen werden durch einen Strichpunkt voneinander getrennt. Parameter gleichen Typs können, bevor ihr Typ spezifiziert wird, mittels Beistrich getrennt aufgelistet werden. Ein einfaches Beispiel ist:

function Beispiel_1(
integer_par_1, integer_par_2: integer;
real_par: real;
string_par: string) -unconstrainedParameter
return boolean;

Es ist auch möglich, Default-Werte  für Parameter anzugeben, z.B.:

procedure Beispiel_2(
integer_par_1, integer_par_2: integer;
real_par: real := 0.0; -alsDefault
string_par: string := ""); -LeerstringalsDefault

Parameter, die bei der Definition mit einem Default-Wert versehen worden sind, müssen beim Aufruf des entsprechenden Unterprogrammes nicht versorgt werden.

Bezüglich des wirklichen Übergabemodus ist zu sagen, daß

Access-Parameter verhalten sich sehr ähnlich zu In-Out-Parametern. Es gibt allerdings wesentliche Unterschiede, die wir anhand eines Beispiels studieren wollen.

type T is tagged
record ...

type Access_T is access T;

Obj: T;

Obj_Ptr: Access_T := new T'(...);

procedure P(X: in out T);

procedure PA(XA: access T);

Innerhalb der Bodies von P und PA haben wir lesenden und schreibenden Zugriff zu den Komponenten des Records. Aufgrund der automatischen Dereferenzierung syntaktisch sogar auf dieselbe Weise. Und da getaggte Typen by reference übergeben werden, haben wir auch denselben Effekt in beiden Fällen. Zum Beispiel kann in beiden Fällen Dispatching stattfinden. Nun aber zu den Unterschieden.

Im Falle des In-Out-Parameters muß der aktuelle Parameter Obj oder Obj_Ptr.all sein. Daher

P(Obj); P(Obj_Ptr.all);

Im anderen Fall muß der aktuelle Parameter Obj'ACCESS oder Obj_Ptr sein. Außerdem muß die Variable Obj als aliased vermerkt sein.

Obj: aliased T;
PA(Obj'ACCESS); PA(Obj_Ptr);

Ein wesentlicher Unterschied ist nun, daß ein Access-Parameter nie null sein kann. Das wird vom Laufzeitsystem geprüft und man kann sich diesen Test innerhalb des Unterprogrammes also ersparen.

Außerdem sei noch einmal darauf hingewiesen, daß Funktionen keine In-Out-Parameter haben dürfen. In solchen Fällen ist also ein Access-Parameter sehr sinnvoll, besonders dann, wenn man keine Prozedur mit Out-Parameter verwenden kann, weil etwa der Typ des Resultats klassenweit oder sonst irgendwie unconstrained ist.



next up previous contents index
Weiter: 5.3 Aufruf von Hinauf: 5 Unterprogramme Zurück: 5.1 Deklaration eines

Johann Blieberger
Wed Feb 11 09:58:52 MET 1998