Подпрограммы с параметрами

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. Механизм передачи параметров по значению