Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Пример 1.5



Использование процедуры с параметрами без типа (2-й способ). Программа полного и частичного сравнения значений элементов массивов и записей.

Program Ravno2;

Type

Vector = Array [1 .. 6] Of Integer;

Point = Record

Х,У: Integer;

End;

Var {Объявление глобальных переменных}

Vеc1, Vec2: Vector; {Vес1, Vec2 – массивы из 6 целых чисел}

N, I: Integer;

Р: Point; {Р – запись из двух целых полей Х и Y}

Rez: Boolean; {Rez – глобальная переменная, куда заносится результат выполнения процедуры Equal}

{Процедура Equal сравнивает любые две переменные Source и Dest любого размера Size}

Procedure Equal (Var Source, Dest; Size: Word; Var Rez: Boolean); {Source, Dest – сравниваемые переменные (параметры-переменные без типа); Size – размер полей, занимаемых сравниваемыми переменными в памяти машины; Rez – результат выполнении процедуры Equal}

Type

Bytes = Аrrау [0 .. Maxint] Of Byte;{ Тип массив байтов вводится для последующего присваивания параметрам без типа Source и Dest}

Var

N: Integer; {N – локальная переменная}

Begin

N:= 0;

While (N < Size) And (Bytes (Dest) [N] = Bytes (Source) [N]) Do Inc (N); {Наращивание N производится в пределах размеров сравниваемых переменных в байтах (N<Size) до тех пор, пока N-е байты переменных Dest и Source, представленных в виде массива байтов, равны}

Rеz:= N = Size; {Rez равен True, если значения Dest и Source в пределах длины Size равны (N достигло значения Size), в прoтивнoм случае Rez равен Fаlse}

End; {Конец процедуры Equal1}

Begin {Вызывающая программа}

В данном примере приведен фрагмент программы, выполняющей те же действия, что и в предыдущем примере. Процедура Equal по своему назначению аналогична процедуре Equal1. Однако совместимость параметров без типа Source и Dest с фактическими параметрами достигнута иным способом. В теле процедуры введен тип Bytes, представляющий собой массив, состоящий из Maxint+1 байта. Данный тип присваивается параметрам без типа Source и Dest с помощью присваивания типа:

Bytes (Source)

Bytes (Dеst).

в заголовке оператора While процедуры.

Вызывающая программа в данном примере аналогична вызывающей программе примера 1.4.

1.2.10. Параметры процедурного типа

Параметры процедурного типа -это группа параметров, перед которыми не используется зарезервированное слово Var или Const и за которыми следует процедурный тип.

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

Описание процедурного типа вводится в разделе Туре. Синтаксис описания совпадает с заголовком подпрограммы (процедуры или функции), однако имя подпрограммы в описании опускается.

Например:

Pr = Procedure (Х: Integer; Var Y: Real);

Pr1 = Procedure (А, В: String; Р: Pr);

Здесь объявлены два процедурных типа — Pr, Pr1. В типе Pr1 в качестве параметра используется переменная Р процедурного типа Pr.

Имена параметров в описании процедурного типа играют чисто иллюстративную роль. Никакого влияния на это описание данные имена не оказывают.

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

Например, с учетом вышеприведенных описаний типа вводятся две переменные P и P1 процедурного типа:

Var

Р: Pr;

P1: Pr1;

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

1) она должна компилироваться в состоянии {$f+} (дальний вызов, переход между сегментами памяти); это значит, что в исходном тексте программы перед описанием такой подпрограммы должна быть размещена директива компилятора {$f+}, а после окончания описания – {$f-};

2) она не должна быть стандартной процедурой или функцией;

3) она не должна быть вложенной;

4) она не должна быть подпрограммой типа Inline;

5) она не должна быть подпрограммой прерывания (Interrupt);

6) ее заголовок должен соответствовать заголовку процедурной переменной.

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

Процедурная переменная занимает четыре байта памяти.

Наличие процедурных типов позволяет описывать подпрограммы, которые воспринимают процедуры или функции в качестве параметров.

Если подпрограмма должна передаваться в качестве фактического параметра, она должна удовлетворять тем же правилам совместимости типа, что и при присваивании.

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

Применение параметров процедурного типа иллюстрирует пример 1.6.





Дата публикования: 2014-12-11; Прочитано: 174 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.007 с)...