【问题标题】:Declaring types of old F77 functions and subroutines for Fortran 2003 code为 Fortran 2003 代码声明旧 F77 函数和子例程的类型
【发布时间】:2020-11-24 11:01:23
【问题描述】:

我们有一个新的 Fortran 2003 代码,它调用并链接到 Fortran 77 库(在外部包中)。有没有办法在 F2003 的外部库中为 F77 函数和子例程编写声明,以确保在使用错误参数类型调用函数时给出错误消息?一种方法是为每个函数编写包装器,但这似乎需要做很多工作。

(顺便说一句,F77代码实际上是调用C代码的包装器。理想情况下最好在F2003中重写C包装器,但这也是很多工作)。

【问题讨论】:

  • 您使用的是哪个编译器?一些编译器提供了为外部过程自动生成(和检查)接口的选项。
  • 我们将 gfortran 用于新的 fortran 代码。外部函数实际上是用 C 编写的,但使用古老的 cfortran.h 接口库导出。
  • 扔掉 FORTRAN 包装器并直接与 C 函数接口对您来说有多容易?使用 Fortran 非常现代的 与 C 特性的互操作性?
  • @HighPerformanceMark:这可能是最好的主意,但是有很多函数,并且当前的 fortran-ABI 库中有一些额外的代码隐藏了 C 指针。理想情况下,我希望保留相同的 API,以便现有代码可以只包含原型并对其进行类型检查。
  • 您在问题中说“编写声明”和“编写包装器” - 要明确您想要做的是“编写接口”。根据接受的答案,您的问题似乎是如何自动生成这些接口?否则,手动创作它们是显而易见的答案。

标签: fortran fortran77 fortran95


【解决方案1】:

英特尔编译器 ifort 具有选项 -gen-interfaces。我认为这个选项正是你所需要的。 与 gfortran 编译器(遗憾的是没有此功能)不同,ifort 需要花钱, 也许您可以让某人为您真正旧的 fortran77stuff 运行一次 ifort -gen-interfaces? 我假设fortran77代码不再变化,所以生成的*__genmod.f90可以使用 并且不必一次又一次地生成。

另一种方法是制作一个模块:

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

现在当你编译模块而不是单独的文件时,你可以使用函数和子例程 将 USE NOSTALGIA77 添加到您的 Fortran2003 代码后,编译器将检查您调用的正确性。

注意:该示例假定 fortran77 代码仅包含子例程。如果它还包含其他东西 (块数据和其他我们不想记住的东西),模块可能更难制作,因为 有些东西会出现在 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,您可以将其包含在内,然后您的所有功能都可用,并对其使用进行测试。

【讨论】:

  • 很遗憾我没有说清楚F77接口实际上是用cfortran封装的C。它有 F77 ABI,但没有 F77 代码。它看起来像:FCALLSCSUB5(ffgkyl,FTGKYL,ftgkyl,FITSUNIT,STRING,PINT,PSTRING,PINT)。不过,这是一个很好的答案。
  • @xioxox 确实使事情复杂化,我会看看但我不希望有合适的答案
  • @xioxox 我添加了一个我认为可行的建议
  • 谢谢 - 寿衣看起来很有帮助
猜你喜欢
  • 1970-01-01
  • 2013-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-22
相关资源
最近更新 更多