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(
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);
Im Falle des In-Out-Parameters muß der aktuelle Parameter Obj oder Obj_Ptr.all sein. Daher
P(Obj); P(Obj_Ptr.all);
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.
Johann Blieberger