Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Osnovy_informatiki_-_7_Parametry_podprogramm

.pdf
Скачиваний:
12
Добавлен:
13.02.2015
Размер:
177.45 Кб
Скачать

Фактические параметры

При передаче по значению могут быть:

Переменные

Константы

Выражения

Все, что имеет значение

При передаче по ссылке

Только то, что имеет адрес в памяти (переменные, а в общем случае – другие подпрограммы)

11

27.10.2012

Чердынцева М.И. мехмат ЮФУ

Семантика вызова подпрограммы

Запись активации подпрограммы

Возвращаемое значение (только для функций)

Локальные переменные

Параметры

Адрес записи активации вызывающей подпрограммы

Адрес возврата

Возрастание адресов

12

27.10.2012

Чердынцева М.И. мехмат ЮФУ

Программный стек

Вершина стека

 

 

 

 

Заполняется сверху –

 

вниз, по мере вызова

 

подпрограмм.

 

После завершения

 

подпрограммы ее запись

 

активации удаляется из

 

стека

 

 

Статическая память

Глобальные переменные

 

 

Код программы, включая

 

подпрограммы

 

 

 

Возрастание адресов

13

27.10.2012

Чердынцева М.И. мехмат ЮФУ

Пример

var r: real; function p( i : integer ): real;

var r: real;

begin

...

end;

procedure q( j : integer ); var r1: real;

begin

 

r1:=p(1);

 

end;

 

begin

 

q(2);

 

14 end.

27.10.2012

r1

J:=2

АЗА основной программы

ЗА q

Адрес возврата

result

 

r

 

I:=1

ЗА p

 

АЗА функции P

 

Адрес возврата

 

Статическая память

Код программы и подпр-м

Чердынцева М.И. мехмат ЮФУ

Статическая и автоматическая память

Статическая – выделяется один раз до начала программы, освобождается после ее завершения.

Автоматическая – это память на стеке. Выделяется и освобождается по ходу выполнения программы.

Блочные переменные располагаются в автоматической памяти.

15

27.10.2012

Чердынцева М.И. мехмат ЮФУ

Алгоритм вызова подпрограммы

Выделить место на стеке для ЗА

Разместить локальные переменные и параметры

Записать адрес активации вызывающей подпрограммы и адрес возврата на стек

Выполнить подстановку параметров

Перейти на начало кода вызываемой подпрограммы

16

27.10.2012

Чердынцева М.И. мехмат ЮФУ

Алгоритм вызова подпрограммы

Выполнить тело вызываемой подпрограммы

Если это – функция, то заполнить ячейку результата в записи активации.

Освободить память, занимаемую записью активации подпрограммы.

Осуществить переход на адрес возврата.

17

27.10.2012

Чердынцева М.И. мехмат ЮФУ

Побочный эффект

var i: integer;

procedure p; begin i:=i+1;

end;

begin i:=5; p;

write(i);

// "неожиданно" i меняется в результате вызова процедуры p end.

18

27.10.2012

Чердынцева М.И. мехмат ЮФУ

Побочный эффект

var i: integer; procedure row;

// локальная переменная i не описана - ошибка! begin

for i:=1 to 5 do write('*');

writeln end;

begin

for i:=1 to 10 do row;

// зацикливание! end.

19

27.10.2012

Чердынцева М.И. мехмат ЮФУ

Локальные переменные

function Sum(n: integer): integer;

var i,s: integer; //локальные переменные не инициализируются begin

for i:=1 to n do s:=s+n;

Result:=s; end;

При вызове Sum(1) "почему-то" получилось 193499

20

27.10.2012

Чердынцева М.И. мехмат ЮФУ