Я пытаюсь объяснить особый случай, когда несколько длин массива должны быть короче, чем обычно, но где нет прямой связи между дискриминантом и длиной массива. Упрощенная запись может выглядеть так в обычном случае:
type Int_Array is array(Integer range <>);
type My_Record is
record
A : Integer;
B : Integer;
C : Int_Array(1..10);
D : Int_Array(1..6);
end record;
Но если какой-то дискриминант равен 320, он должен выглядеть так:
type My_Record is
record
A : Integer;
B : Integer;
C : Int_Array(1..4);
D : Int_Array(1..2);
end record;
Я вроде как с этим немного поиграл, но ничего не могу скомпилировать. Вот несколько вещей, которые я пробовал:
type My_Record(Disc : Positive) is
record
A : Integer;
B : Integer;
C : Int_Array(1..(if Disc = 320 then 4 else 10));
D : Int_Array(1..(if Disc = 320 then 2 else 4));
end record;
Но это приводит к ошибке "дискриминант в ограничении должен появляться один".
Если я попытаюсь:
type My_Record(Disc : Positive) is
record
A : Integer;
B : Integer;
case Disc is
when 320 =>
C : Int_Array(1..4);
D : Int_Array(1..2);
when others =>
C : Int_Array(1..10);
D : Int_Array(1..4);
end case;
end record;
Определения C и D противоречат друг другу. Есть ли какая-то другая техника, которую я могу использовать для этого?