Osnovy_informatiki_-_7_Parametry_podprogramm
.pdfФактические параметры
При передаче по значению могут быть:
–Переменные
–Константы
–Выражения
Все, что имеет значение
При передаче по ссылке
–Только то, что имеет адрес в памяти (переменные, а в общем случае – другие подпрограммы)
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 |
Чердынцева М.И. мехмат ЮФУ |