2016-05-13 35 views
0

有解釋按結果調用的任何適當示例嗎? (非僞代碼)通過結果調用示例

我已經瞭解到ALGOL 68,Ada可以使用這種方式,
但我找不到任何明確的Call-by-Result示例。

+1

據我在Ada中看到的,術語「按結果調用」幾乎從來沒有使用過,想到參數傳遞模式要容易得多 - 比如說說你想要發生什麼,而不是你想要如何發生發生。具體來說,查找使用'OUT'參數的任何代碼,(不是'IN OUT',它將對應於按值調用的結果)。 –

+0

「呼叫結果」是什麼意思?它是一個參數傳遞方法嗎? –

+0

[This answer](http://stackoverflow.com/a/3004067/40851)解釋'in out',正如@BrianDrummond所說,對應於按值調用的結果。你也許可以從中推斷出對結果的呼叫(即Ada'out')。 –

回答

0

我只是自己做的。

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

實現使用Ada語言

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; 

由於阿達使用呼叫逐結果的方式,結果應該是1 4。 (可以通過將此代碼輸入到在線Ada編譯器「http://www.tutorialspoint.com/compile_ada_online.php」進行檢查)

而且,其他結果施加不同的通參數類型應該是...由值
呼叫:1個1
呼叫通過引用:5 5
比較>呼叫由值結果:1 4)

+2

請記住,Ada中的參數傳遞方法取決於類型。整數類型通過複製傳遞,而(例如)標記類型通過引用傳遞。對於某些類型,選擇取決於編譯器實現者。 –

+2

理想情況下,Ada編譯器會拒絕編譯此代碼,理由是這是一個等待發生的錯誤。 –

+2

LRM 6.2中提供了一個可能的提示:「如果某個對象是未指定參數傳遞機制的類型,並且不是明確的別名參數,則通過一個訪問權限分配給該對象是一個有界錯誤路徑,然後通過不同的訪問路徑讀取對象的值「。如果您確實需要指針,請使用指針。然而,在編寫Ada時,最好忘記通過機制來支持IN,IN OUT和OUT。 – B98