Совместимость типов
Некоторые операции выполнимы только в том случае, если типы их операндов совместимы. Типы ti и t% называются совместимыми, если:
- • это один и тот же тип;
- • ti — диапазонный тип, производный от типа t?, или — диапазонный тип, производный от ti, или ?i и ?2 — диапазонные типы, производные от одного базового типа;
- • ?1 и ?г — типы множеств над двумя совместимыми типами, причем оба одновременно обладают либо атрибутом packed, либо unpacked;
- • ?1 и ?2 — типы (статических) строк символов с одинаковой длиной.
Кроме того, существует совместимость по присваиванию. Совместимость по присваиванию типа переменной в левой части и типа ?2 выражения в правой части (?1 := ?2) определяется так:
- • ?1 и ?2 — это один и тот же тип, кроме типа файла;
- • ?1 — тип real, ?2 — тип integer;
- • ?1 и ?2 — совместимые скалярные типы (кроме real), и значение типа ?2 принадлежит к tp,
- • ?1 и ?2 — совместимые типы множеств, и элементы значения типа ?2 принадлежат к типу, базовому по отношению к tp,
- • ?1 и ?2 — совместимые (статические) строковые типы.
Понятие совместимости применяется также к передаче параметров при вызове процедур и функций. При передаче параметров по ссылке типы формальных и фактических параметров должны быть совместимы; при передаче по значению — совместимы по присваиванию.
Пример 2.3.26.
При объявлении
type vecl = array [1..10] of real;
vec2 = array [1..10] of real;
vec3 = vecl;
типы vecl и vec3 совместимы, так как это один и тот же тип, a vecl и vec2 несовместимы, хотя и имеют одинаковую структуру.
------------------------------------------ PASCAL-XSC ----
Так как в языке PASCAL-XSC предусмотрены дополнительные типы динамических массивов и строк, понятие совместимости также должно быть расширено. Эти расширения описаны в следующем разделе.
Кроме того, программист имеет возможность так определить операцию присваивания := (см. разд. 2.7.12), чтобы явно распространить совместимость по присваиванию на типы, которые иначе были бы несовместимы. Такое расширение совместимости действует только в операторе присваивания, но не при передаче параметров по значению в вызовах процедур и функций.