首页 > 解决方案 > 如何在运行开始期间在各种选项中为子程序选择所需的代码

问题描述

假设我想在我的主程序(在 Fortran 中)中执行一个操作。假设操作是在一维数组中找到最小数字。我希望通过将数组传递给 call 子例程来做到这一点,并且子例程将在屏幕上打印最小值。有不同的方法或算法可以在数组中找到最小值。假设我有 100 种不同的方法:Method1、Method2 ..... Method100。现在我想分别尝试使用这些方法中的每一种(我不想一次尝试所有方法,而是每次运行一种方法)。我不想创建 100 个不同的子例程并每次更改代码来决定调用哪一个,而是我想在输入文件中提及我想选择哪一个。所以基本上,

我可以编写一个子例程将所有方法转储到该子例程中,并放置一个 IF 条件以在各种方法中进行选择。但是如果条件在 GPU 上特别有效,我想知道最有效的方法。

MAIN PROGRAM

      INTEGER Method !will be read from input file

      Array = [12,5,3,4,1,7,4,3]

      call print_Minimum(Array)

END PROGRAM


SUBROUTINE print_Minimum(Array)

      IF (METHOD == 1)

          <method 1 code>

      ELSE IF (METHOD == 2)

          <method 2 code>
        :
        :
        :
        :
      ELSE IF (METHOD == 100)

          <method100 code>

      END IF

END SUBROUTINE

提前致谢。

标签: fortran

解决方案


这可能最好使用函数指针和/或函数作为参数来完成。

您可以将函数指针设置为某个函数并在嵌套的 if 中执行此操作,并且可以将函数作为参数传递。

这两种方法都在以下示例中实现。

module minimum_mod
    implicit none
    private
    public :: get_min_t, naive_min, time_min_function

    abstract interface
        integer pure function get_min_t(X)
            integer, intent(in) :: X(:)
        end function
    end interface

contains

    subroutine time_min_function(f, X)
        procedure(get_min_t) :: f
        integer, intent(in) :: X(:)
        integer :: res
        res = f(X)
        write(*, *) res
    end subroutine

    integer pure function naive_min(X)
        integer, intent(in) :: X(:)
        integer :: i
        naive_min = huge(naive_min)
        do i = 1, size(X)
            naive_min = min(naive_min, X(i))
        end do
    end function

end module

program time_min_finders
    use minimum_mod, only: get_min_t, naive_min, time_min_function
    implicit none
    integer, parameter :: test_set(5) = [1, 10, 3, 5, 7]
    procedure(get_min_t), pointer :: f

    f => naive_min

    call time_min_function(f, test_set)

end program

PS:请注意,您现在可以在time_min_function.


推荐阅读