ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы.



 

Часть 7

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

 описание       ЪДДДДДДДї   ХНё   ЪДДДї   ХНё   ЪДДДДДДДДДДДДї
 типизованнойДДіиденти-ГДДі:ГДДітипГДДі=ГДДітипизованнаяГДДД
 константы      іфикаторі   ФНѕ   АДДДЩ   ФНѕ   іконстанта   і
                АДДДДДДДЩ                       АДДДДДДДДДДДДЩ

                   ЪДДДДДДДДДї
 типизованнаяДДВДДіконстантаГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
 константа     і   АДДДДДДДДДЩ                 
               і   ЪДДДДДДДДДДДДДДДДДї         і
               ГДДіконстанта-массив ГДДДДДДДДДґ
               і   АДДДДДДДДДДДДДДДДДЩ         і
               і   ЪДДДДДДДДДДДДДДДДї          і
               ГДДіконстанта-записьГДДДДДДДДДДґ
               і   АДДДДДДДДДДДДДДДДЩ          і
               і   ЪДДДДДДДДДДДДДДДДДДї        і
               ГДДіадресная константаГДДДДДДДДґ
               і   АДДДДДДДДДДДДДДДДДДЩ        і
               і   ЪДДДДДДДДДДДДДДДДї          і
               АДДіконстанта-объектГДДДДДДДДДДЩ
                   АДДДДДДДДДДДДДДДДЩ

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

     Описание типизованной константы с простым типом означает указание значения константы: 
     const
       Maximum   : integer = 9999;
       Factor    : real = -0.1;
       Breakchar : char = #3;

     Как уже упоминалось ранее, значение типизованной константы можно задать с помощью адресного выражение-константы, то есть выражения, в котором используются адрес, смещение или сегмент глобальной переменной, типизованной константы, процедуры или функц
ии. Например: 
     var
        Buffer: array[0..1023] of Byte;
     const
        BufferOfs: Word = Ofs(Buffer);
        BufferSeg: Word = Seg(Buffer);

     Поскольку типизованная константа фактически представляет собой переменную со значением константы, она не является взаимозаменимой для обычных констант. Например, она не может использоваться в описании других констант или типов. 
     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';

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

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

     Описание константы типа массив содержит значения элементов, заключенные в скобки и разделенные запятыми. 
                    ХНё     ЪДДДДДДДДДДДДДДДДДДДДДДї     ХНё
 константа-массив -і(ГДДДДітипизованная константаГДВДДі)ГДДДД
                    ФНѕ    АДДДДДДДДДДДДДДДДДДДДДДЩ і   ФНѕ
                        і            ХНё             і
                        АДДДДДДДДДДДДґ,ГДДДДДДДДДДДДДЩ
                                     ФНѕ

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

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

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

     Тип элемента константы-массива может быть любым, кроме файлового типа. Упакованные константы строкового типа (символьные массивы) могут быть определены и как одиночные символы, и как строки. Определение: 
     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';

     При разрешении расширенного синтаксиса (с помощью директивы компилятора {$X+}) символьный массив с нулевой базой может инициализироваться строкой более короткой, чем описанная длина массива. Например: 
     const
        FileName = array[0..9] of Char = 'TAST.PAS';

     Примечание: Более подробно о страках, завершающихся нулем, рассказывается в Главе 13. 
     При описании константы типа "многомерный массив" константы каждой размерности заключаются в отдельные скобки и разделяются запятыми. Расположенные в середине константы соответствуют самым правым размерностям. Описание: 
     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

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

     Описание константы типа запись содержит идентификатор и значение каждого поля, заключенные в скобки и разделенные точками с запятой. 
                    ХНё   ЪДДДДДДДї   ХНё   ЪДДДДДДДДДДї   ХНё
 константа-записьДДі(ГДДіиденти-ГДДі:ГДДітипизован-ГДВі)ГДДД
                    ФНѕ  іфикаторі   ФНѕ   іная кон-  і і ФНѕ
                        і іполя   і         істанта    і і
                        і АДДДДДДДЩ   ХНё   АДДДДДДДДДДЩ і
                        АДДДДДДДДДДДДДґ;іДДДДДДДДДДДДДДДЩ
                                      ФНѕ

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

     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
       Origin  : 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);

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

     При описании константы объектного типа используется тот же синтаксис, что и при описании константы типа запись. Значения для элементов (компонентов) метода задаваться не могут. С учетом приводимых ранее описаний объектных типов, приведем некоторые п
римеры констант объектного типа: 
     const
        ZeroPoint: Point = (X: 0; Y: 0)
        ScreenRect: Rect = (A: (X: 0; Y: 0); B: (X: 80; Y: 25);
        CountField: NumField = (X: 5; Y: 20; Len: 4; Name: nil;
          Value: 0; Min: -999; Max: 999);

     Константы объектного типа, которые содержат виртуальные методы, не требуется инициализировать с помощью вызова конструктора. Эта инициализация автоматически выполняется компилятором. 
                  Константы множественного типа

     Как и в случае константы простого типа, описание константы множественного типа задает значение множества, используя выражение-константу. Приведем несколько примеров констант-множеств: 
     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'];

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

     Описание константы с типом указатель для задания значения указателя использует адресное выражение-константу. Приведем несколько примеров: 
     type
       NamePtr = ^NameRec;
       NameRec = record
                   Next: NamePtr;
                   Name: string[31];
                 end;
     const
       NameList: NamePtr = nil;
       NoName: NameRec = (Next: nil; Name: '');

     type
        Direction = (Left, Right, Up, Down);
        StringPtr = ^String;
        NodePtr = ^Node;
        Node = record
                  Next: NodePtr;
                  Symbol: StringPtr;
                  Value: Direction;
               end;
     const
          S1: string[4] = 'DOWN';
          S2: string[2] = 'UP';
          S3: string[5] = 'RIGHT';
          S4: string[4] = 'LEFT';
          N1: Node = (Next: nil; Symbol: @S1; Value: Down);
          N2: Node = (Next: @N1; Symbol: @S2; Value: Up);
          N3: Node = (Next: @N2; Symbol: @S3; Value: Right);
          N2: Node = (Next: @N3; Symbol: @S4; Value: Left);
          DirectionTable: NodePtr = @N4;

     При разрешении расширенного синтаксиса с помощью директивы компилятора {$X+} типизованная константа типа PChar может инициализироваться с помощью строковой константы. Например: 
     const
        Message: PChar = 'Program terminated';
        Prompt: PChar = 'Enter values: ';
        Digits: array[0..9] of PChar = (
          'Zero', 'One', 'Two', 'Three', 'Four',
          'Five', 'Six', 'Seven', 'Eight', 'Nine');

     В результате указатель теперь указывает на область памяти, содержащую завершающуюся нулем копию литеральной строки. В Главе 13 "Модуль String" об этом рассказывается подробнее. 
                   Константы процедурного типа

     Константы процедурного типа должны определять идентификатор процедуры или функции, совместимый по присваиванию с типом константы. Приведем следующий пример: 
     type
        ErrorProc = procedure(ErrorCode: Integer);

     procedure DefaultError(ErrorCode: Integer); far;
     begin
          WriteLn('Error ', ErrorCode, '.');
     end;
     const
          ErrorHandler: ErrorProc = DefaultError;


Яндекс цитирования