Это связано со строгой типизацией Ады. Ада позволяет вам объявлять новые целочисленные типы и типы с плавающей запятой, которые несовместимы друг с другом. Первоначальная цель состояла в том, чтобы предотвратить случайное использование значений с одним значением, как если бы они имели совершенно другое значение, например.
type Length is digits 15; -- in meters
type Mass is digits 15; -- in kilograms
L : Length;
M : Mass;
M := L; -- error, caught at compile time
Компилятор улавливает это утверждение, которое не имеет никакого смысла, поскольку переменная «масса» не может содержать длину. Если бы все было просто Float
или Long_Float
, компилятор не смог бы это уловить.
Что вы сделали, так это создали еще один целочисленный тип, int
. Как и в приведенном выше примере, значения вашего нового типа не могут быть автоматически преобразованы в Integer
, который является типом индекса String
. (String
на самом деле определяется как array (Positive range <>) of Character with Pack;
, но Positive
является подтипом Integer
, и значения могут автоматически преобразовываться между Positive
и Integer
, поскольку они действительно являются подтипами одного и того же базового типа.)
К сожалению, это тоже запрещено:
type my(var : int) is record
name : string (1 .. Integer(var)); -- this var here is bad why?
end record;
из-за правила Ады, согласно которому дискриминант должен появляться в этом контексте один. Таким образом, ваш единственный вариант - сделать int
подтипом:
subtype int is Integer range 0 .. 10;
type my(var : int) is record
name : string (1 .. var); -- this var here is bad why?
end record;
03.12.2014