1

Fortran 是否可以在另一个子程序中定义一个子程序?当我尝试类似

SUBROUTINE test1(...)
  ! do some stuff
  CALL test2(...)

  SUBROUTINE test2(...)
    ! do some stuff
  END SUBROUTINE test2
END SUBROUTINE test1.

我的编译器(Silverfrost)给了我一个递归错误。

4

1 回答 1

3

正如 HighPerformanceMark 评论的那样,可以在另一个过程的包含部分中定义一个内部过程

SUBROUTINE test1(...)
  ! do some stuff
  CALL test2(...)

CONTAINS

  SUBROUTINE test2(...)
    ! do some stuff
  END SUBROUTINE test2
END SUBROUTINE test1

内部过程通过主机关联test2访问主机过程中定义的所有实体。它还可以访问所有有权访问的实体。规则类似于主程序中的内部程序规则。test1test1

一个内部过程不能承载另一个内部过程。

指向内部过程的过程指针仅在宿主过程执行期间有效,并且仅在 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 中将具有更改主机关联行为的功能。

于 2016-12-16T11:48:52.033 回答