2016-05-13 5 views
0

Есть ли подходящий пример для объяснения вызова по результату? (не псевдокод)Вызов по результату Пример

Я узнал, что АЛГОЛ 68, Ада мог использовать этот способ,
, но я не могу найти четкого примера вызова по результату.

+1

Насколько я могу видеть в Ada, термин «позывной» почти никогда не используется, гораздо проще думать о режимах передачи параметров - то есть сказать, что вы хотите, а не о том, как вы хотите бывает. В частности, найдите любой код, который использует параметры 'OUT', (не' IN OUT', который будет соответствовать результату call-by-value). –

+0

Что означает «вызов по результату»? Это метод передачи параметров? –

+0

[Этот ответ] (http://stackoverflow.com/a/3004067/40851) объясняет 'in out', что, как говорит @BrianDrummond, соответствует результату call-by-value. Вероятно, вы можете вывести из него пошаговый результат (т. Е. Ада '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; 

Реализовать с помощью языке Ада

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; 

Так как Ada использует вызов по пути результата, результат должен быть 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: «Если объект имеет тип, для которого механизм передачи параметров не указан и не является явно псевдонимом, то это ограниченная ошибка для назначения объекту через один доступ путь, а затем прочитать значение объекта через отдельный путь доступа ». Если вам нужны указатели, используйте указатели. Лучше, однако, забыть о прохождении механизмов в пользу IN, IN OUT и OUT при написании Ada. – B98