【发布时间】:2015-10-27 00:41:02
【问题描述】:
有没有一种方法可以在 Fortran 中执行以下操作,而不必为每个维度数组显式执行此操作?
Module OverloadTest
interface arrayStuff
module procedure :: arrayStuff_NxN, arrayStuff_2x2
end interface
contains
function arrayStuff_NxN(A) result(output)
real*8,dimension(:,:) :: A
real*8, dimension(size(A,1), size(A,2)-1) :: output
!code and stuff to populate output
end function arrayStuff_NxN
function arrayStuff_2x2(A) result(output)
real*8,dimension(:,:) :: A
real*8 :: output
!code and stuff to populate output
end function arrayStuff_2x2
End Module OverloadTest
为了澄清,我希望能够调用 arrayStuff 函数,如果它是一个 2x2 数组,我希望它选择 2x2,对于所有其他尺寸,选择 NxN,而不必专门为 3x3、4x4 创建函数, 5x5, 等等。
【问题讨论】:
-
不能拥有像
arrayStuff这样的泛型,其中每个特定的参数A是一个仅在大小/范围上不同的数组。实际上,这两个函数的参数是完全无法区分的,real*8都假定为 2 级形状。函数结果不会消除歧义。 -
你研究过通用接口吗?不过,正如@francescalus 所说,他们将无法在这种特定情况下提供帮助。
-
我猜,你不会绕过 if,编写一个包装例程,它根据数组大小在内部调用实际实现。我看到的唯一其他选择是使用函数指针。如果您可以一次确定数组的大小,但需要多次调用该函数,则可以适当地设置函数指针,然后继续多次调用它,而无需每次都进行 if 评估。不过,不确定在您的情况下什么会产生更好的性能。你的问题是,如何为任意维度实现这种事情?
-
@haraldkl,我认为我不能使用 if 语句包装器,因为在一个中我返回一个二维数组,而在另一个中我返回一个值。这个想法是一个返回次要矩阵以用于递归确定函数的函数。我可以返回一个 1x1 数组,但在代码中,这将使我的答案成为一个数组,这并不比像以前那样只执行 if 语句更好。我原以为在这种情况下它会默认使用最具体的功能。
标签: interface fortran overloading