2017-02-27 36 views
0

我在调用子程序时遇到了一些问题。首先,我可以在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将其值赋给sub1。所以也许我不明白变量是如何传递的。我得到的错误不是编译而是运行时错误,这导致我在sub1内调用sub2的那一行。任何帮助深表感谢。

+0

请不要做出使现有答案无稽之谈的更改。如果您对新代码有新问题,请提出新问题。或者,如果你不确定他的答案,首先要求某人在评论中回答。 –

+0

好的,如果你说它是在你的真实代码中,我回到了你的改变,但是:1.不要发布这样的“简化”代码。 2.阅读你所得到的答案和我所链接问题的答案。子程序中的'x'和'y'是局部变量。无论它们是隐式声明还是用'real x,y'声明它们都没关系。它们仍然是子程序的局部变量。 –

+0

并不意味着会造成混淆。我现在明白了,谢谢。 – Dtaai

回答

0

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

尽管按照您的方式调用子程序是完全正常的,但您必须考虑变量的范围。

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

+0

对不起,只是编辑它。尽管如此,我确实在我的真实代码中拥有它。在这种情况下,sub1不需要x或y,但需要来自sub2的z,它需要主程序中的x。 – Dtaai

+0

请看看我链接的问题的答案。 x和y在子程序和主程序中与x和y不同。 –

相关问题