- •Процедуры и функции
- •Процедуры
- •Пример Вызов процедуры InpInt для ввода k целых чисел в массив m.
- •Функции
- •Формальные и фактические параметры
- •Параметры-значения Параметры-значения передаются основной программой в подпрограмму через стек в виде их копий. Сам параметр программы подпрограммой измениться не может.
- •Параметры-переменные
- •Этот вариант лучше предыдущего, так как в стеке не создается копия исходного массива, что улучшает быстродействие и экономит память.
- •Локализация имен
- •Пример Структура вложенной программы.
- •Основное правило Паскаля
- •Допустимые вызовы процедуры
- •Совместимость и преобразование типов данных
- •Параметры-массивы и строки открытого типа
- •Процедурные типы
- •Проблема совместимости
- •Рекурсия
- •Побочный эффект
- •Рекурсивная функция
- •Стеки для локальных переменных и параметров
- •Реализация стеков параметров в Паскале
Процедурные типы
Turbo Pascal позволяет вводить переменные специального вида, значениями которых могут служить подпрограммы. Иными словами, Turbo Pascal позволяет интерпретировать процедуры и функции как значения, которые можно присваивать переменным и использовать в качестве параметров. Речь идёт о подпрограммах как о целостных объектах, а не о значениях, возникающих в результате их выполнения.
Пример
var
P: procedure;
Возможными значениями переменной P могут являться любые процедуры без параметров.
В общем случае процедурный тип задаётся конструкцией, очень похожей на заголовок процедуры или функции.
Пример
type
Func=function(x,y: integer): integer;
var
F1, F2: Func;
Переменным F1 и F2 могут быть присвоены в качестве значений функции от двух целых параметров, возвращающие целый результат. Если в этой программе есть описание функции
function Add(a,b: integer):integer;
begin
Add:=a+b
end;
то допустимо присвоение вида F1:=Add;
Переменной F1 в качестве значения присваивается функция как таковая. Выполнения этой функции не происходит.
После такого присваивания имеется возможность вызывать функцию Add как по значению, так и с помощью указания переменной F1, то есть
writeln(Add(1, 2)); writeln(F1(1, 2)); Оба оператора напечатают число 3.
Определение процедурного типа аналогично заголовку подпрограммы с той лишь разницей, что имя подпрограммы не задаётся.
Пример
type
Proc= procedure;
BinOperation= function(x,y: real): real;
UnOperation= function(x: real): real;
Reading= procedure(var f: text; var Elem: char);
Имена формальных параметров, указываемых в процедурных типах, играют чисто иллюстративную роль, на смысл определений никакого влияния не оказывают. Необходимыми являются только идентификаторы типов параметров и результатов. Последнее указывается для функций.
Turbo Pascal позволяет определять переменные, значениями которых могут быть процедуры и функции. Для таких переменных допускаются операторы присваивания, в правых частях которых находятся идентификаторы других процедурных переменных или идентификаторов подпрограммы. Переменная процедурного типа в различные моменты времени может иметь в качестве значения различные подпрограммы.
Такие переменные могут быть использованы для вызова подпрограмм, которые присвоены этим переменным.
Пример
Пусть в программе есть
var
operation: function(x,y: real): real;
function Add(a,b: real):real;
begin
Add:=a+b
end;
function Sub(a,b: real): real;
begin
Sub:=a-b
end;
и выполняется
if condition then operation:=Add
else operation:=Sub;
writeln(operation(2.05,3+x));
В зависимости от истинности условия condition переменной operation будут присвоены либо функция Add, либо Sub. Активизируется та функция, которая была присвоена переменной operation.
Таким образом, в вызовах функции и в операторах процедуры, кроме идентификаторов соответствующих подпрограмм могут быть имена переменных процедурных типов. Выполнение таких конструкций заключается в вызове подпрограмм, которые были присвоены этим переменным.