Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Параметры-переменные






Заголовок процедуры с описанными параметрами-переменными имеет такой вид:

procedure MyProc (var Parl, Раг2: Typel; var РагЗ, Раг4: Туре2);

Механизм работы параметров-переменных упрощенно можно предста­вить такой схемой:

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

Параметры-процедуры и параметры-функции. В качестве расширения стандартного Паскаля, Турбо Паскаль позволяет рассматривать процедуры и функции как, объекты, которые можно присвоить переменным и которые могут вы­ступать в качестве параметров; процедурные типы делают это возможным.

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

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

  • Они должны быть объявлены с директивой far (использование дальнего типа вызова подпрограмм) и откомпилированы в состоянии {$F+};
  • Они не должны быть:

ü стандартной процедурой или функцией;

ü вложенной процедурой или функцией;

ü inline процедурой или функцией;

ü interrupt процедурой или функцией.

При использовании параметров-процедур или параметров-функций в списке перед соответствующими формальными параметрами указывается зарезервирован­ное слово procedure или function, например:

procedure Exampl (К, L: integer; var M: real; procedure Prob; function Step: real);

В списке формальных параметров процедуры Exampl: К, L — параметры-значения; М — параметр-переменная; Prob — параметр-процедура; Step — параметр-функция, результатом выполнения которой будет значение вещественного типа.

При вызове подпрограммы на место формальных параметров-процедур и пара­метров-функций осуществляется подстановка имен соответствующих фактических процедур или функций. При этом, если процедуры и функции, фигурирующие в ка­честве фактических параметров, имеют, в свою очередь, параметры, они могут быть только параметрами-значениями.

Параметры процедурного типа особенно полезны в ситуациях, когда над множеством процедур или функций выполняются общие действия. Примером ис­пользования параметров-функций может служить программа, которая с помощью одной и той же процедуры печати таблицы выводит на экран три таблицы арифметических функций (сложения, умножения и произведения суммы на разность чисел), каждая из которых выполняется отдельной функцией,

program Demo_Tabl;

(Описание процедурного типа Func — целой функции двух аргументов целого типа}

Type

Func = function(X, X: integer): integer;

{$F+} {Директива компилятору на использование дальнего типа вызо­ва подпрограмм}

{Описание функции сложения двух целых чисел}

function Add(X, Y: integer): integer;

Begin

Add: =X +Y;

end;

{Описание функции умножения двух целых чисел)

function Mult(X, Y: integer): integer;

Begin

Mult: =X*Y;

end;

{Описание функции умножения суммы на разность двух целых чисел)

function Funny(X, У: integer): integer;

Begin

Funny: = (X+Y) * (X-Y), • end;

{$F-}

{Описание процедуры вывода на экран таблицы для двух чисел от 1 до 10, вид арифметической операции задается значением параметра-функ­ции Operation)

procedure Type_Tabl(W, H: integer; Operation': Func);

Var

X, Y: integer;

Begin

for Y: =l to H do

Begin

for X: =l to W do

Write(Operation(X, Y): 5);

Writeln;

end;

end;

Begin

{Начало главной программы)

Туре_Таbl(10, 10, Add); {Вызов процедуры для печати таблицы сло­жения }

Туре_Таbl(10, 10, Mult); {Вызов процедуры для печати таблицы ум­ножения)

Туре_Таbl(10, 10, Funny); {Вызов процедуры для печати таблицы про­изведений суммы чисел от 1 до 10 на их разность)

End.

Примечание. {SF+} — указание (директива) компилятору Турбо Паскаль на использо­вание дальнего (for) типа вызова для корректной обработки вызова процедуры ТуреТаbl параметрами-функциями.

В данной программе процедура ТуреТаbl представляет собой общее действие, выполняемое над параметрами-функциями Add, Mult, Funny. После запуска про­граммы сначала вызывается процедура ТуреТаbl для фактических параметров 10, 10 и Add, в результате чего формальным параметрам X и Y присваиваются значе­ния чисел 10 и 10, а формальному параметру Operation процедурного типа Func присваивается имя фактической функции Add. В результате этого на экран будет выведена таблица сложения от 1 до 10. Затем процедура ТуреТаbl вызывается к исполнению для фактических параметров 10, 10 и'параметра-функции Mult, в ре­зультате чего на экран будет выведена таблица умножения от 1 до 10. Аналогично вызов процедуры Туре_Таbl с параметрами 10, 10 и Funny даст в результате на эк­ране таблицу произведения суммы на разность чисел от 1 до 10.


ОБЛАСТЬ ДЕЙСТВИЯ (СФЕРА ВИДИМОСТИ)






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.