3 -- Grant of Unlimited Rights
5 -- Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687,
6 -- F08630-91-C-0015, and DCA100-97-D-0025, the U.S. Government obtained
7 -- unlimited rights in the software and documentation contained herein.
8 -- Unlimited rights are defined in DFAR 252.227-7013(a)(19). By making
9 -- this public release, the Government intends to confer upon all
10 -- recipients unlimited rights equal to those held by the Government.
11 -- These rights include rights to use, duplicate, release or disclose the
12 -- released technical data and computer software in whole or in part, in
13 -- any manner and for any purpose whatsoever, and to have or permit others
18 -- ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR
19 -- DISCLOSED ARE AS IS. THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED
20 -- WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE
21 -- SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE
22 -- OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A
23 -- PARTICULAR PURPOSE OF SAID MATERIAL.
27 -- Check that access to subprogram may be stored within data
28 -- structures, and that the access to subprogram can subsequently
32 -- Declare an access to function type in a package specification.
33 -- Declare an array of the access type. Declare three different
34 -- functions that can be referred to by the access to function type.
36 -- In the main program, declare a key function that builds the array
37 -- by calling each function indirectly through the access value.
41 -- 06 Dec 94 SAIC ACVC 2.0
48 TC_Sine_Call
: Integer := 0;
49 TC_Cos_Call
: Integer := 0;
50 TC_Tan_Call
: Integer := 0;
52 Sine_Value
: Float := 4.0;
53 Cos_Value
: Float := 8.0;
54 Tan_Value
: Float := 10.0;
56 -- Type accesses to any function
57 type Trig_Function_Ptr
is access function
58 (Angle
: in Float) return Float;
60 function Sine
(Angle
: in Float) return Float;
62 function Cos
(Angle
: in Float) return Float;
64 function Tan
(Angle
: in Float) return Float;
69 -----------------------------------------------------------------------------
72 package body C3A0006_0
is
74 function Sine
(Angle
: in Float) return Float is
76 TC_Sine_Call
:= TC_Sine_Call
+ 1;
77 Sine_Value
:= Sine_Value
+ Angle
;
82 function Cos
(Angle
: in Float) return Float is
84 TC_Cos_Call
:= TC_Cos_Call
+ 1;
85 Cos_Value
:= Cos_Value
- Angle
;
90 function Tan
(Angle
: in Float) return Float is
92 TC_Tan_Call
:= TC_Tan_Call
+ 1;
93 Tan_Value
:= (Tan_Value
+ (Tan_Value
* Angle
));
100 -----------------------------------------------------------------------------
109 Trig_Value
, Theta
: Float := 0.0;
111 Total_Routines
: constant := 3;
113 Sine_Total
: constant := 7.0;
114 Cos_Total
: constant := 5.0;
115 Tan_Total
: constant := 75.0;
117 Trig_Table
: array (1 .. Total_Routines
) of C3A0006_0
.Trig_Function_Ptr
;
120 -- Key function to build the table
121 function Call_Trig_Func
(Func
: C3A0006_0
.Trig_Function_Ptr
;
122 Operand
: Float) return Float is
124 return (Func
(Operand
));
130 Report
.Test
("C3A0006", "Check that access to subprogram may be " &
131 "stored within data structures, and that the access " &
132 "to subprogram can subsequently be called");
134 Trig_Table
:= (C3A0006_0
.Sine
'Access, C3A0006_0
.Cos
'Access,
135 C3A0006_0
.Tan
'Access);
137 -- increase the value of Theta to build the table
138 for I
in 1 .. Total_Routines
loop
139 Theta
:= Theta
+ 0.5;
140 for J
in 1 .. Total_Routines
loop
141 Trig_Value
:= Call_Trig_Func
(Trig_Table
(J
), Theta
);
145 if C3A0006_0
.TC_Sine_Call
/= Total_Routines
146 or C3A0006_0
.TC_Cos_Call
/= Total_Routines
147 or C3A0006_0
.TC_Tan_Call
/= Total_Routines
then
148 Report
.Failed
("Incorrect subprograms result");
151 if C3A0006_0
.Sine_Value
/= Sine_Total
152 or C3A0006_0
.Cos_Value
/= Cos_Total
153 or C3A0006_0
.Tan_Value
/= Tan_Total
then
154 Report
.Failed
("Incorrect values returned from subprograms");
157 if Trig_Value
/= Tan_Total
then
158 Report
.Failed
("Incorrect call order.");