2017-02-27 162 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不同。 –

相關問題