Главная » Free Pascal » Специфика описания подпрограмм (процедур и функций) Free Pascal

0

± Описание процедуры:

procedure имя_проц [(список_формальных_параметров)]; [директивы];

Блок подпрограммы

end;

± Описание функции:

function имя_функ[(список_формальных_параметров)] : тип; [директивы];

Блок вычисления значения функции Возврат значения функции

end;

Список формальных параметров состоит из элементов, между которыми в ка- честве разделителя используется точка с запятой. Каждый элемент списка может содержать до трех полей:

[ характеристика ] имя [ : тип ]

Перечень возможных характеристик приведен в табл. П1.8.

Таблица П1.8

Характеристика

Способ передачи и использования параметра

Отсутствует

Параметр передается по значению. Это значение, как правило, используется в правой части оператора присваивания (rvalue — от right value). В теле подпрограммы имя параметра эквивалентно

локальной переменной. Ее значение можно менять, но вызывающая программа никакой информации об этом не получит

var

Параметр передается по адресу. Значение такого параметра может использоваться как в левой части оператора присваивания

(lvalue — от left value), так и в правой (rvalue). Последнее изменение

параметра, выполненное в теле подпрограммы, возвращается в вызывающую программу

out

Параметр передается по адресу. В текущей версии FP характеристики out и var эквивалентны. Обычно приставка out обозначает выходной параметр подпрограммы, который используется только в левой части оператора присваивания

const

Используется для обозначения входного параметра, имя которого может находиться только в правой части оператора присваивания (rvalue). В зависимости от длины значения передается либо по адресу (длина значения превышает 4 байта), либо по значению. Значение такого параметра или элементов такого массива в подпрограмме менять нельзя

Если в элементе списка отсутствует указание о типе, то подпрограмма получает адрес нетипизированного параметра. Обращению по такому адресу обязательно должно предшествовать приведение к нужному типу. Для этого можно воспользо- ваться либо явным приведением к типу (например, y:=Integer(x);), либо заданием соответствия между таким адресом и типизированной локальной переменной под- программы:

var

y: Double absolute x;

Важную роль в списке формальных параметров играют открытые массивы:

procedure proc1(…; a:array of integer; …);

В качестве параметра a вызывающая программа может передать любой одно- мерный целочисленный массив, например массив b, объявленный следующим об- разом:

var

b: array [3..10] of integer;

При этом между элементами массивов a и b устанавливается следующее соот- ветствие:

± элементу b[3] соответствует элемент a[0];

± элементу b[4] соответствует элемент a[1];

± …

± элементу b[10] соответствует элемент a[High(a)].

Несколько элементов списка формальных параметров, расположенных подряд и имеющих одинаковые атрибуты, могут быть описаны более компактно. Напри- мер, вместо:

function f1(a:double; b:double; c:double):double;

можно записать:

function f1(a,b,c:double):double;

Нескольким последним элементам списка формальных параметров могут быть приписаны значения по умолчанию. Например:

function sum(a1,a2:integer;a3:integer=3;a4:integer=4):integer; begin sum:=a1+a2+a3+a4; end;

К такой функции можно обращаться с двумя, тремя и четырьмя параметрами:

sum(1,2)=10 sum(1,2,-2)=5

sum(1,2,-2,-1)=0

Вместо опущенных параметров подставляются их значения по умолчанию. Система Free Pascal допускает использование более полутора десятков дирек-

тив, размещаемых поодиночке или группами в заголовках функций и процедур. Большинство из них связано с вызовами подпрограмм, написанных в других сис- темах программирования. Одну из них — директиву cdecl — мы использовали при общении с графическими пакетами OpenGL, GLU и GLUT. Другая директива — forward — была необходима при построении цепочки рекурсивных процедур. На начальной стадии освоения программирования вам вряд ли потребуются другие директивы.

± Способы возврата значения функции.

Система Free Pascal допускает четыре варианта возврата вычисленного значе- ния функции. Традиционный способ заключается в присвоении возвращаемого значения имени функции:

имя_функции := e;

Второй вариант, появившийся в языке Object Pascal, заключается в использова- нии системной переменной Result:

Result := e;

Третий способ заимствован из языка C:

return e; //с одновременным выходом из функции

Четвертый способ использует модифицированную системную функцию exit: exit(e); // с одновременным выходом из функции

Второй способ нам представляется наиболее предпочтительным по двум об- стоятельствам. Во-первых, он обладает повышенной наглядностью. Во-вторых,

имя системной переменной Result может использоваться и как lvalue, и как rvalue. Имя функции может выступать только как lvalue.

± Формат объявления переменных процедурного типа.

Среди элементов списка формальных параметров подпрограммы A могут при- сутствовать имена других функций и процедур. Это и есть параметры процедур- ного типа. Специфика их описания состоит в том, чтобы сообщить компилято- ру порядок и типы аргументов таких функций или процедур. Это понадобится для организации их правильного вызова из тела подпрограммы A. Для вызы- ваемых функций дополнительно необходимо указание типа возвращаемого значения.

Собственно описание данных процедурного типа производится в вызывающей программе и выглядит следующим образом:

type

имя_типа_1 = procedure(список формальных параметров);

имя_типа_2 = function(список формальных параметров): тип_значения;

В заголовке подпрограммы A соответствующему формальному параметру при- писывается тип имя_типа_1 или имя_типа_2. При обращении к подпрограмме A, использующей указанный параметр, в качестве фактического аргумента задает- ся настоящее имя передаваемой процедуры или функции. На самом деле, вызы- ваемая подпрограмма получает адрес точки входа в программу, реализующую указанную процедуру или функцию.

Источник: Кетков, Ю. Л., Свободное программное обеспечение. FREE PASCAL для студентов и школьников, Ю. Л. Кетков, А. Ю. Кетков. — СПб.: БХВ-Петербург, 2011. — 384 с.: ил. + CD-ROM — (ИиИКТ)

По теме:

  • Комментарии