- (1)
- The facilities relevant to interfacing with the Fortran language are the
package Interfaces.Fortran and support for the Import, Export and Convention
pragmas with convention_identifier Fortran.
- (2)
- The package Interfaces.Fortran defines Ada types whose representations
are identical to the default representations of the Fortran intrinsic types
Integer, Real, Double Precision, Complex, Logical, and Character in a
supported Fortran implementation. These Ada types can therefore be used to
pass objects between Ada and Fortran programs.
Static Semantics
- (3)
- The library package Interfaces.Fortran has the following declaration:
(4)
with Ada.Numerics.Generic_Complex_Types; -- see G.1.1
pragma Elaborate_All(Ada.Numerics.Generic_Complex_Types);
package Interfaces.Fortran is
pragma Pure(Fortran);
(5)
type Fortran_Integer is range implementation-defined;
(6)
type Real is digits implementation-defined;
type Double_Precision is digits implementation-defined;
(7)
type Logical is new Boolean;
(8)
package Single_Precision_Complex_Types is
new Ada.Numerics.Generic_Complex_Types (Real);
(9)
type Complex is new Single_Precision_Complex_Types.Complex;
(10)
subtype Imaginary is Single_Precision_Complex_Types.Imaginary;
i : Imaginary renames Single_Precision_Complex_Types.i;
j : Imaginary renames Single_Precision_Complex_Types.j;
(11)
type Character_Set is implementation-defined character type;
(12)
type Fortran_Character is array (Positive range <>) of Character_Set;
pragma Pack (Fortran_Character);
(13)
function To_Fortran (Item : in Character) return Character_Set;
function To_Ada (Item : in Character_Set) return Character;
(14)
function To_Fortran (Item : in String) return Fortran_Character;
function To_Ada (Item : in Fortran_Character) return String;
(15)
procedure To_Fortran (Item : in String;
Target : out Fortran_Character;
Last : out Natural);
(16)
procedure To_Ada (Item : in Fortran_Character;
Target : out String;
Last : out Natural);
(17)
end Interfaces.Fortran;
- (18)
- The types Fortran_Integer, Real, Double_Precision, Logical, Complex, and
Fortran_Character are Fortran-compatible.
- (19)
- The To_Fortran and To_Ada functions map between the Ada type Character
and the Fortran type Character_Set, and also between the Ada type String and
the Fortran type Fortran_Character. The To_Fortran and To_Ada procedures
have analogous effects to the string conversion subprograms found in
Interfaces.COBOL.
Implementation Requirements
- (20)
- An implementation shall support pragma Convention with a Fortran convention_identifier
for a Fortran-eligible type (see B.1).
Implementation Permissions
- (21)
- An implementation may add additional declarations to the Fortran
interface packages. For example, the Fortran interface package for an
implementation of Fortran 77 (ANSI X3.9-1978) that defines types like
Integer*n, Real*n, Logical*n, and Complex*n may contain the declarations of
types named Integer_Star_n, Real_Star_n, Logical_Star_n, and Complex_Star_n.
(This convention should not apply to Character*n, for which the Ada analog is
the constrained array subtype Fortran_Character (1..n).) Similarly, the
Fortran interface package for an implementation of Fortran 90 that provides
multiple kinds of intrinsic types, e.g. Integer (Kind=n), Real (Kind=n),
Logical (Kind=n), Complex (Kind=n), and Character (Kind=n), may contain the
declarations of types with the recommended names Integer_Kind_n, Real_Kind_n,
Logical_Kind_n, Complex_Kind_n, and Character_Kind_n.
Implementation Advice
- (22)
- An Ada implementation should support the following interface
correspondences between Ada and Fortran:
- (23)
- An Ada procedure corresponds to a Fortran subroutine.
- (24)
- An Ada function corresponds to a Fortran function.
- (25)
- An Ada parameter of an elementary, array, or record type T is
passed as a T argument to a Fortran procedure, where T is the
F F
Fortran type corresponding to the Ada type T, and where the
INTENT attribute of the corresponding dummy argument matches the
Ada formal parameter mode; the Fortran implementation's parameter
passing conventions are used. For elementary types, a local copy
is used if necessary to ensure by-copy semantics.
- (26)
- An Ada parameter of an access-to-subprogram type is passed as a
reference to a Fortran procedure whose interface corresponds to
the designated subprogram's specification.
-
- (27)
(17) An object of a Fortran-compatible record type, declared in a
library package or subprogram, can correspond to a Fortran common block;
the type also corresponds to a Fortran ``derived type''.
Examples
- (28)
- Example of Interfaces.Fortran:
(29)
with Interfaces.Fortran;
use Interfaces.Fortran;
procedure Ada_Application is
(30)
type Fortran_Matrix is array (Integer range <>,
Integer range <>) of Double_Precision;
pragma Convention (Fortran, Fortran_Matrix); -- stored in Fortran's
-- column-major order
procedure Invert (Rank : in Fortran_Integer; X : in out Fortran_Matrix);
pragma Import (Fortran, Invert); -- a Fortran subroutine
(31)
Rank : constant Fortran_Integer := 100;
My_Matrix : Fortran_Matrix (1 .. Rank, 1 .. Rank);
(32)
begin
(33)
...
My_Matrix := ...;
...
Invert (Rank, My_Matrix);
...
(34)
end Ada_Application;
-- Email comments, additions, corrections, gripes, kudos, etc. to:
Magnus Kempe -- Magnus.Kempe@di.epfl.ch
Copyright statement
Page last generated: 95-03-12