在 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、... 子程序的内容相同,从而使模块更易于维护?
提前谢谢了。