Spec-Zone.ru › Ada 2022
Руководство по Ada (Ada 2022)

B.5 Взаимодействие с Fortran

Утилиты, относящиеся к взаимодействию с языком Fortran, — это пакет Interfaces.Fortran и поддержка указания аспекта 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
with Pure is
type Fortran_Integer is range определяется реализацией;
type Real 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);
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;
package Double_Precision_Complex_Types is
new Ada.Numerics.Generic_Complex_Types (Double_Precision);
type Double_Complex is new Double_Precision_Complex_Types.Complex;
subtype Double_Imaginary is Double_Precision_Complex_Types.Imaginary;
type Character_Set is тип символов, определяемый реализацией;
type Fortran_Character is array (Positive range <>) of Character_Set
with Pack;
function To_Fortran (Item : in Character) return Character_Set;
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;
procedure To_Fortran (Item : in String;
Target : out Fortran_Character;
Last : out Natural);
procedure To_Ada (Item : in Fortran_Character;
Target : out String;
Last : out Natural);
end Interfaces.Fortran;
Типы Fortran_Integer, Real, Double_Precision, Logical, Complex, Double_Complex, Character_Set и 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 convention_идентификатор для типа, подходящего для Fortran (см. B.1).

Разрешения реализации

Реализация может добавить дополнительные объявления в пакеты интерфейса Fortran. Например, разрешены объявления для типов символов, соответствующих видам символов Fortran «ascii» и «iso_10646», которые, в свою очередь, соответствуют ISO/IEC 646:1991 и UCS-4, как указано в ISO/IEC 10646:2020.

Рекомендации по реализации

Реализация Ada должна поддерживать следующие соответствия интерфейсов между Ada и Fortran:
  • Процедура Ada соответствует подпрограмме Fortran.
  • Функция Ada соответствует функции Fortran.
  • Параметр Ada типа elementary, array или record T передается как аргумент TF подпрограмме Fortran, где TF — тип Fortran, соответствующий типу Ada T, а атрибут INTENT соответствующего dummy-аргумента соответствует режиму формального параметра Ada; используются соглашения о передаче параметров реализации Fortran. Для элементарных типов при необходимости используется локальная копия для обеспечения семантики копирования.
  • Параметр Ada типа access-to-subprogram передается как ссылка на подпрограмму Fortran, интерфейс которой соответствует спецификации назначенной подпрограммы.
ПРИМЕЧАНИЕ 1 Объект типа совместимого с Fortran записи, объявленный в пакете или подпрограмме библиотеки, может соответствовать блоку Fortran common; тип также соответствует типу Fortran «производного типа».
ПРИМЕЧАНИЕ 2 Для возможностей Fortran, не охваченных данным подпунктом, следует использовать возможности взаимозаменяемости Fortran и C, определенные в ISO/IEC 1594-1:2018, вместе с возможностями взаимодействия с C, определенными в B.3.

Примеры

Пример Interfaces.Fortran:
with Interfaces.Fortran;
use Interfaces.Fortran;
procedure Ada_Application is
type Fortran_Matrix is
array (Fortran_Integer range <>,
Fortran_Integer range <>) of Double_Precision
with Convention => Fortran; -- хранится в Fortran в
-- порядке следования столбцов
procedure Invert (Rank : in Fortran_Integer; X : in out Fortran_Matrix)
with Import => True, Convention => Fortran; -- подпрограмма Fortran
Rank : constant Fortran_Integer := 100;
My_Matrix : Fortran_Matrix (1 .. Rank, 1 .. Rank);
Precision: constant := 6;
type Standard_Deviation is digits Precision
with Convention => Fortran;
Deviation : Standard_Deviation;
-- Объявления, соответствующие следующим объявлениям Fortran:
-- integer, parameter :: precision = selected_real_kind(p=6)
-- real(precision) :: deviation
begin
...
My_Matrix := ...;
...
Invert (Rank, My_Matrix);
...
Deviation := ...;
...
end Ada_Application;


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API