Язык:
Русский
English
record (зарезервированное слово)
Запись содержит несколько компонентов (полей), которые могут иметь различные типы.
Синтаксис
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