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_Matriz is array (Integer range <>, Integer range <>) 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_Índice is Integer range 0..Max; type T_Vector_Enteros is array (Integer range <>) 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.