Если вы хотите иметь возможность создавать объекты различимого типа и изменять (или выяснять), что это за тип во время выполнения, , вы должны задать дискриминанту значение по умолчанию в объявлении.
Причина этого заключается в том, что Ада не хочет беспокоиться о том, чтобы иметь дело с неинициализированными различимыми объектами, которые она даже не может выяснить, размер и допустимые поля записи.
По этой причине, а также по некоторым причинам, о которых я немного расскажу в комментариях, записи, отличающиеся от Ada, на самом деле не очень полезны в программировании на разных языках (например: точно дублирование объединения C). Они могут быть удобны на своих условиях.
Для приведенного вами примера вы должны сделать следующее (предупреждение: не скомпилировано):
type myStruct (theType : vehicleType := car) is
record
...
when car => numOfWheels : Positive;
when others => null;
end record;
Тогда вы можете установить одно из значений массива во время выполнения следующим образом:
myArray(20) := (theType => car,
field1 => myArray(20).field1,
... , --// Fill in the rest of the fields by name
numberOfWheels => 4);
Что касается этой части:
myArray: массив (Положительный диапазон <>) myStruct;
Вы не можете объявить фактические объекты массива с неопределенным диапазоном, как это. Вы можете объявить тип таким образом, но объект должен иметь фактический размер. Если вам нужен массив переменной длины, вы можете еще раз использовать вариант записи. (Опять не скомпилировано)
subtype Vehicle_Array_Index is Integer range 1..100; --// Maximum size is 100
type Vehicle_Array (Vehicle_Array_Index : Size := 1) is record
Vehicles : array (Vehicle_Array_Index range <>) of myStruct;
end record;
О, и еще одна вещь. Вы не делаете этого в своем примере, но если вы когда-нибудь захотите использовать свой дискриминант для размера массива, как указано выше, будьте осторожны. Когда вы объявляете объекты этого типа (опять же, при условии, что вы использовали значение по умолчанию для дискриминанта), компилятор попытается зарезервировать достаточно места для максимально возможного размера, для которого вы могли бы указать значение. Это делает Очень плохой идеей , чтобы создать дискриминируемый массив, индексированный чем-то с огромным диапазоном, например Integer
или Positive
Я знаю, что в наши дни компьютеры больше, но все же у большинства людей нет 4 гигабайтов на один маленький глупый массив. Поэтому, если вы используете свой дискриминант в качестве индекса массива, было бы неплохо создать меньший подтип Integer для использования в качестве типа дискриминанта.