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

Veränderung (letzte Änderung) (Korrektur, Autor, Normalansicht)

Verändert: 2c2
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 MehrereRückgabeWerte? an das aufrufende Programm zurückgeben möchte. Die verschiedenen Programmiersprachen stehen dazu recht unterschiedlich.
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.

Entfernt: 38,39d37
Visual Basic wurde hier zweifellos ziemlich direkt von Pascal beeinflusst. -- FF


Entfernt: 60,61d57
:Dennoch bleibt anzumerken, dass der Umgang mit Pointern immer auch mit einem gewissen "Risiko" behaftet ist. (Insbesondere darf man auch beim Aufruf der Funktion nicht darauf vergessen, den Variablen, die übergeben werden sollen, den Adressoperator & voranzustellen!) -- FF


Entfernt: 80,81d75
:Das ist schon richtig, aber damit verbunden ist hier eine deutlich "sicherere" Handhabung - vor allem, wenn es wirklich nur darum geht, Variablen by reference an eine Funktion zu übergeben. -- FF


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

Hinzugefügt: 120a115,132



[[Überschrift]C#]

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

[[Code]
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

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