假设我在 Fortran 中有一个带有各种子例程的程序,我不知道所有子例程的先验,并且用户通过命令行提供了其中一个子例程的名称,如下所示:
程序 subroutine_name
因此,我将subroutine_name存储在字符变量中。这样,我就不能声明一个外部变量来存储子程序了。那么,我怎么能只知道它的名字来称呼它呢?有可能通过这种方式,还是有其他方法可以做到这一点?
假设我在 Fortran 中有一个带有各种子例程的程序,我不知道所有子例程的先验,并且用户通过命令行提供了其中一个子例程的名称,如下所示:
程序 subroutine_name
因此,我将subroutine_name存储在字符变量中。这样,我就不能声明一个外部变量来存储子程序了。那么,我怎么能只知道它的名字来称呼它呢?有可能通过这种方式,还是有其他方法可以做到这一点?
实际上没有办法编写 Fortran 语句,例如
call character_variable_containing_subroutine_name
它违背了静态类型编译语言(如 Fortran)提供这种功能的方式。
当然,如果您问过我能否向 Fortran 程序提供一个输入参数,该程序将在运行时确定程序采用的执行路径,那么答案当然是. 我将忽略您的情况的任何复杂性,并假设您想调用sin
,cos
或之一tan
。
首先,将程序的参数文本捕获到字符变量中:
character(len=*) :: user_choice
...
call get_command_argument(1,user_choice)
...
select case (user_choice)
case ('sin')
... do stuff with sin
case ('cos')
... do stuff with cos
case ('tan')
... do stuff with tan
case default
... do whatever
end select
您可以通过使用过程指针来更详细地说明这一点。例如,您可以定义:
pointer :: rp
interface
real function rp(inval)
real, intent(in) :: inval
end function rp
end interface
然后将select case
构造的第一个版本替换为:
select case (user_choice)
case ('sin')
rp => sin
case ('cos')
rp => cos
case ('tan')
rp => tan
case default
... do whatever
end select
这可能会简化以后的代码。我想这也可能使它更复杂。
请注意,我没有测试任何这些片段,我的语法可能有点不稳定。