Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на языке Delphi_1.doc
Скачиваний:
43
Добавлен:
28.03.2015
Размер:
710.14 Кб
Скачать
        1. Локальные объявления

Тело процедуры или функции часто начинают с объявления локальных переменных, которые используются внутри подпрограммы. Эти объявления могут также включать константы, типы, другие подпрограммы. Область видимости локальных идентификаторов ограничена подпрограммой, где они объявлены.

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

procedure DeleteRandomSymbol(var S: string);

function RandomNumber(S: string):integer;

var

LenString: Integer;

Begin

LenString:=Length(s);

Result:= Random(LenString) + 1;

end;

begin

Delete(S, RandomNumber(s), 1);

end;

Область видимости вложенных подпрограмм ограничена подпрограммой, внутри которой они объявлены. В примере функцию RandomNumber можно вызывать только внутри процедуры DeleteRandomSymbol.

        1. Тип возвращаемого значения

Понятие возвращаемого значения имеет смысл только тогда, когда мы говорим о функции, так как процедура не возвращает значения. Функции возвращают значения любых типов данных кроме Text и file of.

Важные тезисы:

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

function Power(X, Y: Double): Double; // X и Y - формальные параметры

begin

Power := Exp(Y * Ln(X));

end;

function Power(X, Y: Double): Double; // X и Y - формальные параметры

begin

Result := Exp(Y * Ln(X));

end;

function Min(const A, B: Integer): Integer;

begin

if A < B then Result := A

else Result := B;

end;

2. Если таких присваиваний несколько, то результатом функции будет значение последнего из этих операторов.

3. Преимущество от использования переменной Result состоит в том, что она может участвовать в выражениях как операнд внутри тела функции.

4. Переменная Result и имя функции всегда представляют одно и то же значение.

Пример:

function MyFunction: Integer;

begin

MyFunction := 5;

Result := Result * 2;

MyFunction := Result + 1;

end;

(Можно задать вопрос, какое значение вернет функция)

Эта функция вернет значение 11.

5. Использование имени функции в правой части оператора присваивания приведет к рекурсивному вызову этой функции в отличие от переменной Result.

        1. Соглашения о вызове подпрограмм

Когда вы объявляете подпрограмму, вы можете указать соглашение о вызове подпрограмм, используя одну из следующих директив: register, stdcall, pascal, cdecl, safecall.

Директива, определяющая правила вызова, помещается в заголовок подпрограммы, например:

procedure Proc; register;

function Func(X: Integer): Boolean; stdcall;

Соглашения о вызове подпрограмм определяют порядок передачи параметров.

1. Директива register задействует регистры процессора для передачи параметров и поэтому обеспечивает наиболее эффективный способ вызова подпрограмм. Эта директива применяется по умолчанию.

2. Директива stdcall используется для вызова стандартных подпрограмм операционной системы.

3. Директивы pascal и cdecl используются для вызова подпрограмм, написанных на языках Delphi и C/C++ соответственно.

Коротко:

Directive Parameter order Clean-up Passes parameters in registers?

register Left-to-right Routine Yes

pascal Left-to-right Routine No

cdecl Right-to-left Caller No

stdcall Right-to-left Routine No

safecall Right-to-left Routine No

Более подробно рассмотрим позже (динамически загружаемые библиотеки)