Content-type:
TEXT/PLAIN; CHARSET=US-ASCII
Date:
Wed, 21 Feb 2001 09:54:50 +0000
MIME-version:
1.0
|
>> Does anyone know how to call an Ada 95 function by address
>> (if possible)? I
>> know you can
>> in C/C++.
> type Trig_Spec is access function(Theta : Radians) return Float;
> pragma Convention(StdCall, Trig_Spec); -- StdCall or whatever
> A_Function : Trig_Spec;
> ...
> A_Function := -- get a pointer from C program, "access xyz",
> -- System.Address_To_Access_Conversions, or whatever
> Y := A_Function(X);
You appear to have assumed that the original question related to calling
imported non-Ada functions by address.
If what you are trying to do is within Ada, you can simplify the code above by
missing out the pragma Convention, and using a different method to assign a
value to A_Function. A simple, but slightly more complete example would be:
package Callback_List is
type Callback is access procedure; -- Access to procedure with no paramters
type Callback_Index is range 1 .. 10;
type Callback_List_Type is array (Callback_Index) of Callback;
procedure Add_Callback (Index : in Callback_Index,
The_Callback : in Callback);
procedure Execute_Callbacks;
end Callback_List;
package body Callback_List is
The_Callback_List : Callback_List_Type := (others => null);
procedure Add_Callback (Index : in Callback_Index,
The_Callback : in Callback) is
begin
The_callback_List (Index) := The_Callback;
end Add_Callback;
procedure Execute_Callbacks is
begin
for Index in Callback_Index loop
if The_Callback_List (Index) /= null then
The_Callback_List (Index).all; -- Calls the operations listed
end if;
end loop;
end Execute_Callbacks;
end Callback_List;
package Use_Callback_List is
procedure Update; -- This will be used as a callback
end Use_Callback_List;
with Callback_List;
with Ada.Text_IO;
package body Use_Callback_List is
procedure Update is
begin
Ada.Text_IO.Put_Line ("Update Called");
end Update;
begin
Callback_List.Add_Callback (Index => 1,
The_Callback => Update'Access);
Callback_List.Execute_Callbacks;
end Use_Callback_List;
Hope this helps.
John
********************************************************************
This email and any attachments are confidential to the intended
recipient and may also be privileged. If you are not the intended
recipient please delete it from your system and notify the sender
immediately by telephoning +44(1252) 373232. You should not copy it
or use it for any purpose nor disclose or distribute its contents to
any other person.
********************************************************************
|
|
|