在另一个子程序中定义一个子程序

Defining a subroutine in another subroutine

在 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 中将提供更改主机关联行为的功能。