在另一个子程序中调用一个子程序
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
无法访问主程序的 x
和 y
,因为它们在主程序本地。
我在调用子程序时遇到一些问题。首先,我可以在 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
无法访问主程序的 x
和 y
,因为它们在主程序本地。