Programación en Ada/Tipos/Registros discriminados

← Tipos/Registros Registros discriminados Tipos/Registros variantes →


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.

Manual de referencia Ada

editar