Процедуры и функции в ТП используются для сокращения записи повторяющихся частей программы. Каждое объявление процедуры включает в себя заголовок и тело процедуры. Процедура вызывается с помощью оператора процедуры. Функции в ТП отличаются от процедур тем, что возвращают значение любого типа размером в 1, 2, 4 байта или типа String и вызываются внутри выражений.

Каждая процедура или функция в ТП должна быть объявлена в разделе объявлений процедур и функций перед ее вызовом, как было показано в параграфе 1.3.3.

Обявление_процедуры ::= заг_проц тело_проц ";".

В заголовке процедуры описывается имя процедуры и список формальных параметров:

Заг_проц ::= "procedure" ИД

["(" объявление_параметра

{";" объявление_параметра }")"] ";".

объявление_параметра::=["var" | "const"] список_ИД

[":" тип_параметра].

тип_параметра::= ИД_типа | "string" | "file" |

("array" "of" ИД_типа).

Тело_проц ::= ([("near" | "far" | "interrupt") ";"] (БЛОК | "forward"| "external" | блок_asm)) | директива_inline.

Тело процедуры содержит в себе либо блок объявлений и операторов (блок, см. параграф 1.3.3), либо блок программы на ассемблере (блок_asm), либо процедурные директивы, указывающие, что блок будет определен в другом месте программы (forward, external). Дополнительно могут использоваться директивы, определяющие некоторые внутренние свойства и область применения процедуры (near, far, interrupt).

Примеры объявления процедур:

procedure Exec(Path, CmdLine: string);

begin ... end;

procedure FindFirst(Path: PChar; Attr: Word; var F: TSearchRec);

{ TSearchRec - ранее определенный тип}

begin ... end;

procedure S(var T:real; const x: array of real);

begin ... end;

{$L my.obj}

procedure X(a:byte);external; {X - процедура на ассемблере в файле my.obj}

procedure Y(b:integer);forward; {предопределение процедуры Y}

procedure Z(c:longint);far;

begin ... end;

procedure Y(b:integer); {фактическое определение тела процедуры Y}

begin ... end;

Тело процедуры также может состоять только из директивы inline, которая является макроопределением на машинном коде.

Объявление функции отличается от объявления процедуры заголовком и невозможностью применения к телу функции директивы interrupt:

Заголовок_функции::= "function" ИД

["(" объявление_параметра

{";" объявление_параметра }")"] ":" ИД_типа ";".

Идентификатор типа, идущий за двоеточием, определяет тип значения, возвращаемого функцией.

Примеры объявления функций:

function Max(x,y:real):real; begin ... end;

function N(x,y:longint):string; asm ... end;

function D(a:byte):string; near; begin ... end;

function E(var S:string):byte; inline ( ... );

Функции в ТП отличаются от процедур тем, что возвращают некоторый результат и могут быть использованы в выражениях. В составном операторе тела функции должен быть хотя бы один оператор присваивания, слева от которого стоит ИД функции (см. параграф 1.3.3.2). Присваивание значения функции может производиться произвольное количество раз.

Пример:

function Max(x,y:real):real; {определение максимального из двух чисел}

begin

if x>y then

max:=x {присваивание результата функции}

else

max:=y; {присваивание результата функции}

end;

Функции не могут быть функциями обработки прерываний.

Следующая страница ->
Последнее изменение: Вторник 1 Март 2011, 16:17