Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка DELPHI.DOC
Скачиваний:
4
Добавлен:
01.07.2025
Размер:
2.73 Mб
Скачать

Процедура exit

Эта процедура используется, если необходимо досрочно выйти из подпрограммы. Например, задан массив вещественных чисел, найти первый отрицательный элемент в этом массиве:

Function Minus(const M : Array of Real): Real;

Var I: Byte;

Begin

Minus := 0.0;

For I:=0 to High(M) do

If M[i]<0 then begin

Minus := M[i];

Exit;

End;

End;

Директивы подпрограммы

Директивы подпрограммы дают компилятору дополнительную информацию по способу передачи данных, размещению данных в стеке и т.д. Директивы записываются в виде ключевых слов, идущие непосредственно за заголовком подпрограммы, отделяются они от заголовка “ ; ”.

Соглашения по передаче данных

Существуют четыре варианта передачи данных в подпрограммах:

  • Register - базовый режим, который задаётся по умолчанию и характеризуется тем, что может быть использовано до трех регистров процессора для передачи данных. Регистры – внутренняя память процессора, которая необходима непосредственно для проведения вычислений;

  • Pascal, отличающийся от предыдущего режима, в основном тем, что регистры процессора для передачи параметров не используются;

  • Cdecl, являющийся режимом, позволяющим использовать DLL, написанные на C++ или на других языках;

  • Stdcall, являющийся режимом, позволяющим обращаться к подпрограммам Windows.

Директива forward

При объявлении подпрограмм существует правило, нельзя использовать подпрограмму, если она не объявлена и не определена. Если подпрограмма Б вызывает А, а А вызывает Б (циклический вызов), то в этом случае, чтобы не нарушать правило, указанное выше, первую из подпрограмм объявляют с директивой Forward и после этого определяют сначала вторую, а потом первую подпрограммы. Например,

Procedure First(var x : Integer); Forward;

Procedure Second(var x,y : Single);

. . . First(x); . . . . .

end;

Procedure First(Var x : Integer);

. . Second(z1,z2); . . . . .

end;

Директива external

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

Procedure First; externalMyDll.dll’;

Во втором случае имя DLL опускается.

Директива assembler

С помощью этой директивы можно подключать к программам подпрограммы, полностью написанные на языке Assembler, например,

Function Max(x,y:integer):Integer; Assembler;

ASM {Вместо begin}

Mov eax, x

Cmp eax, y {сравнить}

Jge @1 {перейти}

Mov eax, y

@1: end;

Эта подпрограмма ищет максимальное из двух чисел.

Перегруженные подпрограммы

Часто возникает потребность выполнять одни и те же действия над разными типами данных. Например, как удобно работать с функцией Abs(X) – возвращение модуля числа. Если аргумент X - число целое, то результат возвращается, как целое число, если аргумент – число вещественное, то и результат будет числом вещественным. Для создания подпрограмм, которые в зависимости от типа аргумента возвращают разный тип результата, используется механизм перегрузки подпрограмм. Синтаксически перегруженные подпрограммы объявляются с директивой overload и, кроме того, подпрограмма определяется отдельно для каждого типа аргумента. Например,

Procedure ShowResult(I:integer); overload;

Begin

ShowMessage(IntToStr(I));

End;

Procedure ShowResult(R:real); overload;

Begin

ShowMessage(FloatToStr(R));

End;

Procedure ShowResult(S:string); overload;

Begin

ShowMessage(S);

End;

При вызове данной подпрограммы складывается впечатление, что работает одна и та же процедура.

ShowResult(2); ShowResult(5.7);

ShowResult(‘Перегруженная процедура’)

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