53 lines
1.4 KiB
Ada
53 lines
1.4 KiB
Ada
with Ada.Text_Io; use Ada.Text_Io;
|
|
|
|
procedure Subprogram_As_Argument_2 is
|
|
|
|
-- Definition of an access to long_float
|
|
|
|
type Lf_Access is access Long_Float;
|
|
|
|
-- Definition of a function returning Lf_Access taking an
|
|
-- integer as a parameter
|
|
|
|
function Func_To_Be_Passed(Item : Integer) return Lf_Access is
|
|
Result : Lf_Access := new Long_Float;
|
|
begin
|
|
Result.All := 3.14159 * Long_Float(Item);
|
|
return Result;
|
|
end Func_To_Be_Passed;
|
|
|
|
-- Definition of an access to function type matching the function
|
|
-- signature above
|
|
|
|
type Func_Access is access function(Item : Integer) return Lf_Access;
|
|
|
|
-- Definition of an integer access type
|
|
|
|
type Int_Access is access Integer;
|
|
|
|
-- Define a function taking an instance of Func_Access as its
|
|
-- parameter and returning an integer access type
|
|
|
|
function Complex_Func(Item : Func_Access; Parm2 : Integer) return Int_Access is
|
|
Result : Int_Access := new Integer;
|
|
begin
|
|
Result.All := Integer(Item(Parm2).all / 3.14149);
|
|
return Result;
|
|
end Complex_Func;
|
|
|
|
-- Declare an access variable to hold the access to the function
|
|
|
|
F_Ptr : Func_Access := Func_To_Be_Passed'access;
|
|
|
|
-- Declare an access to integer variable to hold the result
|
|
|
|
Int_Ptr : Int_Access;
|
|
|
|
begin
|
|
|
|
-- Call the function using the access variable
|
|
|
|
Int_Ptr := Complex_Func(F_Ptr, 3);
|
|
Put_Line(Integer'Image(Int_Ptr.All));
|
|
end Subprogram_As_Argument_2;
|