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

时间:2016-12-16 11:01:24

标签: fortran subroutine fortran95 silverfrost-fortran

在Fortran中是否可以在另一个子例程中定义子例程?当我尝试像

这样的东西时
SUBROUTINE test1(...)
  ! do some stuff
  CALL test2(...)

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

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

1 个答案:

答案 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中将有一些功能可以更改主机关联行为。