不同等级重载Fortran接口(Overloaded fortran interface with

2019-07-18 12:05发布

在一个Fortran模块我有一个函数,它的阵列和它的名称,从一个数据库中获取(实际调用C函数)的阵列的形状,复制阵列在临时缓冲器中,并传递缓冲到另一个C函数流程它。 此Fortran函数的名称为fs_WriteData_i整数数据,fs_WriteData_f真正和fs_WriteData_d为双精度。 所有这些函数接受不仅一维数组,而且2D,3D和4D阵列和他们很好地工作。 这里遵循这些子程序的一个界面:

subroutine fs_WriteData_d(fieldname, data)
    use, intrinsic :: iso_c_binding
    implicit none

    real(c_double), dimension(*) :: data
    character                    :: fieldname*(*)

    ! ...

end subroutine fs_WriteData_d

如果用户调用fs_WriteData_d('name', data)与数据是一个双精度,最多4维数组,该子程序完成这项工作。

现在,这个问题:我想提供一个共同的重载接口称为fs_WriteData,所以我用

interface fs_WriteData
    module procedure fs_WriteData_i, &
                     fs_WriteData_f, &
                     fs_WriteData_d
end interface fs_WriteData

不幸的是,这并不工作:编译器说,它无法找到正确的执行,如果用户只是调用fs_WriteData('name', data) ,并且因为所有这些功能的等级不匹配这一点。

有一个聪明的办法,以避免为了使模块更易于维护与一样的内容写入所有fs_WriteData_d_1d,fs_WriteData_d_2d,...子程序?

提前谢谢了。

Answer 1:

有点。

正如你已经发现,特定过程的选择规则为通用通话为F2008的要求,除其他事项外,元素程序不谈,类型的比赛,种类和等级(所谓TKR兼容)。 即使假定数据虚设参数大小(因此在直接调用它可以与任何非零秩的实际参数相关联的特定过程)它仍然被认为用于TKR兼容性目的秩一个参数。

与C(TS29113)Fortran语言的互操作性进一步最近公布的技术规范增加了假设秩的概念。 根据您的可执行部分里面做什么fs_WriteData_d (传递给C是几乎所有你能做到),可能适合-对于类型的规则/种类/等级匹配一直延伸,使得假设秩实际或虚拟的说法是兼容不论职位高低。 然后,而显著的问题是编译器支持 - 我不认为有是目前支持该TS任何编译器!

对于编码语言标准预F201X有以下几种可能:

  • 写了一系列的瘦包装子程序为要支持每个等级的,那些包装子程序则呼吁1D中的具体程序,依靠序列关联的多维数组映射到一维数组。

  • 将子程序的身体一个单独的文件中,并且包括骨架接口内部的文件子程序对每个秩。 这种方法要求子程序的身体里面的代码是独立的词法排名。 在某些情况下,代码也可以写在一个类型独立的方式,你可以使用一个共同的包括要支持各种类型的文件。 虽然这消除了与变更管理“复制粘贴”代码相关的问题,处理INCLUDE'd文件可以是一个有点疼痛。

两者的某种组合也可以是合适的。

(第三个选项可能存在,用C的互操作性来设置每个等级和类型的组合,是一个实现程序的结合的名字写接口机构结合的名字,但我不知道是否的C是(AB)的用法互操作性是合法的。)

如果对不同类型的变量共同命名是所有你后,再另一种可能性(再次,取决于你在做什么在身上)是作为数据参数从ISO_C_BINDING内在模块C_PTR,推动要求采取实际参数的C_LOC回子程序的客户端代码。



文章来源: Overloaded fortran interface with different ranks