* Linking FORTRAN77 to Ada83
@ 1999-06-09 0:00 Guy Calinsky
1999-06-09 0:00 ` David C. Hoos, Sr.
1999-06-10 0:00 ` bob
0 siblings, 2 replies; 4+ messages in thread
From: Guy Calinsky @ 1999-06-09 0:00 UTC (permalink / raw)
I have a subroutine written in FORTRAN that I need to link with my Ada
83 code, but I am getting an Undefined Symbol error on that subroutine.
I followed the pragma example in the LRM (13.9).
Here is a small app I created to test the concept:
----------------------
with Text_io; use Text_io;
with Long_Float_io; use Long_Float_io;
procedure Ada_Main is
procedure root(A : Long_Float; B : Long_Float; C : Long_Float; Result
: out Long_Float);
pragma Interface(Fortran, root);
result : Long_Float;
begin
root(1.0, 2.0, 1.0, result);
put("result = "); put(result); new_line;
end Ada_Main;
----------------------
My FORTRAN subroutine :
subroutine root(a, b, c, x)
implicit none
real a, b, c, x
x = SQRT(b**2 - 4.0 * a * c) / (2.0 * a)
return
end
----------------------
My Make script :
f77 -Xlist -g -C root.for
ada ada_main.a
a.ld -o ada_fortran_test ada_main root.o
----------------------
Everything compiles ok and root.o does exist, yet I get this result :
Undefined first referenced
symbol in file
root
/home/calinsky/Fortran_Ada_Test/.objects/ada_main01
ld: fatal: Symbol referencing errors. No output written to
ada_fortran_test
Any thoughts or ideas?
Thanks,
Guy
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: Linking FORTRAN77 to Ada83
1999-06-09 0:00 Linking FORTRAN77 to Ada83 Guy Calinsky
@ 1999-06-09 0:00 ` David C. Hoos, Sr.
1999-06-10 0:00 ` Robert Dewar
1999-06-10 0:00 ` bob
1 sibling, 1 reply; 4+ messages in thread
From: David C. Hoos, Sr. @ 1999-06-09 0:00 UTC (permalink / raw)
Guy Calinsky <calinsky@sll.northrop.com> wrote in message
news:375ECA88.CF7CFF7E@sll.northrop.com...
> I have a subroutine written in FORTRAN that I need to link with my Ada
> 83 code, but I am getting an Undefined Symbol error on that subroutine.
> I followed the pragma example in the LRM (13.9).
You didn't say what compiler and platform your'e using, so some guessing
will need to be done. I would guess two things, viz.:
1. You probably need pragma Interface_Name (root, "root"); to associate
the case insensitive Ada name you declared in the pragma Interface
with the symbol produced by your Fortran compiler, for which the
linker
will seek to resolve. This pragma would follow the pragma Interface.
Check your compiler's documentation, Appendix F.
2. You need to see whether the symbol produced by your Fortran compiler
is indeed "root" -- it might be "_root", or some other.
An object dump program can help you do this. The name in the second
parameter of the pragma Interface_Name needs to match the symbol name
in order for the linker to find the correct procedure to call.
> Here is a small app I created to test the concept:
> ----------------------
>
> with Text_io; use Text_io;
> with Long_Float_io; use Long_Float_io;
>
> procedure Ada_Main is
>
> procedure root(A : Long_Float; B : Long_Float; C : Long_Float; Result
> : out Long_Float);
> pragma Interface(Fortran, root);
>
> result : Long_Float;
>
> begin
>
> root(1.0, 2.0, 1.0, result);
> put("result = "); put(result); new_line;
>
> end Ada_Main;
> ----------------------
>
> My FORTRAN subroutine :
> subroutine root(a, b, c, x)
> implicit none
> real a, b, c, x
> x = SQRT(b**2 - 4.0 * a * c) / (2.0 * a)
> return
> end
> ----------------------
>
> My Make script :
> f77 -Xlist -g -C root.for
> ada ada_main.a
> a.ld -o ada_fortran_test ada_main root.o
> ----------------------
>
> Everything compiles ok and root.o does exist, yet I get this result :
> Undefined first referenced
> symbol in file
> root
> /home/calinsky/Fortran_Ada_Test/.objects/ada_main01
> ld: fatal: Symbol referencing errors. No output written to
> ada_fortran_test
>
>
> Any thoughts or ideas?
> Thanks,
> Guy
>
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: Linking FORTRAN77 to Ada83
1999-06-09 0:00 ` David C. Hoos, Sr.
@ 1999-06-10 0:00 ` Robert Dewar
0 siblings, 0 replies; 4+ messages in thread
From: Robert Dewar @ 1999-06-10 0:00 UTC (permalink / raw)
In article <IWzafrus#GA.184@newstoo.hiwaay.net>,
"David C. Hoos, Sr." <david.c.hoos.sr@ada95.com> wrote:
> 1. You probably need pragma Interface_Name (root, "root");
> to associate
> the case insensitive Ada name you declared in the pragma
> Interface
> with the symbol produced by your Fortran compiler, for
> which the linker
> will seek to resolve. This pragma would follow the
> pragma Interface.
> Check your compiler's documentation, Appendix F.
There is no such pragma in either Ada 83 or Ada 95, so this is
curious advice. Yes, some particular implementation might
provide this as an implementation dependent pragma, but given
that this was a general question, it seems odd to suggest
using something so non-standard.
Sent via Deja.com http://www.deja.com/
Share what you know. Learn what you don't.
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: Linking FORTRAN77 to Ada83
1999-06-09 0:00 Linking FORTRAN77 to Ada83 Guy Calinsky
1999-06-09 0:00 ` David C. Hoos, Sr.
@ 1999-06-10 0:00 ` bob
1 sibling, 0 replies; 4+ messages in thread
From: bob @ 1999-06-10 0:00 UTC (permalink / raw)
Here is an Ada spec for currently running code. Compiles and runs on GNAT
for IRIX(SGI) and Linux (Intel)
___________________________
-- %@(#)fortran_interface_s.a 1.3% %02 Mar 1998% - SCCS Control Line
-- 1.2 09-Feb-98 dab Added Stereo to Mono feedback
with Global_Defs;
with Interfaces.Fortran;
with Los_Vectors;
with OSM_Defs;
with Vectors;
with Unchecked_Deallocation;
package Fortran_Interface is
package Fortran renames Interfaces.Fortran;
package GD renames Global_Defs;
package vec renames vectors;
package LV renames Los_Vectors;
package OD renames OSM_Defs;
type Fortran_Truth_Type is
record
Time : GD.Epoch_Time_Type := 0.0;
State : LV.State_ECI_Type;
Unit_LOS : VEC.Vector(1..3) := (others => 0.0);
Intensity : GD.Real := 0.0;
Tgtid : GD.Int := 0;
Class_Id : GD.Int := 1;
Phase_Id : GD.Int := 1;
end record;
for Fortran_Truth_Type use
record
Time at 0 range 0..63;
State at 0 range 64..639;
Unit_LOS at 0 range 640..831;
Intensity at 0 range 832..895;
Tgtid at 0 range 896..927;
Class_Id at 0 range 928..959;
Phase_Id at 0 range 960..991;
end record;
type Fortran_Scan_Execution_type is
record
TFirst_Scan : GD.Epoch_Time_type := 0.0;
TLast_Scan : GD.Epoch_Time_type := 0.0;
Scan_Pointer : vec.vector(1..3) := (others => 0.0);
Platform_State : LV.State_Eci_Type := (others => (others =>
0.0));
Azfirst : GD.Real := 0.0;
Azlast : GD.Real := 0.0;
Sweep_Rate : GD.Real := 0.0;
Sensor_ID : GD.Int := 0;
Scan_ID : GD.Int := 0;
Platform_Id : GD.Int := 0;
Execute : GD.Boolean_Type := False;
end record;
for Fortran_Scan_Execution_type use
record
TFirst_Scan at 0 range 0..63;
TLast_Scan at 0 range 64..127;
Scan_Pointer at 0 range 128..319;
Platform_State at 0 range 320..895;
Azfirst at 0 range 896..959;
Azlast at 0 range 960..1023;
Sweep_Rate at 0 range 1024..1087;
Sensor_ID at 0 range 1088..1119;
Scan_ID at 0 range 1120..1151;
Platform_Id at 0 range 1152..1183;
Execute at 0 range 1208..1215;
end record;
type Fortran_Scan_Execution_Access_type is access
Fortran_Scan_Execution_type;
type Fortran_Sensor_Header_type is
record
NLOS : GD.Int := 0;
Scan_Execution : Fortran_Scan_Execution_type;
end record;
for Fortran_Sensor_Header_type use
record
NLOS at 0 range 0..31;
Scan_Execution at 0 range 64..1279;
end record;
type Fortran_Sensor_Header_Access_type is access
Fortran_Sensor_Header_type;
type Fortran_LOS_Vector_type;
type Fortran_LOS_Vector_Access_type is access Fortran_LOS_Vector_type;
type Fortran_LOS_Vector_type is
record
Epoch : GD.Epoch_Time_type := 0.0;
platstate : LV.State_Eci_Type;
Boresight : VEC.Vector(1..3) := (others => 0.0);
Unit_LOS : VEC.Vector(1..3) := (others => 0.0);
Unit_LOS_Rate : vec.vector(1..3) := (others => 0.0); -- Udot
vec
Unit_LOS_Accel : vec.vector(1..3) := (others => 0.0); --
Udotdot
Intensity : GD.Real := 0.0;
Second_Moments_ECI : VEC.Vector(1..3) := (others => 0.0);
AMA_ECI : VEC.Vector(1..3) := (others => 0.0);
RMA : GD.Real := 0.0;
Position_UV : vec.vector(1..2) := (others => 0.0);
Velocity_UV : vec.vector(1..2) := (others => 0.0);
Acceleration_UV : vec.vector(1..2) := (others => 0.0); --
06/12/95
Second_Moments_UV : VEC.Vector(1..3) := (others => 0.0);
AMA_UV : VEC.Vector(1..3) := (others => 0.0); -- uv
coordinates
truth : Fortran_Truth_Type;
Platform_ID : GD.Platform_ID_type :=
GD.Platform_ID_Type'First;
Detection_ID : GD.Int := 0;
Sensor_ID : GD.Int := 0;
Sensor_Band : GD.Int := 0;
Scan_ID : GD.Int := 0;
LOS_ID : GD.Int := 0;
Score_Type_Obj : GD.Int := 0;
osm_type : GD.Int := 0;
Num_Asso_Mono : GD.Int := 0; -- # of mono tracks using
this
Associated : Boolean := False;
end record;
for Fortran_LOS_Vector_type use
record
Epoch at 0 range 0..63;
platstate at 0 range 64..639;
Boresight at 0 range 640..831;
Unit_LOS at 0 range 832..1023;
Unit_LOS_Rate at 0 range 1024..1215;
Unit_LOS_Accel at 0 range 1216..1407;
Intensity at 0 range 1408..1471;
Second_Moments_ECI at 0 range 1472..1663;
AMA_ECI at 0 range 1664..1855;
RMA at 0 range 1856..1919;
Position_UV at 0 range 1920..2047;
Velocity_UV at 0 range 2048..2175;
Acceleration_UV at 0 range 2176..2303;
Second_Moments_UV at 0 range 2304..2495;
AMA_UV at 0 range 2496..2687;
truth at 0 range 2688..3679;
-- Fortran seems to allign this next field on an 8 byte boundary
Platform_ID at 0 range 3712..3743;
Detection_ID at 0 range 3744..3775;
Sensor_ID at 0 range 3776..3807;
Sensor_Band at 0 range 3808..3839;
Scan_ID at 0 range 3840..3871;
LOS_ID at 0 range 3872..3903;
Score_Type_Obj at 0 range 3904..3935;
osm_type at 0 range 3936..3967;
Num_Asso_Mono at 0 range 3968..3999;
Associated at 0 range 4024..4031;
end record;
type Fortran_LOS_Array_type is array ( GD.Int range <> ) of
Fortran_LOS_Vector_Access_type;
type Fortran_LOS_Array_Access_type is access Fortran_LOS_Array_type;
type Fortran_MDP_OSM_Type;
type Fortran_MDP_OSM_Access_Type is access Fortran_MDP_OSM_Type;
type Fortran_MDP_OSM_Type is
record
Epoch : GD.Epoch_Time_Type := 0.0;
Platform_State : OD.State_ECI_Type := (others => (others =>
0.0));
Boresight : VEC.Vector(1..3) := (others => 0.0);
Unit_LOS : OD.Unit_LOS_Type := (others => 0.0);
Unit_LOS_Rate : OD.Unit_LOS_Type := (others => 0.0);
Unit_LOS_Accel : OD.Unit_LOS_Type := (others => 0.0);
Intensity : GD.Real := 0.0;
Second_Moments_ECI : VEC.Vector(1..3) := (others => 0.0);
AMA_ECI : VEC.Vector(1..3);
RMA : GD.Real;
Truth : Fortran_Truth_Type;
Platform_ID : GD.Platform_ID_Type := 1;
Mono_ID : GD.Mono_ID_Type := 0;
Parent_ID : GD.Mono_ID_Type := 0;
Stereo_ID : GD.Stereo_ID_Type := 0;
Sensor : GD.Int := 0;
Sensor_Band : GD.Int := 0;
Detection_ID : GD.Int := 0;
OSM_Type : GD.Int := 0;
Object : GD.Int := 0;
Phase : GD.Int := 0;
Track_Status : GD.Int := 0;
Mono_Status : GD.Int := 0;
Mono_Type : GD.Int := 0;
end record;
for Fortran_MDP_OSM_Type use
record
Epoch at 0 range 0..63;
Platform_State at 0 range 64..639;
Boresight at 0 range 640..831;
Unit_LOS at 0 range 832..1023;
Unit_LOS_Rate at 0 range 1024..1215;
Unit_LOS_Accel at 0 range 1216..1407;
Intensity at 0 range 1408..1471;
Second_Moments_ECI at 0 range 1472..1663;
AMA_ECI at 0 range 1664..1855;
RMA at 0 range 1856..1919;
Truth at 0 range 1920..2911;
-- Fortran seems to allign this next field on an 8 byte boundary
Platform_ID at 0 range 2944..2975;
Mono_ID at 0 range 2976..3007;
Parent_ID at 0 range 3008..3039;
Stereo_ID at 0 range 3040..3071;
Sensor at 0 range 3072..3103;
Sensor_Band at 0 range 3104..3135;
Detection_ID at 0 range 3136..3167;
OSM_Type at 0 range 3168..3199;
Object at 0 range 3200..3231;
Phase at 0 range 3232..3263;
Track_Status at 0 range 3264..3295;
Mono_Status at 0 range 3296..3327;
Mono_Type at 0 range 3328..3359;
end record;
type Mono_State_Type is --Doug
record --Doug
Epoch : GD.Real; --Doug
initialization_epoch : GD.Real; --Doug
u_state : VEC.Vector(1..3); --Doug
v_state : VEC.Vector(1..3); --Doug
Mono_ID : GD.Int; --Doug
Parent_ID : GD.Int; --Doug
num_misses : GD.Int; --Doug
end record; --Doug
for Mono_State_Type use
record --Doug
Epoch at 0 range 0..63; --Doug
initialization_epoch at 0 range 64..127; --Doug
u_state at 0 range 128..319; --Doug
v_state at 0 range 320..511; --Doug
Mono_ID at 0 range 512..543; --Doug
Parent_ID at 0 range 544..575; --Doug
num_misses at 0 range 576..607; --Doug
end record; --Doug
-- types needed for the stereo to mono feed back
subtype MAX_STEREO_PTR is GD.Int range 1..1000; --We are limited to
1000 stereo tracks for now
type STEREO_LIST_TYPE is array (MAX_STEREO_PTR) of GD.Int;
type Fortran_Stereo_IDs is
record
NUM_STEREO_TRACKS : GD.Int;
STEREO_ID : STEREO_LIST_TYPE;
end record;
for Fortran_Stereo_IDs use
record
NUM_STEREO_TRACKS at 0 range 0..31;
STEREO_ID at 0 range 32..32031;
end record;
type MONO_TAG_STRUCT is
record
PLATFORM_ID : GD.Int;
MONO_ID : GD.Int;
end record;
for MONO_TAG_STRUCT use
record
PLATFORM_ID at 0 range 0..31;
MONO_ID at 0 range 32..63;
end record;
subtype MAX_VIEWS is GD.Int range 1..40;
type MONO_LIST_TYPE is array (MAX_VIEWS) of MONO_TAG_STRUCT;
type STEREO_COMPONENTS_STRUCT is
record
STEREO_ID : GD.Int;
NUM_MONOS : GD.Int;
MONO_TAG : MONO_LIST_TYPE;
end record;
for STEREO_COMPONENTS_STRUCT use
record
STEREO_ID at 0 range 0..31;
NUM_MONOS at 0 range 32..63;
MONO_TAG at 0 range 64..2623;
end record;
type STEREO_STATE_COV_STRUCT is
record
POSITION : VEC.Vector(1..3);
VELOCITY : VEC.Vector(1..3);
ACCELERATION : VEC.Vector(1..3);
COV : VEC.Vector(1..45); --triangular form of
9 by 9
LAST_UPDATE_TIME : GD.Real;
Stereo_ChiSq : GD.Real;
IMM_Filter_Used : GD.Int;
STEREO_ID : GD.Int;
end record;
for STEREO_STATE_COV_STRUCT use
record
POSITION at 0 range 0..191;
VELOCITY at 0 range 192..383;
ACCELERATION at 0 range 384..575;
COV at 0 range 576..3455; --triangular
form of 9 by 9
LAST_UPDATE_TIME at 0 range 3456..3519;
Stereo_ChiSq at 0 range 3520..3583;
IMM_Filter_Used at 0 range 3584..3615;
STEREO_ID at 0 range 3616..3647;
end record;
type Max_Establish_Track is range 1 .. 1200;
type Mono_State_Array_type is --Doug
array (Max_Establish_Track) of Mono_State_Type; --Doug
-- Binding code for calling Fortran routines
procedure TREX_READ_INIT_PARS;
pragma INTERFACE (FORTRAN, TREX_READ_INIT_PARS);
pragma IMPORT_PROCEDURE (
INTERNAL => TREX_READ_INIT_PARS,
EXTERNAL => "trex_read_init_pars_"
);
procedure TRTT_SGEN(SR_DX :GD.Int);
pragma INTERFACE (FORTRAN, TRTT_SGEN);
pragma IMPORT_PROCEDURE (
INTERNAL => TRTT_SGEN,
EXTERNAL => "trtt_sgen_",
PARAMETER_TYPES =>
(GD.Int),
MECHANISM => (REFERENCE)
);
procedure TRCA_SETUP_CAND_TRKS;
pragma INTERFACE (FORTRAN, TRCA_SETUP_CAND_TRKS);
pragma IMPORT_PROCEDURE (
INTERNAL => TRCA_SETUP_CAND_TRKS,
EXTERNAL => "trca_setup_cand_trks_"
);
procedure TRET_SETUP_ESTAB_TRKS;
pragma INTERFACE (FORTRAN, TRET_SETUP_ESTAB_TRKS);
pragma IMPORT_PROCEDURE (
INTERNAL => TRET_SETUP_ESTAB_TRKS,
EXTERNAL => "tret_setup_estab_trks_"
);
procedure TRET_ESTAB_TRKR(SR_DX :GD.Int;
NUM_ACTIVE :in out GD.Int);
pragma INTERFACE (FORTRAN, TRET_ESTAB_TRKR);
pragma IMPORT_PROCEDURE (
INTERNAL => TRET_ESTAB_TRKR,
EXTERNAL => "tret_estab_trkr_",
PARAMETER_TYPES =>
(GD.Int,GD.Int),
MECHANISM => (REFERENCE,REFERENCE)
);
procedure TRCA_CAND_TRKR(SR_DX :GD.Int);
pragma INTERFACE (FORTRAN, TRCA_CAND_TRKR);
pragma IMPORT_PROCEDURE (
INTERNAL => TRCA_CAND_TRKR,
EXTERNAL => "trca_cand_trkr_",
PARAMETER_TYPES =>
(GD.Int),
MECHANISM => (REFERENCE)
);
procedure TRCA_CAND_INIT(SR_DX :GD.Int);
pragma INTERFACE (FORTRAN, TRCA_CAND_INIT);
pragma IMPORT_PROCEDURE (
INTERNAL => TRCA_CAND_INIT,
EXTERNAL => "trca_cand_init_",
PARAMETER_TYPES =>
(GD.Int),
MECHANISM => (REFERENCE)
);
procedure TRWD_WEED_CAND(SR_DX :GD.Int;
NUM_NEW_OSMS :in out GD.Int;
NUM_CURRENT :in out GD.Int );
pragma INTERFACE (FORTRAN, TRWD_WEED_CAND);
pragma IMPORT_PROCEDURE (
INTERNAL => TRWD_WEED_CAND,
EXTERNAL => "trwd_weed_cand_",
PARAMETER_TYPES =>
(GD.Int, GD.Int, GD.Int),
MECHANISM => (REFERENCE,REFERENCE,REFERENCE)
);
procedure CLEANUP(SR_DX :GD.Int);
pragma INTERFACE (FORTRAN, CLEANUP);
pragma IMPORT_PROCEDURE (
INTERNAL => CLEANUP,
EXTERNAL => "cleanup_",
PARAMETER_TYPES =>
(GD.Int),
MECHANISM => (REFERENCE)
);
procedure StoreScanHeader (SR_DX:in out GD.Int;
HEADER : LOS_Vectors.Sensor_Header_type);
procedure Fortran_StoreScanHeader (SR_DX:in out GD.Int;
HEADER : Fortran_Sensor_Header_type);
pragma INTERFACE (FORTRAN, Fortran_StoreScanHeader);
pragma IMPORT_PROCEDURE (
INTERNAL => Fortran_StoreScanHeader,
EXTERNAL => "store_scan_header_",
PARAMETER_TYPES =>
(GD.Int,Fortran_Sensor_Header_type),
MECHANISM => (REFERENCE,REFERENCE)
);
procedure StoreOneLOS (LOS : LOS_Vectors.LOS_Vector_type);
procedure Fortran_StoreOneLOS (LOS : Fortran_LOS_Vector_type);
pragma INTERFACE (FORTRAN, Fortran_StoreOneLOS);
pragma IMPORT_PROCEDURE (
INTERNAL => Fortran_StoreOneLOS,
EXTERNAL => "store_one_los_",
PARAMETER_TYPES =>
(Fortran_LOS_Vector_type),
MECHANISM => (REFERENCE)
);
procedure SortScanData(SR_DX : GD.Int);
pragma INTERFACE (FORTRAN, SortScanData);
pragma IMPORT_PROCEDURE (
INTERNAL => SortScanData,
EXTERNAL => "sort_scan_data_",
PARAMETER_TYPES =>
(GD.Int),
MECHANISM => (REFERENCE)
);
procedure LoadOSM(I :GD.Int; osm : out OD.MDP_OSM_Type);
procedure Fortran_LoadOSM(I :GD.Int; osm :out Fortran_MDP_OSM_Type);
pragma INTERFACE (FORTRAN, Fortran_LoadOSM);
pragma IMPORT_PROCEDURE (
INTERNAL => Fortran_LoadOSM,
EXTERNAL => "load_osm_",
PARAMETER_TYPES =>
(GD.Int, Fortran_MDP_OSM_Type),
MECHANISM => (REFERENCE,REFERENCE)
);
procedure LoadMonoStates(SR_DX : in GD.Int;
num_current : in GD.Int;
mono_states :out Mono_State_Array_type
);
pragma INTERFACE (FORTRAN, LoadMonoStates);
pragma IMPORT_PROCEDURE (
INTERNAL => LoadMonoStates,
EXTERNAL => "load_mono_states_",
PARAMETER_TYPES =>
( GD.Int, GD.Int, Mono_State_Array_type),
MECHANISM => (REFERENCE,REFERENCE,REFERENCE)
);
procedure RELEASE_TRACK_POINTS(SR_DX : GD.Int);
pragma INTERFACE (FORTRAN, RELEASE_TRACK_POINTS);
pragma IMPORT_PROCEDURE (
INTERNAL => RELEASE_TRACK_POINTS,
EXTERNAL => "release_track_points_",
PARAMETER_TYPES =>
(GD.Int),
MECHANISM => (REFERENCE)
);
procedure TERMINATE_TRACKS(SR_DX : GD.Int);
pragma INTERFACE (FORTRAN, TERMINATE_TRACKS);
pragma IMPORT_PROCEDURE (
INTERNAL => TERMINATE_TRACKS,
EXTERNAL => "terminate_tracks_",
PARAMETER_TYPES =>
(GD.Int),
MECHANISM => (REFERENCE)
);
-- Routines to implement the Stereo to Mono feedback
procedure SetActiveStereoTracks(SR_DX:GD.Int; STEREO_IDS : in
Fortran_Stereo_IDs);
pragma INTERFACE (FORTRAN, SetActiveStereoTracks);
pragma IMPORT_PROCEDURE (
INTERNAL => SetActiveStereoTracks,
EXTERNAL => "setactivestereotracks_",
PARAMETER_TYPES =>
(GD.Int,Fortran_Stereo_IDs),
MECHANISM => (REFERENCE,REFERENCE)
);
procedure UpdateStereoComponents(STEREO_COMPONENTS : in
STEREO_COMPONENTS_STRUCT);
pragma INTERFACE (FORTRAN, UpdateStereoComponents);
pragma IMPORT_PROCEDURE (
INTERNAL => UpdateStereoComponents,
EXTERNAL => "updatestereocomponents_",
PARAMETER_TYPES =>
(STEREO_COMPONENTS_STRUCT),
MECHANISM => (REFERENCE)
);
procedure SetStereoState(STEREO_STATE : in STEREO_STATE_COV_STRUCT);
pragma INTERFACE (FORTRAN, SetStereoState);
pragma IMPORT_PROCEDURE (
INTERNAL => SetStereoState,
EXTERNAL => "setstereostate_",
PARAMETER_TYPES =>
(STEREO_STATE_COV_STRUCT),
MECHANISM => (REFERENCE)
);
procedure INIT_STEREO_FB_INC;
pragma INTERFACE (FORTRAN, INIT_STEREO_FB_INC);
pragma IMPORT_PROCEDURE (
INTERNAL => INIT_STEREO_FB_INC,
EXTERNAL => "init_stereo_fb_inc_"
);
end Fortran_Interface;
_______________________________________________
cheers..bob
Guy Calinsky <calinsky@sll.northrop.com> wrote in message
news:375ECA88.CF7CFF7E@sll.northrop.com...
> I have a subroutine written in FORTRAN that I need to link with my Ada
> 83 code, but I am getting an Undefined Symbol error on that subroutine.
> I followed the pragma example in the LRM (13.9).
> Here is a small app I created to test the concept:
> ----------------------
>
> with Text_io; use Text_io;
> with Long_Float_io; use Long_Float_io;
>
> procedure Ada_Main is
>
> procedure root(A : Long_Float; B : Long_Float; C : Long_Float; Result
> : out Long_Float);
> pragma Interface(Fortran, root);
>
> result : Long_Float;
>
> begin
>
> root(1.0, 2.0, 1.0, result);
> put("result = "); put(result); new_line;
>
> end Ada_Main;
> ----------------------
>
> My FORTRAN subroutine :
> subroutine root(a, b, c, x)
> implicit none
> real a, b, c, x
> x = SQRT(b**2 - 4.0 * a * c) / (2.0 * a)
> return
> end
> ----------------------
>
> My Make script :
> f77 -Xlist -g -C root.for
> ada ada_main.a
> a.ld -o ada_fortran_test ada_main root.o
> ----------------------
>
> Everything compiles ok and root.o does exist, yet I get this result :
> Undefined first referenced
> symbol in file
> root
> /home/calinsky/Fortran_Ada_Test/.objects/ada_main01
> ld: fatal: Symbol referencing errors. No output written to
> ada_fortran_test
>
>
> Any thoughts or ideas?
> Thanks,
> Guy
>
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~1999-06-10 0:00 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
1999-06-09 0:00 Linking FORTRAN77 to Ada83 Guy Calinsky
1999-06-09 0:00 ` David C. Hoos, Sr.
1999-06-10 0:00 ` Robert Dewar
1999-06-10 0:00 ` bob
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox