2017-07-18 5 views
0

Pass-by-Reference ist leicht mit Sprachen zu visualisieren, die meistens Zeiger verwenden. Aber in Pascal kann ich kaum sehen, wie die Zeiger Subroutinen als Argumente übergeben.Wie funktioniert Pass-by-Reference?

Zum Beispiel:

var a: array [0..2] of integer; 
    i : integer; 

    procedure swap(var x, y: integer); 
    var temp: integer; 
    begin 
     temp := x; 
     x := y; 
     y := temp; 
    end; 

begin 
    i := 0; 
    a[i] := 2; 
    swap(i, a[i]); 
end. 

Kann die swap(i, a[i]); Verfahrensaufrufanweisung mit diesem Ersatz Pseudo-Code ersetzt werden? Arbeiten Dolmetscher so hinter den Kulissen?

var tmpOldArrayExpression, tmpNewFirst, tmpNewSecond : integer; 
tmpOldArrayExpression := i; 
(tmpNewFst, tmpNewSnd) := swap(i, a[i]); 
i := tmpNewFirst; { 2 } 
a[tmpOldArrayEession] := tmpNewSecond; { 0 } 

Antwort

1

Hinter den Kulissen, die Funktion Swapimplementiert als:

function Swap(x, y: ^integer); // or: PInteger 
var 
    temp: integer; 
begin 
    temp := x^; 
    x^ := y^; 
    y^ := temp; 
end; 

Und es ist in Wirklichkeit (aber nicht syntaktisch) genannt wie:

i := 0; 
a[i] := 2; 
swap(@i, @a[i]); 

Und Pascal ist eine kompilierte Sprache. Es wird (allgemein) nicht interpretiert.


Um mehr über diese Zeilen lesen, lesen my article explaining pointers and references, especially about reference parameters. Es geht um Delphi, aber die gleichen Prinzipien gelten für die meisten Pascal.

+0

Ihre hilfreich Link Antwort die meisten meiner Pascal-Probleme. Könnten Sie mir bitte noch eine Frage stellen? Für Interpreter, die nicht kompilieren, um im laufenden Betrieb zu arbeiten (JIT), arbeiten sie hinter der Szene, ähnlich wie mein Pseudocode? – MiP

+0

Wenn Sie eine andere Frage haben, fragen Sie eine andere. Es hat ganze Bücher (mit vielen Seiten) darüber geschrieben, wie Dolmetscher (und/oder Compiler) arbeiten. Ich habe keine Ahnung, was du mit "ähnlich wie mein Pseudocode" meinst. –

+0

Es ist die erste Frage zu diesem Thema, ich glaube nicht, dass ich ein neues Duplikat machen sollte. Was meinst du mit "C#"? – MiP

0

Afaik Pascal ist noch einfacher als C in dieser Hinsicht, denn während es ja getrennte Syntax hat, aber es gibt keine Regeln über Parameter Aliase voneinander sind (die IIRC C hat)