Подпрограммы с параметрами
Begin end;
Начало раздела описания логики процедуры
Раздел описания логики процедуры
Конец раздела описания логики процедуры
Функции— это процедуры, которые возвращают значения. Благодаря этому их можно использовать в арифметических или логических выражениях, наряду с переменными или константами. Структура функции аналогична структуре процедуры, за исключением заголовка, в котором указывается, значение какого типа возвращает функция. Вместо ключевого слова Procedure в описании функций используется ключевое слово Function:
Function<Имя функции>: <Тип возвращаемого значения>;
Для указания компилятору, какое именно значение должна возвращать функция, в разделе описания логики функции должно использоваться присвоение следующего вида:
<Имя функции> := <3начение>;
В Delphi предусмотрен еще один механизм возврата значения функции в вызывающую подпрограмму — ключевое слово Result:
Result:= <3начение>;
Приведем пример модуля, в котором описана одна процедура и одна функция (листинг 4.1), а также программу, которая подключает этот модуль и вызывает подпрограммы, описанные в нем (листинг 4.2).
Листинг 4.1. Модуль с описанием подпрограмм
Unit Subprograms; (Заголовок модуля содержит название, по которому модуль подключается к программе)
Interface{Начало интерфейсной секции}
Procedure RunMe; (Заголовок процедуры RunMe, которая должна быть реализована в описательной секции и будет доступна в подключающем модуле}
Function GetValue: Integer; (Заголовок функции GetValue, которая должна быть реализована в описательной секции и будет доступна в подключающем модуле)
Implementation{Начало описательной секции)
Procedure RunMe;
Begin
{Реализация процедуры RunMe}
End;
RunMe; GetValue;
V := GetValue;
(Вызов процедуры RunMe}
{Вызов функции GetValue без анализа
возвращаемого значения}
{Вызов функции GetValue с занесением
возвращаемого значения в переменную V}
Листинг 4.2. Программа, подключающая модуль и вызывающая его подпрограммы
Uses Subprograms;{Подключение модуля Subprograms) Var
V: Integer; {Описание целочисленной переменной}
Begin
RunMe; GetValue;
V := GetValue;
(Вызов процедуры RunMe}
{Вызов функции GetValue без анализа
возвращаемого значения}
{Вызов функции GetValue с занесением
возвращаемого значения в переменную V}
Подпрограммы с параметрами
Для повышения гибкости подпрограмм и изменения их функциональности в некоторых пределах можно использовать параметры— некоторые значения, передаваемые в процедуры и функции для внутреннего использования. С помощью параметров вызывающая программа имеет возможность изменять ход выполнения подпрограмм тем или иным образом, заложенным в них разработчиком, что существенно расширяет круг их применения.
Object Pascal поддерживает множество видов параметров. Далее рассмотрены основы использования некоторых из них, а также механизмы их передачи в подпрограммы.
4.2.1. Описание параметров
Описание параметров подпрограмм происходит в их заголовках после имени и имеет следующий вид:
Procedure<Имя> (<Параметр 1>: <Тип параметра 1>; ...;
<Параметр 2>: <Тип параметра 2>);
или для функций:
Function<Имя> (<Список параметров>): <Тип значения>;
Параметры, переданные в подпрограмму, могут использоваться в ней аналогично локальным переменным, а значение, заданное в качестве параметра при вызове подпрограммы, является, соответственно, начальным значением такой переменной.
4.2.2. Механизмы передачи параметров в подпрограммы
Delphi поддерживает два механизма передачи параметров в подпрограммы:
1.По значению (от англ. Value parameter — параметр, передаваемый
по значению); 2. По ссылке.
Передача параметров по значению
При передаче по значению параметр рассматривается как локальная переменная, значение которой устанавливается при вызове подпрограммы, может быть использовано и изменено подпрограммой, но не может повлиять на вызывающий фрагмент. В качестве параметра может указываться переменная или константа, подходящая параметру по типу.
При передаче параметра по значению значение параметра, заданное при вызове подпрограммы, заносится в стек (см. рис. 4.1). Затем подпрограмма выделяет собственную память для локальной переменной, переносит в нее значение параметра, переданное через стек, и обеспечивает доступ к этой локальной переменной через имя параметра. После завершения подпрограммы измененное значение параметра теряется и никак не влияет на данные вызывающего фрагмента. Рассмотрим пример, в котором подпрограмма изменяет значение параметра, переданного ей по значению (см. листинг 4.3).
Рис. 4.1. Механизм передачи параметров по значению