- •В языках программирования высокого уровня используется два типа подпрограмм: процедуры и функции
- •Var имя праметра: имя типа
- •10.3.1. Параметры-значения
- •№8. Явная и неявная рекурсия.
- •№9. Множества. Определение. Область применения
- •№10 И 11. Всё о модулях.
- •12 Бтлет
- •64К, зарезервированная в Borland Pascal для данных, может ока-
- •1. Открытые параметры
- •№25. Причины возникновения ооп.
- •№26. Наследование объектов
- •№ 27. Полиморфизм. Свойства.
- •№28.Методы.
- •Identifier" (Ошибка 4; Повторение идентификатора), если попытае-
- •№29. Облости вилимости в модели объектов Pascal
- •№30.Поведение методов объектов при наследовании
- •№31.Инкапсуляция. Свойства.
- •№32. Объекты. Поля и методы.
- •X,y : Word; {Координаты позиции на экране}
- •№33.Определение объекта.
10.3.1. Параметры-значения
Параметры-значения передаются основной программой в подпрограмму через стек в виде их копий и, следовательно, собственный параметр программы подпрограммой измениться не может.
Параметр-значение указывается в заголовке подпрограммы своим именем и через двоеточие - типом. Тип параметра-значения может быть любым за исключением файлового.
Если параметров-значений одного типа несколько, их можно объединить в од ну группу, перечислив их имена через запятую, а затем уже указать общий тип Как отмечалось выше, отдельные группы параметров отделяются друг от точкой с запятой.
Пример.
procedure Inp(Max, Min: Real; N: Word);
function Mult(X, Y: Integer): Real;
В качестве фактического параметра на месте параметра-значения при вызове подпрограммы может выступать любое выражение совместимого для присваивания типа (см. п. 9.3), не содержащее файловую компоненту, например:
Inp(Abs(Z), -Abs(T), 2 * К);
M:=Mult(X + Y, X - Y);
MA:=Max(B, 5);
Пример. Функция вычисления максимального элемента в массиве. Пусть в основной программе определен тип-массив, массив этого типа и переменная целого типа
type
tArr = array[1..100] of Integer;
var
Massiv: tArr;
Maxim: Integer;
Функция в этом случае может иметь вид:
function Max(Mas: tArr; N: Byte): Integer;
var Ma: Integer;
i: Byte;
begin
Ma := Mas[l];
for i := 2 to N do
if Ma < Mas[i] then
Ma := Mas[i];
Max := Ma
end;
Теперь, например, для определения максимального числа из первых пяти чисел массива Massiv и записи его в переменную Maxim можно записать оператор:
Maxim : = Max(Massiv,5);</p>
Следует иметь в виду, что подпрограмма может работать только с массивами типа tArr. Для массивов другого типа придется создавать другую аналогичную подпрограмму. Кроме того, при работе подпрограммы в стеке будет создана копия исходного массива, что приводит к уменьшению быстродействия и заполнению стека излишней информацией.
10.3.2. Параметры-переменные
При передаче параметров-переменных в подпрограмму фактически через стек передаются их адреса в порядке, объявленном в заголовке подпрограммы. Следовательно, подпрограмма имеет доступ к этим параметрам и может их изменять.
Параметр-переменная указывается в заголовке подпрограммы аналогично параметру-значению, но только перед именем параметра записывается зарезервированное слово var. Действие слова var распространяется до ближайшей точки с запятой, т. е. в пределах одной группы.
Пример.
procedure MaxMin(A: tArr; var Max, Min: Real; N: Word);
Здесь Max, Min - параметры-переменные, А и N - параметры значения.
Тип параметров-переменных может быть любым, включая и файловый.
При вызове подпрограммы на месте параметра-переменной в качестве фактического параметра должна использоваться переменная идентичного типа (см. п. 9.1). Так, если формальный параметр имеет тип, определенный следующим образом:
type tArr = array[1..100] of Integer;
то и фактический параметр должен быть переменной или типизированной константой типа tArr.
Пример. Функция вычисления максимального элемента в массиве. Модифицируем подпрограмму примера п. 10.3.1, используя в качестве первого параметра параметр-переменную:
function Max(var Mas: tArr; N: Byte): Integer;
var Ma: Integer;
i: Byte;
begin
Ma := Mas[l];
for i := 2 to N do
if Ma < Mas[i] then
Ma := Mas[i];
Max := Ma
end;
Этот вариант лучше предыдущего тем, что в данном случае в стеке не создается копия исходного массива, что улучшает быстродействие и экономит память. Однако при такой передаче параметра возможно его нежелательное изменение (такой вариант передачи параметра допустим только в таких небольших подпрограммах, как в данном примере, когда программист может проконтролировать отсутствие несанкционированного изменения параметра). Недостаток же, связанный с тем, что подпрограмма может работать только с одним типом массивов, остается.
10.3.3. Параметры-константы
Часто в качестве параметра в подпрограмму следует передать ту или иную переменную, но изменять ее подпрограмма не должна. В этом случае нежелательно передавать этот параметр как параметр-переменную. Можно его передать как параметр-значение, однако, если эта переменная имеет большой размер (массив, запись и т. д.), то копия такого параметра займет большую часть стека и даже может его переполнить. Это же приводит и к уменьшению быстродействия программы. В этой ситуации параметр лучше передать как параметр-константу. Такой параметр, если он структурированного типа, передается своим адресом, не предусматривается защита от его изменения. Использовать параметр-константу можно только в версии 7.0.
Параметр-константа указывается в заголовке подпрограммы аналогично параметру-значению, но перед именем параметра записывается зарезервированное слово const. Действие слова const распространяется до ближайшей точки с запятой, т. е. в пределах одной группы.
Пример.
function NewString(const S: string): string;
Тип параметра-значения может быть любым за исключением файлового.
При вызове подпрограммы на месте параметра-переменной в качестве фактического параметра можно использовать любое выражение совместимого для присваивания типа (см. п. 9.3), не содержащего файловую компоненту.
Параметр-константу нельзя передавать в другую подпрограмму в качестве фактического параметра.
Пример. Функция вычисления максимального элемента в массиве. В примере п. 10.3.1 используем в качестве первого параметра параметр-константу:
function Max(const Mas: tArr; N: Byte): Integer;
var Ma: Integer;
i: Byte;
begin
Ma := Mas[l];
for i := 2 to N do
if Ma < Mas[i] then
Ma := Mas [ i ] ;
Max := Ma
end;
10.3.6. Параметры-процедуры и параметры-функции
В стандартном Паскале процедуры и функции рассматриваются только как части программы, которые можно выполнять с помощью вызова процедуры или функции. В Borland Pascal процедуры и функции трактуются гораздо шире: здесь допускается интерпретация процедур и функций, как объектов, которые можно присваивать переменным и передавать в качестве параметров. Такие действия можно выполнять с помощью процедурных типов.
В описании процедурного типа задаются параметры, а для функции - результат функции.
Характерно, что синтаксис записи процедурного типа в точности совпадает с записью заголовка процедуры или функции, только опускается идентификатор после ключевого слова procedure или function. Приведем некоторые примеры описаний процедурного типа:
type
Proc = procedure;
SwapProc = procedure(var X, Y: Integer);
StrProc = procedure(S: String);
MathFunc = function(X: Real): Real;
DeviceFunc = function(var F: text): Integer;
MaxFunc = function(A, B: Real; F: MathFunc): Real;
Имена параметров в описании процедурного типа играют чисто декоративную роль - на смысл описание они не влияют.
Borland Pascal не позволяет описывать функции, которые возвращают значения процедурного типа. Результат функции должен быть строкового, вещественного, целого, символьного, булевского типа, указателем или иметь перечислимый тип, определенный пользователем.
Процедурные типы данных
Процедурные типы данных применяются для того, чтобы можно было процедуры и функции понимать как обычные значения, которые можно присваивать переменным, или выполнять с ними различные действия.
