Объявление типов старых функций и подпрограмм F77 для кода Fortran 2003 - PullRequest
0 голосов
/ 04 августа 2020

У нас есть новый код Fortran 2003, который вызывает библиотеку Fortran 77 (во внешнем пакете) и связан с ней. Есть ли способ записать объявления для функций и подпрограмм F77 во внешней библиотеке в F2003, чтобы гарантировать выдачу сообщения об ошибке, если функции вызываются с неправильными типами аргументов? Один из способов - написать обертки для каждой функции, но это, похоже, требует много работы.

(Кстати, код F77 на самом деле является оболочкой для вызова кода C. В идеале было бы лучше переписать C обертки в F2003, но это тоже много работы).

1 Ответ

2 голосов
/ 04 августа 2020

Компилятор Intel ifort имеет параметр -gen-interfaces. Я думаю, что этот вариант делает именно то, что вам нужно. В отличие от компилятора gfortran (который, к сожалению, не имеет этой функции), ifort стоит денег. Возможно, вы сможете заставить кого-нибудь запустить ifort -gen-interfaces один раз для вашего действительно старого fortran77stuff? Я предполагаю, что код fortran77 больше не меняется, поэтому сгенерированный * __ genmod.f90 можно использовать, и его не нужно создавать снова и снова.

Альтернативой является создание модуля:

     MODULE NOSTALGIA77
     CONTAINS
       include 'file1.f'
      ...
       include 'fileN.f'
     END MODULE NOSTALGIA77

Теперь, когда вы компилируете модуль, а не отдельные файлы, вы можете использовать функции и подпрограммы после добавления USE NOSTALGIA77 в ваш код Fortran2003, и компилятор проверит правильность ваших вызовов.

Примечание: в примере предполагается, что код fortran77 содержит только подпрограммы. Если он также содержит другие данные (BLOCK DATA и другие вещи, которые мы не хотим запоминать), модуль может быть немного сложнее сделать, потому что некоторые вещи появятся до CONTAINS, а некоторые после. Но это все еще можно сделать (и не слишком быстро).

Удачи!

Изменить:

Возможно, https://shroud.readthedocs.io/en/latest/ может вам помочь. Я провел несколько небольших тестов (см. https://shroud.readthedocs.io/en/latest/appendix-A.html). Кажется, что сработало, так это поместить несколько строк ваших файлов заголовков в файл yaml clibrary.yaml, каждой строке предшествует '-decl':

declarations:
- decl: void NoReturnNoArguments()
- decl: double PassByValue(double arg1, int arg2)

Я полагаю, этот файл yaml можно легко создать из ваши файлы заголовков с использованием sed, awk, python или любого другого языка сценариев, который вам нравится. Затем все, что вы запускаете, - это shroud clibrary.yaml, и выходит модуль fortran libray_mod, который вы можете включить, после чего все ваши функции становятся доступными, и их использование проверяется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...