在Fortran中是否可以在另一个子例程中定义子例程?当我尝试像
这样的东西时SUBROUTINE test1(...)
! do some stuff
CALL test2(...)
SUBROUTINE test2(...)
! do some stuff
END SUBROUTINE test2
END SUBROUTINE test1.
我的编译器(Silverfrost)给了我一个递归错误。
答案 0 :(得分:3)
当HighPerformanceMark评论时,可以在另一个过程的contains部分中定义内部过程
SUBROUTINE test1(...)
! do some stuff
CALL test2(...)
CONTAINS
SUBROUTINE test2(...)
! do some stuff
END SUBROUTINE test2
END SUBROUTINE test1
内部过程test2
可以通过主机关联访问主机过程test1
中定义的所有实体。它还可以访问test1
有权访问的所有实体。规则类似于主程序中的内部程序规则。
内部程序无法托管其他内部程序。
内部过程的过程指针仅在执行主机过程期间有效,并且仅在Fortran 2008及更高版本中允许。这是一项高级功能。
这种主机关联有时会很烦人,你必须保持警惕,以避免像:
这样的错误SUBROUTINE test1(...)
integer :: i
do i = 1, n
CALL test2(...)
end do
CONTAINS
SUBROUTINE test2(...)
do i = 1, n
!i here is the same variable as i in test1!!
end do
END SUBROUTINE test2
END SUBROUTINE test1
Fortran 2015中将有一些功能可以更改主机关联行为。