Заголовок включает в себя зарезервированное слово Function, идентификатор (имя) функции, заключенный в круглые скобки список формальных параметров (p1,p2, ... ,pn) и тип возвращаемого функцией значения. Имя функции - идентификатор уникальный в пределах блока. Возвращаемый результат может иметь любой скалярный тип (вещественный, целый и некоторые другие).
Тело функции представляет собой локальный блок, по структуре аналогичный программе, т.е. содержит раздел описаний и раздел операторов. В разделе операторов должен находиться по крайней мере один оператор, присваивающий идентификатору функции значение-результат. Если таких операторов несколько, то результатом является значение последнего оператора присваивания.
Обращение к функции осуществляется по имени с указанием списка фактических параметров (аргументов). Каждый фактический параметр должен соответствовать формальному параметру по типу и порядку следования.
Формат вызова таков:
< имя > ( f1,f2,...fn );
Как правило, вызов функции включается в выражение как операнд. При использовании функции, как при использовании процедур работает тот же механизм замены формальных параметров на фактические, т.е. все действия выполняются над фактическими параметрами, вычисляется результат и этот результат передается в точку вызова.
Следующая программа вычисляет площадь двух треугольников ABC и DEF используя определенную программистом функцию SqGeron. У функции SqGeron три параметра ¾ стороны треугольника. Возвращает функция значение типа REAL. В основе вычисления площади треугольника лежит формула Герона.
Program Example ;
VAR
A,B,C:Real ; { стороны треугольника ABC }
D,E,F:Real ; { стороны треугольника DEF }
Sq1:Real ; {площадь треугольника ABC }
Sq2:Real ; {площадь треугольника DEF }
{ функция программиста }
{ Вычисление площади треугольника по формуле Герона }
Function SqGeron(a,b,c:real):real ;
var
p:real ;
begin
p:=(a+b+c)/2;
SqGeron:=sqrt(p*(p-a)*(p-b)*(p-c))
end;
{ Основная программа }
BEGIN
writeln('Введите значения сторон треугольника ABC') ;
readln(A,B,C) ;
writeln('Введите значения сторон треугольника DEF') ;
readln(D,E,F) ;
Sq1:=SqGeron(A,B,C);
Sq2:=SqGeron(D,E,F);
writeln('Площадь треугольника ABC =',Sq1:6:3) ;
writeln('Площадь треугольника DEF =',Sq2:6:3) ;
END.
В программировании на любом алгоритмическом языке часто возникает необходимость передать в процедуру параметр, который является именем другой процедуры или функции. Поскольку все формальные параметры в Паскале должны быть типизированы, т.е. должен быть указан их тип, то появляется потребность ввести новый тип.
Описание процедурного типа осуществляется в соответствии с принятым синтаксисом языка.
Формат оператора:
Type < имя-типа >=Procedure( p1,p2,...,pn );
или
Type < имя-типа >=Function( p1,p2,...,pn ):< тип результата >;
При использовании процедурного типа часто бывает необходимо включить директиву компилятора, обеспечивающую дальний вызов процедур (так называемая Far - адресация). Это объясняется тем, что при отсутствии данной директивы работает Near -адресация , т.е. адрес передается в сокращенной форме без указания сегмента.
Включение директивы компилятора осуществляется записью {$F+}. Знак $, расположенный сразу после открывающей фигурной скобки показывает, что это директива компилятора. Символ F показывает, что устанавливаем Far (дальний) вызов, а знак +показывает, что включаем эту директиву.
Параметры-процедуры и параметры-функции не должны быть стандартными подпрограммами, не должны объявляться внутри других подпрограмм, не иметь директив inline и interrupt.
Пример. Программа, печатающая таблицы сложения и умножения двух целых чисел в заданном диапазоне.
Program Example ;
TYPE
Func = function(X, Y : Integer) : Integer ;
{$F+}
function Add(X, Y : Integer) : Integer ;
begin
Add := X + Y
end ;
function Multiply(X, Y : Integer) : Integer ;
begin
Multiply := X * Y
end ;
{$F-}
Procedure PrintTable(A, B : Integer; Operation : Func) ;