2009-06-28 88 views
6

有人可以向我解釋解析器/編譯器中虛擬變量或屬性對應的抽象類型嗎?Fortran編譯器術語:虛擬變量和屬性

 PURE SUBROUTINE F(X, Y) 
     IMPLICIT NONE 
     REAL, INTENT(INOUT) :: X, Y, C 
C  REAL :: A, B 
C  REAL, SAVE :: C = 3.14E0 
     PARAMETER (C = 3.14E0, X = 32, Y = X) 
     X = Y + 2 * SIN(Y) 
     END 

[email protected]:~/lab/secret/tapenade$ gfortran -x f77 -c 1.f 
1.f:6.37: 

     PARAMETER (C = 3.14E0, X = 32, Y = X)       
            1 
Error: PARAMETER attribute conflicts with DUMMY attribute in 'x' at (1) 
1.f:3.38: 

     REAL, INTENT(INOUT) :: X, Y, C         
            1 
Error: Symbol at (1) is not a DUMMY variable 

[email protected]:~/lab/secret/tapenade$ ifort -c 1.f 
1.f(3): error #6451: A dummy argument name is required in this context. [C] 
     REAL, INTENT(INOUT) :: X, Y, C 
-------------------------------------^ 
1.f(6): error #6406: Conflicting attributes or multiple declaration of name. [X] 
     PARAMETER (C = 3.14E0, X = 32, Y = X) 
-------------------------------^ 
1.f(6): error #6406: Conflicting attributes or multiple declaration of name. [Y] 
     PARAMETER (C = 3.14E0, X = 32, Y = X) 
---------------------------------------^ 
1.f(6): error #6592: This symbol must be a defined parameter, an enumerator, or an argument of an inquiry function that evaluates to a compile-time constant. [X] 
     PARAMETER (C = 3.14E0, X = 32, Y = X) 
-------------------------------------------^ 
compilation aborted for 1.f (code 1) 

回答

9

的Fortran經過參考。虛擬屬性對應於傳遞給函數的變量(在您的案例中爲XY)。參數聲明期望靜態,但由於X是傳遞給函數的任何東西,它實際上沒有任何意義。參數語句是設置常量的一種方式 - 它與參數不涉及子程序。

當你的錯誤說C不是DUMMY變量,那麼,就意味着它不是在將被傳遞到輸入/輸出功能的變量的列表中找到C - 你的聲明只F(X, Y):無視線中有C。雖然您沒有明確使用DUMMY屬性,但您擁有INTENT(INOUT)屬性,這意味着這些變量對應於子例程輸入/輸出。

爲了得到你想要的,你將有一個子程序,看起來像什麼:

subroutine F(X, Y) 
    implicit none 

    ! These are the dummy variables 
    real, intent(inout) :: X, Y 

    ! These are the variables in the scope of this subroutine 
    real     :: a, b 
    real, parameter, save :: c = 3.14E0 

    X = Y + 2*sin(Y) 
end subroutine F 

我不完全知道你正在嘗試做的 - 你聲明pure子程序,這意味着一個沒有副作用的子程序,但是你正在使用intent(inout)作爲變量,這意味着XY可以在執行過程中被改變。

我想補充以及一個子程序內,初始化像REAL :: C = 3.14E0其聲明語句的變量產生與隱含save屬性的變量。但是,如果您希望通過呼叫保存呼叫,則可以通過明確添加save屬性來完成正確的操作,以清楚表明您正在執行的操作。

我不是解析器/編譯器的人,但我認爲要回答你的問題,dummy屬性意味着你只是得到一個指針 - 你不必分配任何空間,因爲使用的變量在函數調用中已經分配了空間。

3

該調用的實際問題由Tim Whitcomb很好地解釋。我會盡力更明確地解釋這些條款。

虛擬參數是一個Fortran特定術語。其他語言稱爲形式參數或類似的,即當過程被調用時,它是被稱爲XY(在你的情況下)並且女巫被關聯到實際參數的對象。

因此在:

subroutine s(i) 
    integer :: i 
end 

call s(1) 

i的是子程序s的僞參數而表達1是被傳入到該子程序到僞參數i實際參數。

屬性是指定數據對象或過程的附加屬性的一種形式。屬性可以使用語句中指定:

real c 
intent(in) c 
optional c 

,或者它們可以在一個聲明中規定:

real, intent(in), optional :: c 

這樣的僞參數c是一個默認的真實與屬性intent(in)optional

衝突屬性是無法同時爲一個對象指定的屬性。你的例子intent(...)parameter服務良好。這些是不相容的,因爲第一個意味着虛擬參數,而另一個指定,其命名爲常數