Справочник по Ada 95
B.5 Интерфейс с Fortran
Средства, относящиеся к интерфейсу с языком Fortran, — это пакет Interfaces.Fortran и поддержка директив Import, Export и Convention с идентификатором _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 отображают тип Character Ada в тип Character_Set Fortran, а также тип String Ada в тип 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, интерфейс которой соответствует спецификации указанной подпрограммы.
ПРИМЕЧАНИЯ
17 Объект типа записи, совместимого с 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
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
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;