Programación en Ada/Tipos/Registros discriminados
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
T_Matrizis
array
(Integerrange
<>, Integerrange
<>)of
Float;type
T_Matriz_Cuadrada (Orden: Positive)is
record
Matriz: T_Matriz(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: T_Matriz_Cuadrada(3);-- También se puede emplear M: T_Matriz_Cuadrada(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_Índiceis
Integerrange
0..Max;type
T_Vector_Enterosis
array
(Integerrange
<>)of
Integer;type
T_Polinomio (N: T_Índice := 0)is
-- Discriminante con valor inicial.
record
Pol: T_Vector_Enteros(0..N);end
record
;
Ahora, se pueden declarar variables que no tengan restricciones:
P, Q: T_Polinomio;
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: T_Polinomio := (3, (5, 0, 4, 2));
R: T_Polinomio(5); -- Aquí sólo se podrían usar polinomios de grado 5.