Справочник Ada 2005
B.5 Интерфейс с Fortran
Средства, относящиеся к интерфейсу с языком Fortran, — это пакет Interfaces.Fortran и поддержка директив Import, Export и Convention с конвенцией_идентификатор Fortran.
Пакет Interfaces.Fortran определяет типы Ada, представления которых идентичны стандартным представлениям встроенных типов Fortran Integer, Real, Double Precision, Complex, Logical и Character в поддерживаемой реализации Fortran. Эти типы Ada могут использоваться для передачи объектов между программами на Ada и Fortran.
Статическая семантика
В пакете библиотеки Interfaces.Fortran имеется следующее объявление:
with Ada.Numerics.Generic_Complex_Types; -- см. G.1.1
pragma Elaborate_All(Ada.Numerics.Generic_Complex_Types);
package Interfaces.Fortran is
pragma Pure(Fortran);
pragma Elaborate_All(Ada.Numerics.Generic_Complex_Types);
package Interfaces.Fortran is
pragma Pure(Fortran);
type Fortran_Integer is range определяется реализацией;
type Real is digits определяется реализацией;
type Double_Precision is digits определяется реализацией;
type Double_Precision is digits определяется реализацией;
type Logical is new Boolean;
package Single_Precision_Complex_Types is
new Ada.Numerics.Generic_Complex_Types (Real);
new Ada.Numerics.Generic_Complex_Types (Real);
type Complex is new Single_Precision_Complex_Types.Complex;
subtype Imaginary is Single_Precision_Complex_Types.Imaginary;
i : Imaginary renames Single_Precision_Complex_Types.i;
j : Imaginary renames Single_Precision_Complex_Types.j;
i : Imaginary renames Single_Precision_Complex_Types.i;
j : Imaginary renames Single_Precision_Complex_Types.j;
type Character_Set is тип символов, определяется реализацией;
type Fortran_Character is array (Positive range <>) of Character_Set;
pragma Pack (Fortran_Character);
pragma Pack (Fortran_Character);
function To_Fortran (Item : in Character) return Character_Set;
function To_Ada (Item : in Character_Set) return Character;
function To_Ada (Item : in Character_Set) return Character;
function To_Fortran (Item : in String) return Fortran_Character;
function To_Ada (Item : in Fortran_Character) return String;
function To_Ada (Item : in Fortran_Character) return String;
procedure To_Fortran (Item : in String;
Target : out Fortran_Character;
Last : out Natural);
Target : out Fortran_Character;
Last : out Natural);
procedure To_Ada (Item : in Fortran_Character;
Target : out String;
Last : out Natural);
Target : out String;
Last : out Natural);
end Interfaces.Fortran;
Типы Fortran_Integer, Real, Double_Precision, Logical, Complex и Fortran_Character совместимы с Fortran.
Функции To_Fortran и To_Ada преобразуют между типом Ada Character и типом Fortran Character_Set, а также между типом Ada String и типом Fortran Fortran_Character. Процедуры To_Fortran и To_Ada имеют аналогичное действие подпрограммам преобразования строк, которые находятся в Interfaces.COBOL.
Требования к реализации
Реализация должна поддерживать директиву Convention с Fortran конвенцией_идентификатор для типа, допустимого для Fortran (см. B.1).
Разрешения для реализации
Реализация может добавить дополнительные объявления в пакеты интерфейса Fortran. Например, пакет Fortran-интерфейса для реализации Fortran 77 (ANSI X3.9-1978), который определяет типы, такие как Integer*n, Real*n, Logical*n и Complex*n, может содержать объявления типов, названных Integer_Star_n, Real_Star_n, Logical_Star_n и Complex_Star_n. (Эта конвенция не должна применяться к Character*n, для которого аналогом в Ada является ограниченный подтип массива Fortran_Character (1..n).) Аналогично, пакет Fortran-интерфейса для реализации Fortran 90, которая предоставляет несколько видов встроенных типов, например, Integer (Kind=n), Real (Kind=n), Logical (Kind=n), Complex (Kind=n) и Character (Kind=n), может содержать объявления типов с рекомендуемыми именами Integer_Kind_n, Real_Kind_n, Logical_Kind_n, Complex_Kind_n и Character_Kind_n.
Рекомендации по реализации
Реализация Ada должна поддерживать следующие соответствия интерфейса между Ada и Fortran:
- Процедура Ada соответствует подпрограмме Fortran.
- Функция Ada соответствует функции Fortran.
- Параметр Ada элементарного, массива или записи типа T передаётся в качестве аргумента TF подпрограмме Fortran, где TF — тип Fortran, соответствующий типу Ada T, и где атрибут INTENT соответствующего аргумента-заглушки соответствует режиму формального параметра Ada; используются конвенции передачи параметров реализации Fortran. Для элементарных типов, при необходимости, используется локальная копия для обеспечения семантики «передача по значению».
- Параметр Ada типа доступа к подпрограмме передаётся как ссылка на подпрограмму Fortran, интерфейс которой соответствует спецификации указанной подпрограммы.
ПРИМЕЧАНИЯ
16 Объект типа записи, совместимого с Fortran, объявленный в пакете библиотеки или подпрограмме, может соответствовать блоку данных Fortran; тип также соответствует «производному типу» Fortran.
Примеры
Пример пакета Interfaces.Fortran:
with Interfaces.Fortran;
use Interfaces.Fortran;
procedure Ada_Application is
use Interfaces.Fortran;
procedure Ada_Application is
type Fortran_Matrix is array (Integer range <>,
Integer range <>) of Double_Precision;
pragma Convention (Fortran, Fortran_Matrix); -- хранится в Fortran's
-- порядке следования по столбцам
procedure Invert (Rank : in Fortran_Integer; X : in out Fortran_Matrix);
pragma Import (Fortran, Invert); -- подпрограмма Fortran
Integer range <>) of Double_Precision;
pragma Convention (Fortran, Fortran_Matrix); -- хранится в Fortran's
-- порядке следования по столбцам
procedure Invert (Rank : in Fortran_Integer; X : in out Fortran_Matrix);
pragma Import (Fortran, Invert); -- подпрограмма Fortran
Rank : constant Fortran_Integer := 100;
My_Matrix : Fortran_Matrix (1 .. Rank, 1 .. Rank);
My_Matrix : Fortran_Matrix (1 .. Rank, 1 .. Rank);
begin
...
My_Matrix := ...;
...
Invert (Rank, My_Matrix);
...
My_Matrix := ...;
...
Invert (Rank, My_Matrix);
...
end Ada_Application;