【问题标题】:Fortran Function OverloadingFortran 函数重载
【发布时间】: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


【解决方案1】:

我不知道,因为 (2, 2) 形状也会匹配 (:, :) 形状。

我能推荐的最好方法是只使用 NxN 函数,如果遇到 2x2 数组,则将其传递给特殊函数。

然后,作为输出,将其放入一个大小为 (1) 的数组中。

【讨论】:

  • 是的,我就是这么想的。我只是想确认我没有遗漏一些晦涩的语法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-14
相关资源
最近更新 更多