假设我在Fortran中有一个带有各种子程序的程序,我不知道先验所有子程序,并且用户通过命令行提供其中一个的名称,如下所示:
program subroutine_name
因此,我将子例程名存储在字符变量中。这样,我就不能声明外部变量来存储子程序。那么,我怎么称它只知道它的名字呢?是否有可能通过这种方式,还是有另一种方法来实现这一目标?
答案 0 :(得分:2)
没有办法编写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
这可能会简化以后的代码。我想这也可能会让它更复杂。
请注意,我没有测试任何这些片段,我的语法可能有点不可思议。