Fortran 是否可以在另一个子程序中定义一个子程序?当我尝试类似
SUBROUTINE test1(...)
! do some stuff
CALL test2(...)
SUBROUTINE test2(...)
! do some stuff
END SUBROUTINE test2
END SUBROUTINE test1.
我的编译器(Silverfrost)给了我一个递归错误。
Fortran 是否可以在另一个子程序中定义一个子程序?当我尝试类似
SUBROUTINE test1(...)
! do some stuff
CALL test2(...)
SUBROUTINE test2(...)
! do some stuff
END SUBROUTINE test2
END SUBROUTINE test1.
我的编译器(Silverfrost)给了我一个递归错误。
正如 HighPerformanceMark 评论的那样,可以在另一个过程的包含部分中定义一个内部过程
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 中将具有更改主机关联行为的功能。