子程序的名称可以是 Fortran 中的变量吗?
The name of a subroutine can be a variable in Fortran?
我想知道在 Fortran 中是否有类似的东西。当然这个例子不能编译,但我想你可以理解。
program test
character(1):: sub
sub='A'
call sub
sub='B'
call sub
end program
subroutine A
print*,'OK! A'
end subroutine A
subroutine B
print*,'OK! B'
end subroutine B
最接近的是 function/procedure 指针,但那是 fortran-2003。基本上,给定输入 'A' 或 'B',您将指针设置为指向 subroutine A
或 subroutine B
。更多详情请见 How to alias a function name in Fortran
您无法通过设置字符变量来完成此操作,但您可以使用过程指针来完成此操作。我稍微修改了你的例子来实现它。参见:
program test
implicit none
abstract interface
subroutine no_args
end subroutine
end interface
procedure(no_args), pointer :: sub => null()
sub => A
call sub
sub => B
call sub
contains
subroutine A
implicit none
print *,"OK! A"
end subroutine
subroutine B
implicit none
print *,"OK! B"
end subroutine
end program
变化是:
- 为过程指针定义一个接口
- 将
sub
声明为指向该抽象接口的过程指针
然后您可以将 sub
分配给不带参数的子例程(因为这是接口所说的)并通过 sub
您设想的方式调用它们。
我想知道在 Fortran 中是否有类似的东西。当然这个例子不能编译,但我想你可以理解。
program test
character(1):: sub
sub='A'
call sub
sub='B'
call sub
end program
subroutine A
print*,'OK! A'
end subroutine A
subroutine B
print*,'OK! B'
end subroutine B
最接近的是 function/procedure 指针,但那是 fortran-2003。基本上,给定输入 'A' 或 'B',您将指针设置为指向 subroutine A
或 subroutine B
。更多详情请见 How to alias a function name in Fortran
您无法通过设置字符变量来完成此操作,但您可以使用过程指针来完成此操作。我稍微修改了你的例子来实现它。参见:
program test
implicit none
abstract interface
subroutine no_args
end subroutine
end interface
procedure(no_args), pointer :: sub => null()
sub => A
call sub
sub => B
call sub
contains
subroutine A
implicit none
print *,"OK! A"
end subroutine
subroutine B
implicit none
print *,"OK! B"
end subroutine
end program
变化是:
- 为过程指针定义一个接口
- 将
sub
声明为指向该抽象接口的过程指针
然后您可以将 sub
分配给不带参数的子例程(因为这是接口所说的)并通过 sub
您设想的方式调用它们。