


                          ГЛАВА 5


                   Типизованные константы

     Типизованные константы можно сравнить  с  инициализиро-
ванными  переменными - переменными, значения которых опреде-
ляются на входе в их блок. В отличие от нетипизованных конс-
тант  (см.  раздел "Описания констант" в Главе 1) в описании
типизованной константы указывается как тип, так  и  значение
константы.

описание       ---------    -    -----    -    --------------
типизованной-->!иденти-!-->(:)-->!тип!-->(=)-->!типизованная!->
константы      !фикатор!    -    -----    -    !константа   !
               ---------                       --------------

                  -----------
типизованная----->!константа!------------------------>
константа     !   -----------                 ^
              !   -------------------         !
              !-->!константа-массив !---------!
              !   -------------------         !
              !   ------------------          !
              !-->!константа-запись!----------!
              !   ------------------          !
              !   ---------------------       !
              !-->!константа-множество!-------!
              !   ---------------------       !
              !         ---                   !
              ---------(nil)-------------------
                        ---
     Типизованные константы можно использовать точно так же,
как  переменные того же самого типа, и они указываются в ле-
вой части оператора присваивания. Отметим, что  типизованные
константы инициализируются только один раз - в начале выпол-
нения программы. Таким образом, при  каждом  новом  входе  в
процедуру  или функцию локально описанные типизованные конс-

                           - 2 -


танты заново не инициализируются.

                  Константы простого типа

     Описание типизованной константы с простым типом означа-
ет указание значения константы:

const
  Maximum   : integer = 9999;
  Factor    : real = -0.1;
  Breakchar : char = #3;

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

Const
  Min : integer = 0;
  Max : integer = 99;
type
  Vector = array[Min..Max] of integer;

     Описание Vector является недопустимым, поскольку Min  и
Max являются типизованными константами.

                 Константы строкового типа

     Описание типизованной константы строкового типа  содер-
жит максимальную длину строки и ее начальное значение:

const
  Heading  : string[7] = 'Section';
  NewLine  : string[2] = #13#10;
  TrueStr  : string[5] = 'Yes';
  FalseStr : string[5] = 'No';


                           - 3 -


                Константы структурного типа

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

                   Константы типа массив

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

                    -      ------------------------      -
константа-массив-->(()---->!типизованная константа!---->())-->
                    -  ^   ------------------------ !    -
                       !             -              !
                       -------------(,)--------------
                                     -

     Приведем пример константы типа массив:

type
  Status = (Active,Passive,Waiting);
  StatusMap = array[Status] of string[7];
const
  StatStr: StatusMap = ('Active','Passive','Waiting');

     В этом примере определяется  константа-массив  StarStr,
которая  может быть использована для преобразования значений
типа Status в соответствующие  им  строковые  представления.
Элементами массива StarStr являются:

StatStr[Active]  =  'Active'  StatStr[Passive]  =  'Passive'
StatStr[Waiting] = 'Waiting'

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


волы, и как строки. Определение:

const
Digits:array[0..9] of
 char=('0','1',12','3','4','5','6','7','8','9');

можно представить в более удобном виде:

const
  Digits: array[0..9] of char = '0123456789';

     При описании константы типа "многомерный массив"  конс-
танты  каждой  размерности  заключаются в отдельные скобки и
разделяются запятыми. Расположенные в середине константы со-
ответствуют самым правым размерностям. Описание:

type
  Cube = array[0..1,0..1,0..1] of integer;
const
  Maze: Cube = (((0,1),(2,3)),((4,5),(6,7)));

задает следующие начальные значения массива Maze:

Maze[0,0,0] = 0
Maze[0,0,1] = 1
Maze[0,1,0] = 2
Maze[0,1,1] = 3
Maze[1,0,0] = 4
Maze[1,0,1] = 5
Maze[1,1,0] = 6
Maze[1,1,1] = 7

                   Константы типа запись

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


                                - 5 -


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

     Приведем несколько примеров констант-записей:

type
  Point  = record
             x,y: real;
           end;
  Vector = array[0..1] of Point;
  Month  =
 (Jan,Feb,Mar,Apr,May,Jun,Jly,Aug,Sep,Oct,Nov,Dec);
  Date   = record
             d: 1..31; m: Month; y: 1900..1999;
           end;
const
  Origon  : Point = (x: 0.0; y: 0.0);
  Line    : Vector = ((x: -3.1; y: 1.5),(x: 5.8; y: 3.0));
  SomeDay : Date = (d: 2; m: Dec; y: 1960);

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

               Константы множественного типа

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


                       -                               -
константа-множество-->([)---------------------------->(])-->
                       -  !                        ^   -
                          !    ----------------    !
                          ---->!  константа-  !-----
                           ^   !   элемент    !   !
                           !   ----------------   !
                           !          -           !
                           ----------(,)<----------
                                      -

константа-    -----------
элемент-------!константа!----------------------------->
              -----------  !                      ^
                           !   --    -----------  !
                           -->(..)-->!константа!---
                               --    -----------

     Приведем несколько примеров констант-множеств:

type
  Digits  = set of 0..9;
  Letters = set of 'A'..'Z';
const
  EvenDigits: Digits = [0,2,4,6,8];
  Vowels    : Letters = ['A','E','I','O','U','Y'];
  HexDigits : set of '0'..'z' =
 ['0'..'9','A'..'F','a'..'f'];

                  Константы типа указатель

     Описание константы с типом указатель (которую  называют
иногда  константой  ссылочного  типа) может содержать только
значение nil (пусто). Приведем несколько примеров:

type
  NamePtr = ^NameRec;
  NameRec = record
              Next: NamePtr;

                           - 7 -


              Name: string[31];
            end;
const
  NameList: NamePtr = nil;
  NoName: NameRec = (Next: nil; Name: '');


