2013-12-18 109 views
4

我有一個關於我的問題,我錯了,並想知道如果有人能解釋它。 不要擔心課程結束只是想知道爲什麼它是錯的。我問了一些其他的學生,他們也有同樣的答案。我也在線看,但我發現的所有例子都是交換函數,X = 1讓我感到困惑。Fortran通過引用通過值作業

SUBROUTINE TEST(X,Y,Z) 
    X=1 
    Z=X+Y 
    RETURN 
    END 


    N=2 
    CALL TEST (N,N,M) 

    WHAT WILL M BE IF PASSED BY REFERENCE? 
    WHAT WILL M BE IF PASSED BY VALUE-RESULT? 

我得到了第一個3和第二個問題4。

+0

此代碼本身非常接近可運行。您是否嘗試完成該程序並通過傳遞值和傳遞來運行它?默認情況下,所有變量都通過引用傳遞,但可以使用'value'屬性通過值傳遞參數。 –

+0

如果按值傳遞,m永遠不會被定義,所以你可能會得到零或一些垃圾。如果通過引用傳遞,因爲它將在fortran中,代碼實際上是非法的。我猜想x = 1最終將x和y分配給1,而你得到2,但真正的答案是「未定義」。 – agentp

+0

[This recent question](http://stackoverflow.com/q/20650284/2068635)可能會引起您的興趣。 – Stefan

回答

0

如果通過引用傳遞, X = 2,當子程序進入時Y = 2。 然後將X設置爲1,這也會將Y更改爲1,因爲它們共享相同的內存位置,對吧?所以這會使(X + Y)= 2 ==> Z = 2。
M = 2。

By value: X = 2,Y = 2,但是然後X將set設置爲1但不會改變Y,因爲這是值。這使Z = 3。
M = 3。

+0

只要編譯器知道別名,並從內存中重新加載Y分配。 –

+0

權利 - 有一些假設。 – ChileAddict

+0

編譯與gfortran,通過參考確實給我2。雖然我認爲Fortran從未意識到別名;這是其中的一個假設,使其變得快速,不是嗎? – Mark