record (зарезервированное слово)

Язык:
Русский
English


Запись содержит несколько компонентов (полей), которые могут иметь различные типы.

Синтаксис

 record
   Поля;
   Поля;
   ...
   Поля;
 end;

  или

 record
   Поля;
   ...
 case дискриминант : тип of
   Вариант : (поля);
   ...
   Вариант : (поля);
 end;

Замечания

Каждый список полей - список идентификаторов, разделённых запятыми и сопровождаемых двоеточием и указанием типа.

Пример

 { Определения записей }
 type
   Class = (Num, Dat, Str);
   Date = record
     D, M, Y : Integer;
   end;
  
   Facts = record
     Name : String;
   case Kind : Class of
     Num : (N : Real);
     Dat : (D : Date);
     Str : (S : String);
   end;

Ада

 -- Определения записей
 type Class is (Num, Dat, Str);
 type Date is record
    D, M, Y : Integer;
 end record;

 type Facts (Kind : Class := Num) is record
    Name : Unbounded_String;
    case Kind is
    when Num => N : Float := 0.0;
    when Dat => D : Date;
    when Str => S : Unbounded_String;
    end case;
 end record;

Записи в языке Ада аналогичны записям Borland Pascal. Кроме того, для полей записи можно указывать значение по умолчанию. Дискриминанты не являются обычными полями и указываются как показано на примере, в скобках после имени типа. Основное свойство дискриминантов - их можно менять, только присваивая значение всей записи.

case могут быть вложенными. Переключателем case может быть только дискриминант. Помимо case, дискриминант может быть использован как дискриминант поля и граница массива:

 type Matrix is array (Integer range <>, Integer range <>) of Float;
 type Matrix_Rec (Rows, Columns : Integer) is record
    Mat : Matrix (1 .. Rows, 1 .. Columns);
 end record;

 type Square (Side : Integer) is new
   Matrix_Rec (Rows => Side, Columns => Side);

 type Double_Square (Number : Integer) is record
    Left : Square (Number);
    Right : Square (Number);
 end record;

В языке Ада особенную важность имеет факт, заданы ли дискриминантам значения по умолчанию или нет. Значения по умолчанию могут быть либо заданы всем дискриминантам, либо ни одному. В зависимости от этого факта, тип записи может получиться недоопределённым. А именно, недоопределённым тип получается, если НЕ задать значения по умолчанию. Недоопределённая запись не имеет аналога в Borland Pascal.

Дискриминанты недоопределённой записи не могут быть изменены после инициализации. Для хранения значений недоопределённой записи может требоваться различное количество памяти, и это одна из причин неизменности дискриминант. Если изменить дискриминант, для нового значения может потребоваться больше памяти, чем уже было отведено. Если значение не было расположено в динамической памяти, увеличить размер отведённой для его хранения памяти в общем случае нельзя. Значит, и дискриминант изменить тоже нельзя. С другой стороны, значения недоопределённой записи занимают столько места, сколько требуют хранимые в них данные.

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

Например, аналог строк Borland Pascal можно выразить на языке Ада так:

 subtype Nat255 is Natural range 0 .. 255;
 type Str255 (Length : Nat255 := 0) is record
    S : String (1 .. Length);
 end record;

Работа с такой строкой будет выглядеть так:

    Pas_Str : Str255 := (5, "abcde");
 begin
    Pas_Str := (3, "xyz"); -- чтобы изменить дискриминант,
                   -- нужно присвоить значение сразу всей записи
    Pas_Str := (Length => 70, S => (50 => '+', others => '-'));
    Pas_Str.S (10 .. 20) := (others => '*');
    Put_Line (Pas_Str.S);
 end

Вывод программы

 ---------***********-----------------------------+--------------------

В языке Ада для записей предопределён не только оператор присваивания, но и сравнения. В Borland Pascal записи сравнивать нельзя.

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

Чтобы указать, что запись ограниченная, вместо record пишется limited record

Смотри также

Тэги: record
| G+
Код для вставки: :: :: :: ::
Поделиться: // //