为Fortran 2003代码声明旧F77函数和子例程的类型

为Fortran 2003代码声明旧F77函数和子例程的类型,fortran,fortran77,fortran95,Fortran,Fortran77,Fortran95,我们有一个新的Fortran 2003代码,它调用并链接到Fortran 77库(在一个外部包中)。有没有办法在F2003的外部库中为F77函数和子例程编写声明,以确保在使用错误的参数类型调用函数时给出错误消息?一种方法是为每个函数编写包装器,但这似乎需要很多工作 (顺便说一句,F77代码实际上是调用C代码的包装器。理想情况下,最好在F2003中重写C包装器,但这也需要大量工作)。英特尔编译器ifort具有-gen接口选项。我认为这个选项正是你所需要的。 与gfortran编译器(不幸的是它没有

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


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

英特尔编译器ifort具有-gen接口选项。我认为这个选项正是你所需要的。 与gfortran编译器(不幸的是它没有这个功能)不同,ifort需要花钱, 也许你可以让某人为你真正古老的Fortran77东西运行一次ifort-gen接口? 我假设fortran77代码不再更改,因此可以使用生成的*\uu genmod.f90 而且不必一次又一次地生成

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

     MODULE NOSTALGIA77
     CONTAINS
       include 'file1.f'
      ...
       include 'fileN.f'
     END MODULE NOSTALGIA77
现在,当编译模块而不是单独的文件时,可以使用函数和子例程 在Fortran2003代码中添加USE怀旧77后,编译器将检查调用的正确性

注意:该示例假定fortran77代码只包含子例程。如果它也包含其他东西 (阻止数据和其他我们不想记住的东西),模块可能更难制作,因为 有些东西会在容器前,有些在容器后。但这仍然是可以做到的(而且不会花费太多时间)

祝你好运


编辑:

也许你能帮上忙。我做了一些小测试(参见)。 似乎有效的方法是将头文件的几行放在yaml文件clibrary.yaml中,每行前面都有“-decl”:

声明:
-decl:void NoReturnNoArguments()
-decl:double PassByValue(double arg1,int arg2)
我想这个yaml文件可以使用sed、awk、python或任何您喜欢的脚本语言从头文件轻松构建。
接下来,您只需运行裹尸布clibrary.yaml,就可以得到一个fortran模块libray_mod,您可以将其包含在内,然后所有函数都可用,并对其使用情况进行测试。

英特尔编译器ifort具有-gen接口选项。我认为这个选项正是你所需要的。 与gfortran编译器(不幸的是它没有这个功能)不同,ifort需要花钱, 也许你可以让某人为你真正古老的Fortran77东西运行一次ifort-gen接口? 我假设fortran77代码不再更改,因此可以使用生成的*\uu genmod.f90 而且不必一次又一次地生成

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

     MODULE NOSTALGIA77
     CONTAINS
       include 'file1.f'
      ...
       include 'fileN.f'
     END MODULE NOSTALGIA77
现在,当编译模块而不是单独的文件时,可以使用函数和子例程 在Fortran2003代码中添加USE怀旧77后,编译器将检查调用的正确性

注意:该示例假定fortran77代码只包含子例程。如果它也包含其他东西 (阻止数据和其他我们不想记住的东西),模块可能更难制作,因为 有些东西会在容器前,有些在容器后。但这仍然是可以做到的(而且不会花费太多时间)

祝你好运


编辑:

也许你能帮上忙。我做了一些小测试(参见)。 似乎有效的方法是将头文件的几行放在yaml文件clibrary.yaml中,每行前面都有“-decl”:

声明:
-decl:void NoReturnNoArguments()
-decl:double PassByValue(double arg1,int arg2)
我想这个yaml文件可以使用sed、awk、python或任何您喜欢的脚本语言从头文件轻松构建。
接下来,您只需运行裹尸布clibrary.yaml,就可以得到一个fortran模块libray_mod,您可以包含它,然后所有函数都可用,并测试它们的使用情况。

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