Процедуры и функции представляют собой программные блоки, которые могут вызываться из разных частей программы. При вызове в них передаются некоторые переменные, константы, выражения, являющиеся аргументами, которые в самих процедурах и функциях воспринимаются как формальные параметры. При этом функции возвращают значение определенного типа, которое замещает в вызвавшем выражении имя вызванной функции.
Например, оператор
R := 5·F(x);
вызывает функцию F с аргументом X, умножает возвращенное ею значение на 5 и присваивает результат переменной R.
Допускается также вызов функции, не использующий возвращаемого ею значения. Например:
F(x);
В этом случае возвращаемое функцией значение игнорируется.
Первая строка, содержащая имя функции, список параметров и тип возвращаемого значения, называется заголовком или объявлением функции. Если функция, описываемая в данном модуле, должна быть доступна из других модулей, то эта первая строка должна быть продублирована в разделе interface в качестве объявления функции. Аналогичным дублированием первой строки объявляется функция в классе.
Список параметров и объявления локальных элементов и вложенных процедур не обязательны. Если список параметров отсутствует, то скобки после имени функции не ставятся.
Формы описания списка параметров будут рассмотрены позднее. В простом случае это список имен формальных параметров с указанием их типов. Например, объявление:
function FSum(X1, X2: real; A: integer): real;
объявляет функцию с именем FSum, с тремя параметрами X1, Х2 и А, из которых первые два типа rеа1, а последний – integer. Тип возвращаемого результата – rеаl. Имена параметров X1, Х2 и А – локальные, т.е. они имеют значение только внутри данной функции и никак не связаны с именами аргументов, переданных при вызове функции. Значения этих параметров в начале выполнения функции равны значениям аргументов на момент вызова функции.
Тело функции пишется по тем же правилам, что и любой код программы. При этом надо учитывать области видимости различных элементов программы. В теле функции видны объявленные в ней локальные элементы (переменные, функции и т.п.) и глобальные элементы.
Возвращаемое значение в теле функции может присваиваться или имени функции, или специальной предопределенной переменной Result. Например, тело приведенной выше функции FSum может иметь вид:
begin
FSum := A*(X1+X2);
end;
или
begin
Result := A*(X1+X2);
end;
Результат работы обеих приведенных выше функций будет одинаковым. Но переменная Result имеет одно принципиальное отличие от имени функции. Имя функции – это не переменная. Оно может фигурировать только в левой части оператора присваивания и не может входить ни в какие выражения. А Result – это обычная переменная. Поэтому, например, приведенный выше код можно было бы переписать следующим образом:
begin
Result := X1+X2;
Result := Result*A;
end;
С именем функции это сделать невозможно, так как оно не может встречаться в правой части оператора присваивания.
В Object Pascal существует процедура Exit, которая обеспечивает выход из функции или процедуры в любом месте тела программы. Например, приведенный выше текст мог бы быть записан так:
begin
Result := X1+X2;
if (A=1) then exit;
Result := Result*A;
end;
Объявление процедуры практически ничем не отличается от объявления функции, кроме того, что для процедуры не указывается возвращаемое значение:
procedure <имя процедуры> (<список параметров>);
<объявления локальных переменных, типов, констант, описания вложенных функций и процедур>
Begin
<операторы тела процедуры>
end;
Например:
procedure Pr1(S: string);
Form1.Label1.Caption := s;
end;
Вызов этой процедуры может иметь вид:
Pr1 (' Привет ! ');
При передаче в функции и процедуры в качестве параметров коротких строк не допускается включение в объявление спецификации длины строки. Например, объявление:
procedure Check(S: string[2]);
вызовет при компиляции сообщение об ошибке. Но можно включать в объявление тип короткой строки, описанный заранее: