Ада-95. Компилятор GNAT
66ac8edd

Поля типа массив


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

type Illegal is record

Simple_Field_1: Boolean; Simple_Field_2: Integer; Array_Field : array (1..10) of Float; -- использование -- анонимного массива -- ЗАПРЕЩЕНО!!! end record;

type Some_Array is array (1..10) of Float; -- предварительно описанный -- тип массива type Legal is record

Simple_Field_1: Boolean; Simple_Field_2: Integer; Array_Field : Some_Array; -- компонент предварительно -- описанного типа массив end record;

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

type Some_Array is array (Integer range <>) of Float; -- неограниченный -- массив type Some_Record is record

Field_1: Boolean; Field_2: Integer; Field_3: Some_Array (1..10); -- описание компонента записи -- задает ограничение индекса end record;

Здесь, тип Some_Array - это неограниченный массив. Поэтому, при описании поля Field_3 записи Some_Record



указывается ограничение значений индекса для массива - (1..10). После этого, компонент Field_3 становится ограниченным массивом.

Для доступа к индивидуальному компоненту поля Field_3

какой-либо переменной типа Some_Record можно использовать:

. . . Some_Var : Some_Record; . . . Some_Var.Field_3(1) := 1;

Для инициализации всех значений какой-либо переменной типа Some_Record

можно использовать агрегаты. В качестве демонстрации, приведем несколько примеров.

Some_Var_1 : Some_Record := (False, 0, (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)); Some_Var_2 : Some_Record := ( Field_1 => False, Field_2 => 0, Field_3 => (1, 2, 3, 4, 5, 6, 7, 8, 9, 10) );

Some_Var_3 : Some_Record := ( Field_1 => True, Field_2 => 10, Field_3 => (others => 0) );

Из приведенных примеров видно, что для инициализации простых полей Field_1 и Field_2

записей Some_Var_1, Some_Var_2, Some_Var_3

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



Содержание раздела