在另一个子程序中调用一个子程序

Calling a subroutine within another subroutine

我在调用子程序时遇到一些问题。首先,我可以在 IF 语句中调用子程序吗?

IF (...) THEN
  ...
ELSE
  CALL sub1(...)
END IF

第二个问题。 Sub1 在其内部调用 sub2。然后 sub2 有来自主程序的输入,假设 x.

MODULE mod1
  ...
CONTAINS

  SUBROUTINE sub1(w)

    IMPLICIT NONE
    INTENT(OUT) :: w
    REAL :: x, z

    CALL sub2(x, z)

    w = z + 1

  END SUBROUTINE sub1

  SUBROUTINE sub2(x, z)

    IMPLICIT NONE      
    INTENT(IN) :: x
    INTENT(OUT) :: z

    z = x + 1

  END SUBROUTINE sub2

END MODULE mod1

PROGRAM prog

  USE mod1
  IMPLICIT NONE

  IF (...) THEN
    ...
  ELSE
    x = y
    CALL sub1(w)
    x = w + y
  END IF

END PROGRAM prog

注意:变量之间的加法并不是精确的数学运算

基本上每个变量都相互依赖,但 x = y 是初始条件,我认为这是唯一可行的方法。似乎 sub2 没有在初始 x = y 上拾取,然后在从 sub1 调用时将其值提供给 sub1。所以也许我不明白变量是如何传递的。我得到的错误不是编译错误,而是 运行 时间错误,它导致我在 sub1 中调用 sub2 的行。非常感谢任何帮助。

请在所有程序和模块的开头使用 implicit none(只有 USE 语句在它之前),然后显式声明所有变量。

虽然按照您的方式调用子例程完全没问题,但您必须考虑变量的范围。

在您的示例中,sub1 无法访问主程序的 xy,因为它们在主程序本地。