Programación en Ada / Tipos / Registros discriminados

De Wikilibros, la colección de libros de texto de contenido libre.

← 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 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.

[editar] Manual de referencia Ada

Herramientas personales