fortran - 如何在运行开始期间在各种选项中为子程序选择所需的代码
问题描述
假设我想在我的主程序(在 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
提前致谢。
解决方案
这可能最好使用函数指针和/或函数作为参数来完成。
您可以将函数指针设置为某个函数并在嵌套的 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
.
推荐阅读
- python - Pandas:如何遍历两个不同的数据框
- python - 如果用户没有传递参数并使用变量作为参数,我如何让 argparse 不接受任何参数(Python)
- ios - 从视图控制器弹出时出现白线问题
- javascript - 为什么我无法通过 nodemon 使用 mocha?
- react-native - Flexbox 将高度设置为 0
- c++ - 使用 TSS/C++ 创建椭圆曲线签名密钥
- python - 在 VSC 中调试 Guage-python 代码:wsarecv:一个现有的连接被远程主机强行关闭
- database - 安装 mongodb-enterprise-server 错误
- google-cloud-platform - Google Cloud Platform 中的 HANA Express
- java - 使用 JTable java 在数据库中添加了两次数据