By Reference
 
StartSeite | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern

Die Parameterübergabe by reference (pbr) dient dazu, Variablen (und nicht Struktur- oder Arrayelemente) im aufrufenden Programm zu verändern. Das ist z.B. dann praktisch, wenn man mehrere Rückgabewerte an das aufrufende Programm zurückgeben möchte. Die verschiedenen Programmiersprachen stehen dazu recht unterschiedlich.


Pascal

In Pascal gibt man dazu innerhalb der Parameterliste das Schlüsselwort var an. [Bemerkung: N. Wirth -der Vater von Pascal- hat (meines Wissens) überhaupt erst den Term "call by reference" geprägt!]

   procedure ScreenGetWidthHeight(var x,y : integer);
   begin
      x := ...;
      y := ...;
   end;
   
   ...
   var x,y : integer;
   ...
   ScreenGetWidthHeight(x,y);


Visual Basic

In Visual Basic gibt es das Schlüsselwort ByRef?:

   sub ScreenGetWidthHeight(ByRef x%, ByRef y%)
     x% = ...;
     y% = ...;
   end sub

   ...
   dim x%,y%;
   call ScreenGetWidthHeight(x%,y%);


C

In C wird die Adresse einer Variablen dazu benutzt, um den Effekt von pbr zu erzeugen. Zu diesem Zweck muss der Funktion beim Aufruf die Adresse der jeweiligen Variablen übergeben werden (siehe Codebeispiel).

   void ScreenGetWidthHeight(int *px, int *py) {
     *px = ...;
     *py = ...;
   }

   ...
   int x,y;
   ...
   ScreenGetWidthHeight(&x,&y);

Der Effekt ist der gleiche, aber in manchen Diskussionen wird auf diesem Unterschied herumgeritten. Ich habe in solchen Fällen diese Form der Übergabe als pass by reference variation (pbrv) bezeichnet. Das befriedigt beide Seiten. -- HelmutLeitner


C++

C++ verfügt nun (ähnlich wie Pascal oder Visual Basic) über eine Möglichkeit, hier tatsächlich mit sog. Referenzen zu arbeiten! Dazu ist lediglich bei der Parameterliste der Funktionsdefinition ein spezieller Operator (&) zu verwenden. Innerhalb der so definierten Funktion kann man dann unmittelbar auf die selben Variablen zugreifen, die im aufrufenden Programm beim Funktionsaufruf als Parameter verwendet wurden.

   void ScreenGetWidthHeight(int &x, int &y) {
     x = ...;
     y = ...;
   }

   ...
   int x,y;
   ScreenGetWidthHeight(x,y);

Es lohnt sich festzustellen, dass der tatsächlich generierte Code sich nicht von der C-Variante unterscheidet. Es werden die gleichen Pointer übergeben und sie werden in gleicher Weise zur Referenzierung benutzt. "Nur" die Syntax ist leichter zu handhaben.


Java

In Java ist eine Parameterübergabe by reference grundsätzlich nicht möglich. Mehrere Werte können nur in geeigneten Objekten verpackt als Parameter oder in einem Objekt als Return-Wert ans aufrufenden Programm zurückgegeben werden.

Für viele Java-Anhänger ist das ein Zeichen guten Stils, für manche andere ein ärgerlicher Mangel. Anlass für manchen MegaThread.


Perl

Perl ähnelt in dieser Hinsicht sehr der Sprache C. Man übergibt explizit die Adresse und man hat im aufgerufenen Programm eine spezielle Syntax für den Zugriff auf die durchgereichte Variable.

   sub ScreenGetWidthHeight { 
     my($p_x,$p_y)=@_;
     $$p_x=...;
     $$p_y=...;
   }

   ...
   my $x,$y;
   &ScreenGetWidthHeight(\$x,\$y);

In Perl würde man das Problem, mehrere Wert zurückzugeben, in vielen Fällen allerdings anders lösen, weil als Rückgabewert Listen verwendet werden können:

   sub ScreenRetWidthHeight { 
      my x=...;
      my y=...;
      return (x,y);
   }

   ...
   my ($x,$y)= &ScreenRetWidthHeight();

Andererseits ist die Übergabe by reference gerade in Perl auch deshalb interessant, weil auf diese Weise große Arrays oder Hashes effizienter übergeben werden können.


C#

C# verpackt Referenzen in einer anderen Form, nämlich so, dass sowohl bei der Definition als auch beim Aufruf der Referenzcharacter explizit hervortritt:

   void ScreenGetWidthHeight(ref int x,ref int y) {
     x = ...;
     y = ...;
   }

   ...
   int x,y;
   ScreenGetWidthHeight(ref x,ref y);

IMO ist das eine gute Lösung. Es vermeidet die Syntaxprobleme von C, erhält aber die Transparenz beim Aufruf und schafft eine relativ angenehm lesbare Syntax. -- HelmutLeitner


KategorieJargon
StartSeite | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern
Text dieser Seite ändern (zuletzt geändert: 7. Juni 2002 20:04 (diff))
Suchbegriff: gesucht wird
im Titel
im Text