2016-05-13 19 views
0

Gibt es ein geeignetes Beispiel für die Erklärung von Call-by-Result? (nicht Pseudocode)Aufruf durch Ergebnis Beispiel

Ich habe gelernt, dass ALGOL 68, Ada könnte auf diese Weise verwenden,
, aber ich kann kein klares Beispiel für Call-by-Result finden.

+1

Soweit ich in Ada sehen kann, wird der Begriff "call-by-result" fast nie verwendet, es ist viel einfacher, Parameter Passing-Modi zu denken - dh sagen, was Sie wollen, anstatt wie Sie es wollen geschehen. Suchen Sie insbesondere nach einem Code, der OUT-Parameter verwendet (nicht "IN OUT", was einem Call-by-Value-Ergebnis entspricht). –

+0

Was bedeutet "call-by-result"? Ist es eine Parameterübergabe-Methode? –

+0

[Diese Antwort] (http://stackoverflow.com/a/3004067/40851) erklärt 'in out', was wie @BrianDrummond sagt Call-by-Value-Ergebnis entspricht. Sie können wahrscheinlich call-by-result (d. H. Das Ada out) daraus herleiten. –

Antwort

0

Ich habe nur von mir selbst gemacht.

Pseudo-Code

begin 
integer n; 
procedure p(k: integer); 
    begin 
    n := n+1; 
    k := k+4; 
    print(n); 
    end; 
n := 0; 
p(n); 
print(n); 
end; 

Implementieren Ada Sprache

call.adb

with Gnat.Io; use Gnat.Io; 

procedure call is 
x : Integer; 
Procedure NonSense (A: in out integer) is 
begin 
    x := x + 1; 
    A := A + 4; 
    Put(x); 
end NonSense; 

begin 
    x := 0; 
    NonSense (x); 
    Put(" "); 
    Put(x); 
    New_Line; 
end call; 

Da Ada mit verwendet Call-by-Ergebnis Weise sollte Ergebnis 1 bis 4 sein. (Es könnte durch Eingabe dieses Codes in den Online-Ada-Compiler "http://www.tutorialspoint.com/compile_ada_online.php" überprüft werden)

Und anderes Ergebnis angewandt unterschiedliche Durchgangsparametertypen sein sollten ...
Anruf von Wert: 1 1
call by reference: 5 5
(vergleichen> Anruf durch Mehrwert-Ergebnis 4: 1)

+2

Denken Sie daran, dass Parameterübergabemethoden in Ada vom Typ abhängig sind. Integertypen werden durch Kopieren übergeben, während (z. B.) getaggte Typen als Referenz übergeben werden. Bei einigen Typen ist die Wahl dem Compiler-Implementierer überlassen. –

+2

Idealerweise würde sich der Ada-Compiler weigern, diesen Code zu kompilieren, da es sich um einen Fehler handelt, der darauf wartet, ausgeführt zu werden. –

+2

Ein möglicher Hinweis ist in der LRM, 6.2: "Wenn ein Objekt von einem Typ ist, für den der Parameterübergabemechanismus nicht spezifiziert ist und kein explizit Alias-Parameter ist, ist es ein beschränkter Fehler, dem Objekt über einen Zugriff zuzuweisen Pfad, und lesen Sie dann den Wert des Objekts über einen eindeutigen Zugriffspfad ". Wenn Sie Zeiger benötigen, verwenden Sie Zeiger. Es ist jedoch am besten, beim Überschreiben von Ada die Mechanismen zugunsten von IN, IN OUT und OUT zu vergessen. – B98