En un tipo
registro discriminado, a algunos de los componentes se los conoce como discriminantes y el resto pueden depender de ellos. Los discriminantes tienen que ser de tipo discreto o puntero. Por ejemplo:
type∞ TMatriz
is∞ array∞ (Integer range <>, Integer
range∞ <>)
of∞ Float;
type∞ TMatrizCuadrada (Orden: Positive)
is∞
record∞
Matriz: TMatriz(1..Orden,1..Orden);
end∞ record∞;
De esta forma, se asegura que la matriz utilizada sea cuadrada. El primer componente (Orden) es el discriminante del
subtipo∞ discreto Positive, mientras que el segundo componente (Matriz) es una matriz siempre cuadrada y cuyos límites dependen del valor de Orden. Ahora se utilizaría de la siguiente manera:
M: TMatrizCuadrada(3);
-- También se puede emplear M: TMatrizCuadrada(Orden => 3);
M := (3, (1..3 => (1..3 => 0.0)));
M := (M.Orden, (M.Matriz'Range(1) => (M.Matriz'Range(2) => 5.0)));
-- En la sentencia anterior M.orden ya está definido e igual a 3.
Una vez que se declara la variable ya no se puede cambiar su restricción. Sin embargo, si se declara lo siguiente:
Max:
constant∞ := 100;
subtype∞ TÍndice
is∞ Integer
range∞ 0..Max;
type∞ TVectorEnteros
is∞ array∞ (Integer
range∞ <>)
of∞ Integer;
type∞ TPolinomio (N: TÍndice := 0)
is∞ -- Discriminante con valor inical.
record∞
Pol: TVectorEnteros(0..N);
end∞ record∞;
Ahora, se pueden declarar variables que no tengan restricciones:
P, Q: TPolinomio;
El valor inicial de sus discriminantes sería cero (el valor por defecto de N). Así, se podría cambiar el discriminante posteriormente de esta manera:
P: TPolinomio := (3, (5, 0, 4, 2));
R: TPolinomio(5);
-- Aquí sólo se podrían usar polinomios de grado 5.
Manual de referencia Ada