Руководство по языку B.Pascal 7

       

Совместимость типов


Чтобы они считались совместимыми, процедурные типы должны иметь одно и то же число параметров, а параметры в соответствую- щих позициях должны иметь тождественные типы. При определении совместимости процедурных типов имена параметров значения не име- ют. Значение nil совместимо с любым процедурным типом.

Чтобы использоваться в качестве процедурных значений, проце- дуры и функции должны описываться с директивой far и компилиро- ваться в состоянии с {$F+}. Кроме того, в качестве процедурных значений не могут указываться стандартные процедуры и функции, вложенные процедуры и функции, методы, процедуры и функции, опи- санные с ключевым словом inline или interrupt.

Стандартные процедуры и функции - это подпрограммы, описан- ные в модуле Unit, например, WriteLn, ReadLn, Chr или Ord. Чтобы использовать в качестве процедурного значения стандартную проце- дуру и функцию, напишите для нее "оболочку". Например, следующая функция DSin совместима по присваиванию с описанным выше типом MathFunc:

function FSin(X: Real): Real; far; begin FSin := Sin(X); end;

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


Иногда, например, в выражениях и операциях сравнения, требу- ется совместимость типов. Совместимость типов, кроме того, явля- ется важной предпосылкой для совместимости по присваиванию.

Совместимость типов имеет место, если выполняется по крайней мере одно из следующих условий:

* Оба типа являются одинаковыми.

* Оба типа являются вещественными типами.

* Оба типа являются целочисленными.

* Один тип является поддиапазоном другого.

* Оба типа являются отрезками одного и того же основного ти- па.

* Оба типа являются множественными типами с совместимыми ба- зовыми типами.

* Один тип является строковым типом, а другой - строковым типом, упакованным строковым типом или типом PChar;

* Один тип - это тип Pointer, а другой - любой ссылочный тип.

* Один тип является типом PChar, а другой - символьным мас- сивом с нулевой базой вида array[0..X] of Char (это дейс- твует только при разрешении директивой {$X+} расширенного синтаксиса).

* Оба типа являются указателями идентичных типов (это дейс- твует только при разрешении указателя с проверкой типа ди- рективой {$X+}).

* Оба типа являются процедурными с идентичными типами ре- зультатов, одинаковым числом параметров и соответствием между параметрами.



Содержание раздела