Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Algoritmy.doc
Скачиваний:
3
Добавлен:
27.04.2019
Размер:
550.91 Кб
Скачать

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

  1. Выделить место на стеке для записи активации подпрограммы.

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

  3. Вычислить значения фактических параметров и подставить их на место формальных. При передаче по ссылке на стек кладется адрес фактического параметра.

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

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

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

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

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

Замечания.

  1. Выделение и освобождение места под запись активации происходит быстро.

  2. Локальные переменные не инициализируются.

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

Статическая память – память, выделяемая в начале работы программы (под глобальные и под локальные статические переменные). Инициализируется нулевыми значениями.

Автоматическая память – память, выделяемая в процессе работы программы на стеке. Не инициализируется.

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

Переменные, определенные в основной программе, называются глобальными. Переменные, определенные в подпрограмме называются локальными по отношению к этой подпрограмме. Поскольку в языке Паскаль разрешены вложенные описания подпрограмм, то принято также говорить о нелокальных по отношению к данной подпрограмме переменных.

Обращение к глобальным переменным и побочный эффект

Обращение к глобальным переменным внутри процедуры потенциально опасно (не ошибочно, но чревато ошибками, потому нежелательно, по крайней мере, делать это часто).

Особенно опасно изменение глобальных переменных.

Изменение глобальной переменной называют побочным эффектом процедуры.

Переменная-параметр цикла, вызываемого в процедуре, должна быть локальной.

Пример. Ошибка, возникающая при нарушении последнего правила.

var i: integer; procedure row; var i: integer; begin   for i:=1 to 10 do     write('*');   writeln end; ... begin   for i:=1 to 5 do     row end.

Значения локальных переменных не определены при входе в процедуру, в отличие от значений глобальных переменных.

Область видимости и время жизни объекта

Время жизни объекта в памяти – время, в течении которого для объекта выделена память. Для локального объекта его время жизни распространяется с момента описания до конца блока, в котором он описан.

Область видимости объекта – фрагмент программы, в котором можно обратиться к объекту по имени.

Пространство имен – фрагмент программы, в котором не допускается использовать одинаковые имена (исключение составляют перегруженные имена подпрограмм). В Паскале пространство имен определяет подпрограмма.

Пример.

procedure p; var i: integer;   procedure q(j: integer); // имя q принадлежит области видимости процедуры p   var j: real; // - ошибка - повторное объявление   var q: real; // - верно   begin   end; begin end.

Статическая локальная переменная

procedure p; const n: integer = 0; begin   Inc(n); end;

В данном примере n - переменная, она распределяется в статической памяти, ее время жизни совпадает с временем жизни программы,  областью же видимости является процедура p.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]