- •Процедуры и функции
- •Процедуры
- •Пример Вызов процедуры InpInt для ввода k целых чисел в массив m.
- •Функции
- •Формальные и фактические параметры
- •Параметры-значения Параметры-значения передаются основной программой в подпрограмму через стек в виде их копий. Сам параметр программы подпрограммой измениться не может.
- •Параметры-переменные
- •Этот вариант лучше предыдущего, так как в стеке не создается копия исходного массива, что улучшает быстродействие и экономит память.
- •Локализация имен
- •Пример Структура вложенной программы.
- •Основное правило Паскаля
- •Допустимые вызовы процедуры
- •Совместимость и преобразование типов данных
- •Параметры-массивы и строки открытого типа
- •Процедурные типы
- •Проблема совместимости
- •Рекурсия
- •Побочный эффект
- •Рекурсивная функция
- •Стеки для локальных переменных и параметров
- •Реализация стеков параметров в Паскале
Стеки для локальных переменных и параметров
Stack - груда, куча, кипа, стопка (перевод с англ.) Структура данных-сравнение со стопкой тарелок. Когда имеет место очередной вызов такой рекурсивной процедуры, значение параметра, ассоциированное с этим вызовом, помещается на верх стека значений. При этом новая ячейка памяти (для следующего значения), содержимое которой изначально не определенно, присоединяется к стеку поверх только что занесенного туда значения. Например, если имеет место обращение к значению N или next в процедуре Reverse, то используется соответствующее значение с верха стека. Если же имеет место рекурсивный возврат, значение, находящееся в данный момент на верху стека, удаляется и следующее значение перемещается на верх стека.
Состояние стеков при вызовах процедуры Reverse
После первого вызова процедуры Reverse
-
N
next
3
?
Непосредственно перед вторым вызовом процедуры Reverse буква а считывается в стек next
-
N
next
3
A
После второго вызова Reverse
-
N
next
2
?
3
a
Непосредственно перед третьим вызовом процедуры Reverse буква b считывается в стек next
-
N
next
2
b
3
a
После третьего вызова Reverse
-
N
next
1
?
2
b
3
a
В ходе выполнения процедуры в стеке next считывается c и тут же печатается, так как N в этот момент имеет значение 1(конечный шаг).
-
N
next
1
c
2
b
3
a
При рекурсивном возврате значения на верху стека удаляются
После первого возврата
-
N
Next
2
b
3
a
Управление возвращается оператору write, осуществляющему вывод значения b, находящегося в этот момент на верху стека next.
После второго возврата
-
N
Next
3
a
Управление передается оператору write, при осуществляется вывод значения c, находящегося на верху стека next.
После третьего возврата:
-
N
Next
?
?
В Паскале эти действия выполняется автоматически.