Ада-95. Компилятор GNAT



         

Ссылочные типы для подпрограмм - часть 2


Описание переменной массива чисел, передаваемой как параметр To для процедуры For_Each, и описание функции, ссылка на которую могла бы быть использовна как параметр F процедуры For_Each, могут иметь следующий вид:

Data_Vector : Vector (1..3) := (1.0, 2.0, 3.0);

function Square(Val: in Float) return Float is

begin

return Val * Val; end Square;

Таким образом, вызов процедуры For_Each (с учетом приведенных ранее описаний) будет иметь вид:

For_Each( F => Square'Access, To => Data_Vector );

Примечательно, что для получения ссылочного значения которое указывает на функцию Square используется атрибут 'Access.

Ссылочные типы для подпрограмм могут быть использованы для построения таблиц вызова подпрограмм. Рассмотрим следующий схематический пример:

type Action_Operation is access procedure;

procedure Add; procedure List; procedure Delete;

Action : constant array (1..3) of Action_Operation := ( Add'Access, List'Access, Delete'Access

);

type Math_Function is access function (I : in Float) return Float;

function Sin (F : in Float) return Float; function Cos (F : in Float) return Float; function Tan (F : in Float) return Float;

Math_Operation : constant array (1..3) of Math_Function := ( Sin'Access, Cos'Access, Tan'Access

);

Здесь формируются две таблицы вызовов подпрограмм: первая таблица вызовов представлена массивом Action, который содержит значения ссылочного типа Action_Operation, а вторая таблица вызовов представлена массивом Math_Operation, который содержит значения ссылочного типа Math_Function

(заметим, что таблицами вызовов, как правило, являются массивы).

Примером вызова I-той подпрограммы в таблице (где I - это индекс в таблице) может служить следующее:

F: Float; . . .

Action(I).all; -- вызов I-той процедуры из таблицы -- Action F := Math_Operation(I)(F); -- вызов I-той функции из таблицы -- Math_Operation с параметром F

Напомним, что для ссылочных значений, которые указывают на подпрограммы без параметров, при вызове подпрограммы требуется использование .all.




Содержание  Назад  Вперед