Inhalt

Funktionale Programmierung mit Haskell - "Lazy Evaluation"


Wert- und Referenzparameter

  • Überblick über die in imperativen oder OO-Sprachen typischen Strategien der Parameterauswertung

Wertparameter

call-by-reference

"Call-by-value"

Bei der Übergabe von Parametern an eine Funktion per Wert
  • werden zur Laufzeit lokale Kopien aktueller Parameter erstellt
  • bezieht sich die Verwendung formaler Parameter im Rumpf auf diese Kopien
  • verändert sich somit der Wert aktueller Parameter nicht
Beispiel in Java

  • In Java werden Parameter immer per Wert übergeben.

    public
    void normalisiere(double x,double y,double z)
    {
        double len = Math.sqrt(x*x+y*y+z*z);
        x/=len;
        y/=len;
        z/=len;
    }

    Der Wert der für x,y und z übergebenen Parameter verändert sich nach Aufruf der Methode "normalisiere" nicht.

Beispiel in Java mit Objektvariable

  • Objektvariablen sind Referenzen, also "Zeiger". Arrays sind in Java als Objekte realisiert, so dass Arrayvariablen ebenfalls Referenzen sind.

    call-by-reference public
    void normalisiere(double [] v)
    {
        double len = Math.sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]);
        v[0]/=len;
        v[1]/=len;
        v[2]/=len;
    }

    Bei obiger Implementation werden die Werte des übergebenen Parameters verändert, da sich um eine Referenz handelt. Bei dem indizierten Zugriff wird der Zeiger dereferenziert.

  • Das Schreiben neuer Werte in das Feld hat somit direkte Auswirkungen.

  • Dies entspricht einer Simulation von "Call-by-Reference", wie sie auch in der Sprache "C"eingesetzt wird.

Referenzparameter

Seitenanfang

"Call-by-reference"

Bei der Übergabe von Parametern an eine Funktion per Referenz
  • stellt der formale Parameter eine Referenz auf den aktuellen dar
  • werden verwendete formale Parameter durch die dereferenzierte Adresse ersetzt
  • können die Werte dauerhaft geändert werden
Beispiel in Pascal

  • In Pascal werden Referenz-Parameter mit Hilfe des Schlüsselwortes "var" deklariert

    procedure normalisiere (var x:Real;var y:Real;var z:Real);
    var len:Real;
    begin
        len:=sqrt(x*x+y*y+z*z);
        x:=x/len;
        y:=y/len;
        z:=z/len;
    end;

    Nach Aufruf der Methode "normalisiere" haben die Variablen, welche als aktuelle Parameter übergeben wurden, die im Rumpf berechneten Werte.

"Call-by-reference" mit der Sprache C
  • Formell unterstützt auch die Sprache C nur Parameterübergabe per Wert.

  • Durch die Verwendung von Zeigern kann -wie in Java- jedoch "Call-by-Reference" simuliert werden:

    void normalisiere (float * x,float * y,float * z);

  • Die Methode wird mit den Adressen der aktuellen Parameter aufgerufen:

    float v1=0.5,v2=0.2f,v2=-1.2f;
    normalisiere (&v1,&v2,&v3);

  • Der Stern kennzeichnet in C den Zeigertyp
  • Der Adressoperator "&" erzwingt die Verwendung der Adresse der Variablen

zurück Seitenanfang weiter