



                          ГЛАВА 3

                            Типы

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

                 ---------------     -     -----     -
описание типа--->!идентификатор!--->(=)--->!тип!--->(;)-->
                 ---------------     -     -----     -

              -------------
тип --------->!простой тип!-------------------->
        !     -------------          ^
        !     -----------------      !
        !---->!тип "указатель"!------!
        !     -----------------      !
        !     -----------------      !
        !-----!структурный тип!------!
        !     -----------------      !
        !     ---------------        !
        !-----!строковый тип!--------!
        !     ---------------        !
        !     --------------------   !
        ------!идентификатор типа!----
              --------------------

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


                                - 2 -


     - простой тип;
     - структурный тип;
     - тип указатель;
     - порядковый тип;
     - целочисленный тип;
     - вещественный тип;
     - строковый тип.

                        Простые типы

     Простые типы определяют упорядоченные множества  значе-
ний.

                   ----------------
простой тип ------>!порядковый тип!------------>
               !   ----------------      ^
               !   ------------------    !
               --->!вещественный тип!-----
                   ------------------

                      ----------------------------------
вещественный тип ---->!идентификатор вещественного типа!--->
                      ----------------------------------

     Идентификатор  вещественного  типа  относится  к  числу
стандартных идентификаторов, которые могут быть вещественны-
ми, с одинарной точностью, с двойной точностью, с повышенной
точностью  и сложными. В разделах "Числа" и "Строковые конс-
танты" Главы 1 вы можете найти описание того, как обозначать
константы целого и вещественного типов.

                      Порядковые типы

     Порядковые типы представляют собой подмножество простых
типов. Все простые типы, отличные от вещественных типов, яв-
ляются порядковыми и выделяются по следующим четырем  харак-
теристикам.


                                - 3 -


     -  Все  возможные  значения  данного  порядкового  типа
представляют собой упорядоченное множество, и каждое возмож-
ное значение связано с порядковым номером, который представ-
ляет  собой  целочисленное значение. За исключением значений
целочисленного типа, первое значение любого порядкового типа
имеет  порядковый номер 0, следующее значение имеет порядко-
вый номер 1 и так далее для каждого значения в этом порядко-
вом  типе.  Порядковым  номером значения целочисленного типа
является само это значение. В любом порядковом типе  каждому
значению,  кроме  первого,  предшествует  другое значение, и
после каждого значения,  кроме  последнего,  следует  другое
значение в соответствии с упорядоченностью типа.
     - К любому значению порядкового  типа  можно  применить
стандартную функцию Ord, возвращающую порядковый номер этого
значения.
     - К любому значению порядкового  типа  можно  применить
стандартную  функцию  Pred, возвращающую предшествющее этому
значению значение. Если эта функция  применяется  к  первому
значению  в  этом  порядковом типе, то выдается сообщение об
ошибке.
     - К любому значению порядкового  типа  можно  применить
стандартную  функцию  Succ,  возвращающую  следующее за этим
значением значение. Если эта функция применяется к последне-
му значению в этом порядковом типе, то выдается сообщение об
ошибке.

     Синтаксис порядкового типа имеет следующий вид:

                    ------------------
порядковый тип ---->!  отрезок типа  !------------------->
                !   ------------------                ^
                !   ------------------                !
                !-->!перечислимый тип!----------------!
                !   ------------------                !
                !   --------------------------------  !
                --->!идентификатор порядкового типа!---
                    --------------------------------


                                - 4 -


     Турбо-Паскаль имеет семь встроенных  порядковых  типов:
integer (целое), shortint (короткое целое), longint (длинное
целое), byte (длиной в байт), word (длиной в слово), boolean
(булевское)  и  char  (символьный).  Кроме того, имеется два
других класса определяемых пользователем  порядковых  типов:
перечислимые типы и отрезки типов.

                     Целочисленный тип

     В Турбо-Паскале имеется пять  встроенных  целочисленных
типов:  shortint  (короткое целое), integer (целое), longint
(длинное целое), byte (длиной в байт) и word (длиной в  сло-
во). Каждый тип обозначает определенное  подмножество  целых
чисел, как это показано в следующей Таблице.
                                                Таблица 15.1
               Встроенные целочисленные типы
------------------------------------------------------------
     Тип                Диапазон                Формат
------------------------------------------------------------

короткое целое        -128 .. 127         8 битов со знаком
целое               -32768 .. 32767       16 битов со знаком
длинное целое  -2147483648 .. 2147483647  32 бита со знаком
длиной в байт            0 .. 255         8 битов без знака
длиной в слово           0 .. 65535       16 битов без знака

------------------------------------------------------------

     Арифметические действия над  операндами  целочисленного
типа  предполагают  8-битовую,  16-битовую и 32-битовую точ-
ность в соответствии со следующими правилами:

     - Тип целой константы представляет собой встроенный це-
лочисленный тип с наименьшим диапазоном, включающим значение
этой целой константы.
     - В случае бинарной  операции  (операции,  использующей
два  операнда),  оба операнда преобразуются к их общему типу

                                - 5 -


перед тем, как над ними совершается  действие.  Общим  типом
является  встроенный целочисленный тип с наименьшим диапазо-
ном, включающим все возможные значения обоих  типов.  Напри-
мер,  общим типом для целого и целого длиной в байт является
целое, а общим типом для целого и целого длиной в слово  яв-
ляется  длинное целое. Действие выполняется в соответствии с
точностью общего типа и типом результата является общий тип.
     - Выражение справа в операторе присваивания вычисляется
независимо от размера переменной слева.

     Значение одного целочисленного типа  может  быть  явным
образом  преобразовано  к  другому целочисленному типу с по-
мощью приведения типов. (Приведение типов описывается в Гла-
вах 4 и 6).

                       Булевский тип

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

     - False < True
     - Ord(False)=0
     - Ord(True)=1
     - Succ(False)=True
     - Pred(True)=False

                   Символьный тип (char)

     Множеством значений этого типа являются символы, упоря-
доченные  в соответствии с расширенным набором символов кода
ASCII (Приложение С). При вызове функции Ord(Ch), где  Ch  -
значение символьного типа, возвращается порядковый номер Ch.
     Строковая константа с длиной 1 может обозначать  значе-
ние  константы  символьного типа. Любое значение символьного
типа может быть получено с помощью стандартной функции Chr.


                                - 6 -


                      Перечислимый тип

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

                     -    ------------------------    -
перечислимый тип -->(()-->!список идентификаторов!-->())->
                     -    ------------------------    -

                             ---------------
список идентификаторов ----->!идентификатор!------------->
                         ^   ---------------   !
                         !          -          !
                         ----------(,)<---------
                                    -

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

     suit = (club,diamond,heart,spade)

Согласно этим описаниям  diamond  является  константой  типа
suit.
     При применении функции  Ord  к  значению  перечислимого
типа  Ord  возвращает целое число, которое показывает, какое
положение занимает это значение в отношении других  значений
этого перечислимого типа. Согласно предшествующим описаниям,

                                - 7 -


Ord(club) возвращает 0, Ord(diamond) возвращает 1 и так  да-
лее.

                        Отрезок типа

     Отрезок типа прдставляет собой собой диапазон  значений
из  порядкового типа, называемого главным типом. Определение
отрезка типа включает наименьшее  и  наибольшее  значение  в
поддиапазоне. Оно имеет следующий синтаксис:

                 -------------    --    -------------
отрезок типа----->! константа !-->(..)-->! константа !-->
                 -------------    --    -------------

     Обе константы должны иметь один  и  тот  же  порядковый
тип.  Отрезки типов, имеющие вид  a..b, предполагают, что  a
меньше или равно b.
     Приведем примеры отрезков типов:

     0..99
     -128..127
     club..heart

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

                      Вещественный тип

     К вещественному типу относится подмножество  веществен-
ных  чисел, которые могут быть представлены в формате с пла-
вающей запятой с фиксированным числом цифр. Запись  значения
в формате с плавающей запятой обычно включает три значения -
m, b и e - таким образом, что m x b**e=n, где b всегда равен
2,  а  m  и e являются целочисленными значениями в диапазоне
вещественного типа. Эти значения m и e далее определяют диа-
пазон представления и точность вещественного типа.
     Имеется пять видов вещественных типов: вещественное,  с

                                - 8 -


одинарной  точностью, с двойной точностью, с повышенной точ-
ностью и сложное. Действия над типами с одинарной точностью,
с  двойной  точностью и с повышенной точностью и над сложным
типом могут выполняться только при наличии числового  сопро-
цессора 8087 (который был описан ранее).
     Вещественные типы различаются  диапазоном  и  точностью
связанных с ними значений (см. Таблицу 15.2).

                                              Таблица 15.2
                     Диапазон представления
          и десятичные цифры для вещественных типов
------------------------------------------------------------
Тип                           Диапазон                 Цифры
------------------------------------------------------------
вещественное          2.9x10**-39 до 1.7x10**38  от 11 до 12
с одинарной точностью 1.5x10**-45 до 3.4x10**38    от 7 до 8
с двойной точностью  5.0x10**-324 до 1.7x10**308 от 15 до 16
с повышенной точностью 1.9x10**-4951 до 1.1x10**4932 от 19
                                                     до 20
------------------------------------------------------------

     Сложный тип содержит только  целочисленные  значения  в
диапазоне  от  -2**63+1 до 2**63-1, что приблизительно равно
-9.2x10**18 и 9.2x10**18.
     Турбо-Паскаль поддерживает две  модели  генерации  кода
для  выполнения  действий  над  вещественными  типами: прог-
раммную для чисел с плавающей запятой и аппаратную для чисел
с  плавающей  запятой.  Выбор  соответствующей модели осуще-
ствляется с помощью директивы компилятора $N.

      Программная поддержка чисел с плавающей запятой

     В состоянии $N-, которое устанавливается по  умолчанию,
генерируемый  код  выполняет  все вычисления с вещественными
типами программно, через вызов подпрограмм библиотеки испол-
няющей системы.  Из-за соображений скорости и размера кода в
этом состоянии допускаются только  действия над  переменными
типа real (вещественное). Любая попытка оттранслировать опе-

                                - 9 -


раторы, выполняющие действия  над  типами с  одинарной  точ-
ностью, с двойной точностью,  с повышенной  точностью и  над
сложными типами, вызовет сообщение об ошибке.

       Аппаратная поддержка чисел с плавающей запятой

     В состоянии $N+ генерируемый код выполняет все вычисле-
ния над вещественными типами с помощью числового сопроцессо-
ра 8087. Это состояние позволяет использовать все  пять  ве-
щественных  типов,  однако  оно требует наличия сопроцессора
8087 на этапе компиляции и выполнения.
     Более детальное описание генерации кода при  аппаратной
поддержке  чисел с плавающей запятой вы можете найти в Главе
"Использование процессора 8087 в Турбо-Паскале".

                       Строковые типы

     Значением строкового типа  является  последовательность
символов  с  динамическим  атрибутом длины (в зависимости от
действительного числа символов при выполнении  программы)  и
постоянным  атрибутом размера в диапазоне от 1 до 255. Теку-
щее значение атрибута длины можно получить с  помощью  стан-
дартной функции Length.

                  ------
строковый тип -->(string)----------------------------------->
                  ------  !                                ^
                          !   -    -----------------    -  !
                          -->([)-->!целое без знака!-->(])--
                              -    -----------------    -

     Отношение между любыми двумя строковыми значениями  ус-
танавливается  согласно  отношению  порядка между значениями
символов в соответствующих позициях. В двух  строках  разной
длины каждый символ более длинной строки без соответствующе-
го символа в более короткой строке принимает значение "боль-
ше";  например,  'Xs'  больше, чем 'X'. Нулевые строки могут
быть равны только другим нулевым строкам, и они являются на-
именьшими строковыми значениями.

                                - 10 -


     К символам в строке можно иметь доступ как к  компонен-
там  массива,  что  описывается в разделе "Массивы, строки и
индексы". Операторы работы со строковыми типами  описываются
разделах  "Строковые  операторы"  и  "Операторы  отношений".
Стандартные процедуры и функции для работы со строковыми ти-
пами описаны в разделе "Строковые процедуры и функции".

                      Структурные типы

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

                                  --------------
структурный тип------------------>! тип массив !----------->
                !           ^ !   --------------        ^
                !   ------  ! !   -------------------   !
                -->(packed)-- !-->!множественный тип!---!
                    ------    !   -------------------   !
                              !   --------------        !
                              !-->!файловый тип!--------!
                              !   --------------        !
                              !   --------------        !
                              --->! тип запись !---------
                                  --------------

     Слово packed в описании структурного  типа  требует  от
компилятора уплотнить хранимые данные, даже за счет уменьше-
ния доступа к компоненту  в  переменной  этого  типа.  Слово
packed не имеет никакого действия в Турбо-Паскале, поскольку
упаковка выполняется здесь автоматически всюду, где это воз-
можно.
     Примечание: Максимальный допустимый размер структурного
типа в Турбо-Паскале равен 65520 байт.


                                - 11 -


                        Типы массив

     Массивы содержат фиксированное число компонентов одного
типа,  так  называемого  типа конпонента. На приводимой ниже
синтаксической диаграмме тип компонента  следует  за  словом
of.

           -----     -     ---------------     -     --
тип    -->(array)-->([)--->!индексный тип!--->(])-->(of)--
"массив"   -----     -  ^  --------------- !   -     --  !
                        !        -         !             !
                        --------(,)---------      --------
                                 -                !
                                               -------
                                               ! тип !--->
                                               -------
                     ------------------
индексный тип ------>! порядковый тип !------>
                     ------------------

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

     array[1..100] of real

     Если тип элемента в типе  массив  также является масси-
вом,  то  результат  можно рассматривать как массив массивов
или как один многомерный массив. Например,

     array[boolean] of array[1..100] of array[Size] of real


                                - 12 -


интерпретируется компилятором точно так же, как

     array[boolean,1..10,Size] of real

Кроме того, можно записать выражение:

     packed array[1..10] of packed array[1..8] of boolean

как
     packed array[1..10,1..8] of boolean

     Для доступа  к  элементам  массива  необходимо  указать
идентификатор  массива  с  одним или несколькими индексами в
скобках (см. раздел "Массивы, Строки и индексы").
     Тип массив, имеющий вид

     packed array[m..n] of char

где m меньше, чем n, называется упакованным строковым  типом
(слово  packed  можно  опустить,  поскольку оно не оказывает
действия в Турбо-Паскале). Упакованный строковый  тип  имеет
некоторые свойства, не характерные для других типов массив
(см. "Тождественные и совместимые типы" далее в этой главе).

                        Типы запись

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

                   ------                          ---
 тип запись  ---->(record)----------------------->(end)---->
                   ------  !                  ^    ---
                           !  --------------  !
                           -->!список полей!---
                              --------------


                                - 13 -


          ---------------
список--->!фиксированная!------------------------------------>
полей  !  !часть        ! !                      ^  !      ^
       !  --------------- !   -     ------------ !  !   -  !
       !                  -->(;)--->!вариантная!--  -->(;)--
       !                      -  ^  !часть     !        -
       !                         !  ------------
       ---------------------------

                  ------------------------    -    -----
фиксированная---->!список идентификаторов!-->(:)-->!тип!--->
часть         ^   ------------------------    -    -----  !
              !                -                          !
              ----------------(;)<-------------------------
                               -

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

record
  year:  integer;
  month: 1..12;
  day:   1..31;
end

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


                                - 14 -


вариан-
 ная     ----                        ----------   --    ---------
часть ->(case)---------------------->!тип поля!->(of)-->!вариант!-->
         ---- !                   ^  !признака!   -- ^  --------- !
              !  -----------   -  !  ----------      !     -      !
              -->!идентифи-!->(:)--                  -----(;)<-----
                 !катор    !   -                           -
                 -----------

                      --------------------------------
тип поля признака---->!идентификатор порядкового типа!------->
                      --------------------------------

            -----------     -     -                        -
вариант---->!константа!--->(:)-->(()--------------------->())->
        ^   ----------- !   -     -  !                 ^   -
        !       -       !            !  -------------- !
        -------(,)-------            -->!список полей!--
                -                       --------------

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

record
  firstName,lastName : string[40];
  birthDate : Date;
  case citizen : boolean of

                                - 15 -


    True  : (birthPlace: string[40]);
    False : (country   : string[20];
             entryPort : string[20];
             entryDate : Date;
             exitDate  : Date);
end

record
  x,y : real;
  case kind : Figure of
    rectangle : (height,wigth: real);
    triangle : (size1,side2,angle: real);
    circle : (radius: real);
end

                     Множественные типы

     Диапазон значений множественного типа представляет  со-
бой  мощность  множества  для определенного порядкового типа
(базового типа). Каждое  возможное  значение  множественного
типа  является подмножеством возможных значений базового ти-
па.
     Переменная множественного типа может принимать как  все
значения множества, так и ни одного.

                     ---     --    ----------------
множественный тип-->(set)-->(of)-->!порядковый тип!--->
                     ---     --    ----------------

     Базовый тип не должен иметь более 256 возможных  значе-
ний, и порядковые значения верхней и нижней границы базового
типа должны не превышать диапазона от 0 до 255. В силу этого
базовый  тип  множества не может быть коротким целым, целым,
длинным целым или словом.
     Операции над множественными типами описываются в разде-
ле  "Операции над множествами" в Главе  6. В разделе "Описа-
тели множеств" показано, как определять значения множества.
     Любой множественный тип может  принимать  значение  [],
которое называется пустым множеством.

                                - 16 -



                       Файловые типы

     Файловый тип  состоит  из  линейной  последовательности
компонентов,  которые  могут  иметь любой тип за исключением
файлового типа или структурного типа, содержащего  компонент
с  файловым типом. Число компонентов не устанавливается опи-
санием файлового типа.
                    ----        --     -------
файловый тип------>(file)----->(of)--->! тип !----->
                    ----   !    --     -------  ^
                           !                    !
                           ----------------------

     Если слово of и тип компонента опущены, то тип  обозна-
чает  нетипизованный файл. Нетипизованные файлы представляют
собой каналы ввода/вывода нижнего уровня, в основном исполь-
зуемые  для прямого доступа к любому файлу на диске, незави-
симо от его внутреннего формата.
     Стандартный файловый тип Text определяет файл, содержа-
щий символы, упорядоченные в строки. Текстовые файлы исполь-
зуют специальные процедуры ввода/вывода, которые описываются
в "Ввод и вывод".

                       Типы указатель

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

                     -      -------------
 тип указатель ---->(^)---->!базовый тип!------>
                     -      -------------

                     --------------------
базовый тип -------->!идентификатор типа!----->
                     --------------------

                                - 17 -



     Если базовый тип является еще не описанным  идентифика-
тором,  то он должен быть описан в той же самой части описа-
ния типов, что и тип указатель.
     Переменной-указателю можно присвоить значение с помощью
процедуры New, операции @ или функции Ptr. Процедура New от-
водит новую область памяти в динамически распределяемой  об-
ласти для динамических переменных и сохраняет адрес этой об-
ласти в переменной указателя. Операция @  ориентирует  пере-
менную  указателя на область памяти, содержащую существующую
переменную, включая и те переменные, которые имеют идентифи-
каторы.  Функция Ptr ориентирует переменную указателя на оп-
ределенный адрес в памяти.
     Зарезервированное слово  nil  обозначает  константу  со
значением указателя, которая ни на что не указывает.
     Встроенный  указатель  типа  обозначает  нетипизованный
указатель, то есть указатель, который не указывает ни на ка-
кой определенный тип. Переменные типа Pointer могут быть ра-
зыменованы;  указание символа ^ после такой переменной вызы-
вает появление ошибки. Как и значение,  обозначаемое  словом
nil, значения типа Pointer совместимы со всеми другими типа-
ми указателей.
     В разделе "Указатели и динамические переменные" в Главе
4  вы  можете найти синтаксис ссылки на динамические переме-
ные, которые указываются с помощью указателя-переменной.

              Тождественные и совместимые типы

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

                   Тождественность типов

     Тождественность типов требуется только  для  переменных

                                - 18 -


фактических  и  формальных  параметров при вызове процедур и
функций.
     Два типа, скажем Т1 и Т2, являются тождественными, если
является  истинным  одно  из  следующих утверждений: Т1 и Т2
представляю  собой  один и тот же  идентификатор  типа;  Т1
описан как эквивалентный типу, тождественному Т2.
     Второе условие означает, что Т1 не  обязательно  должен
быть  описан как непосредственно эквивалентный Т2. Следующие
описания типов:

T1 = integer; T2 = T1; T3 = integer; T4 = T2;

означают, что Т1, Т2, Т3, Т4 и integer являются  тождествен-
ными типами. Следующие описания типов

T5 = set of integer; T6 = set of integer;

не определяют Т5 и Т6 как тождественные,  поскольку  set  of
integer  не  является  идентификатором типа. Две переменные,
описанные в одном и том же описании, например:

V1, V2: set of integer;

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

V1: set of integer; V2: set of integer; V3: integer;
V4: integer;

означают, что V3 и V4 имеют тождественный тип, а V1 и  V2  -
нет.

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

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


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

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

           Совместимость в операциях присваивания

     Совместимость по присваиванию  необходима,  если  имеет
место  присваивание значения, например, в операторе присваи-
вания или при передаче значений параметров.
     Значение типа Т1 является совместимым по присваиванию с
типом  Т2  (то есть допустимо Т1:=Т2), если выполняется одно
из следующих условий:

     - Т1 и Т2 имеют тождественные типы, и ни один из них не
является  файловым  типом  или структурным типом, содержащим
компонент с файловым типом на одном из своих уровней.
     - Т1 и Т2 являются совместимыми порядковыми  типами,  и
значения типа Т2 попадают в диапазон возможных значений Т1.
     - Т1 и Т2 являются  вещественными  типами,  и  значения
типа Т2 попадают в диапазон возможных значений Т1.
     - Т1 является вещественным типом, а Т2  является  цело-
численным типом.

                                - 20 -


     - Т1 и Т2 являются строковыми типами.
     - Т1 является строковым типом, а Т2 является символьным
типом.
     - Т1 является строковым типом, а Т2 является  упакован-
ным строковым типом.
     - Т1 и Т2 являются совместимыми упакованными строковыми
типами.
     - Т1 и Т2 являются совместимыми множественными  типами,
и  все  члены значения типа Т2 попадают в диапазон возможных
значений Т1.
     - Т1 и Т2 являются совместимыми типами "указатель".

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

                   Раздел описания типов

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

type
  Range     = integer;
  Number    = integer;
  Color     = (red,green,blue);
  TextIndex = 1..100;
  TestValue = -99..99;
  TestList  = array[TestIndex] of TestValue;
  TestListPtr = ^TestList;
  Date        = record
                  year: integer;
                  month: 1..12;
                  day: 1.. 31;
                end;
MeasureData = record
                when: Date;
                count: TestIndex;
                data: TestListPtr;

                                - 21 -


              end;
MeasureList = array[1..50] of MeasureData;
Name        = string[80];
Sex         = (male,female);
Person      = ^PersonData;
PersonData  = record
                name,firstName: Name;
                age:            integer;
                married:        boolean;
                father,child,sibling: Person;
                  case s: Sex of
                    male:   (bearded: boolean);
                    female: (pregnant: boolean);
               end;
People  = file of PersonData;
IntFile = file of integer

     В этом примере Range, Number и  integer  являются  тож-
дественными  типами. TestIndex является просто совместимым и
совместимым по присваиванию, но не тождественным,  с  типами
Number, Range и integer.


