Директивы подпрограмм
Определяют действия компилятора. Предусмотрены директивы:
Директива | Действие | Комментарий |
Forward | Опережающее описание | Сообщает, что описание ПП находится дальше |
External | Внешняя подпрограмма | ПП в дисковом файле в объектном коде |
Assembler | Язык Ассемблера | Отмена стандартных инструкций обращения к ПП |
Overload | Перезагрузка | Нужен анализ фактических параметров ПП |
Far | Дальняя модель вызова | Для DOS. Для Windows не требуются |
Near | Ближняя модель вызова |
Директивы, которые определяют порядок работы со стеком и регистрами процессора. Можно использовать одну из них.
Директива | Действие | Комментарий |
Register | Регистр | Использовать до 3 регистров процессора для ПП. Установлена по умолчанию |
Pascal | Паскаль | Все параметры подпрограмм размещаются в стеке. Для совместимости со старыми программами |
StdCall | Стандартный вызов | Используется при обращении к ПП Windows API |
SaveCall | Безопасный вызов | Используется при обращении к ПП Windows API при работе с дуальным интерфейсом |
CDecl | Декларации языка C | Стек очищается вызывающей программой. Для вызова ПП из DLL, написанных на языке C++ |
Директива External
Директива External – означает внешняя. Используется для включения в программу готовых ПП в машинных кодах. Они пишутся на языке Ассемблера или С, компилируются отдельно. Хранятся в виде файлов с расширением .obj. Для использования внешней ПП такого типа, в текст программы надо включить директиву компилятора {$L <имя Obj-файла>}. Формат заголовка:
function Max(x,y:real):real;external;
Пример
program Dir_External;
{$mode objfpc}{$H+}
{————-}
function Max(x,y:real):real;external; // Объявление внешней ПП
begin
{————-}
{$L <имя Obj-файла>} // Директива компилятора
z:=Max(x,y); // Использование внешней ПП
{————-}
end.
Директива Overload. Перезагрузка функций
Возможны случаи, когда программист создает функции одинакового функционального назначения, но работающие по-разному. В таких функциях количество и тип параметров могут отличаться. При вызове подобной функции компилятор анализирует фактические параметры, на основании чего вызывает нужную функцию. Для обеспечения такой возможности используется директива компилятора Overload (перезагрузка). Директива overload включается в заголовок функции, для которой задается такой режим.
Пример. В нем с помощью двух перезагружаемых функций с одинаковым именем Min для пары элементов определяется минимальное значение числа и порядкового номера символа.
program Dir_Overload;
{$mode objfpc}{$H+}
uses SysUtils,RusTrans; // Ссылка на модули
var
x,y: real;
s,v : char;
function Min(a,b:real):real; overload; // Объявление 1 ПП
begin
if a>b then result:=b
else result:=a;
end;
function Min(a,b:char):char; overload; // Объявление 2 ПП
begin
if a>b then result:=b
else result:=a;
end;
begin
writeln(Rus(‘Введите два номера’)); // Приглашение
readln(x,y); // Ввод данных
writeln(‘Min=’, Min(x,y):3:0); // Вывод ответа с 1 ПП
readln; // Пауза, смотрю результат
writeln(Rus(‘Введите два символа без пробела’)); // Приглашение
readln(s,v); // Ввод данных
writeln(‘Min=’, Min(s,v)); // Вывод ответа с 2 ПП
readln; // Пауза, смотрю результат
end.end.
Процедура Exit
Процедура Exit используется для досрочного выхода из подпрограммы. Exit – выход