2015-01-07 46 views
4

作爲新的Fortran 90自由格式的,我真的想知道爲什麼下面的代碼片段的一塊是行不通的:Fortran數組不能在函數返回:不爲虛擬變量

program test2 
    implicit none 
    !!! A program to practice f90 writing. 
    ! Define double precision data 
    integer, parameter :: dp = kind(1.d0) 
    real(dp) :: a(3), b(3) 
    integer :: i 
    a = (/(i, i=1, 3)/) 
    b = (/(i, i=1, 3)/) 
    write (*, *) m31tensorprod(a, b) 

contains 
    function m31tensorprod(a, b) 
     real(dp), dimension(3), intent(in) :: a, b 
     real(dp), intent(out) :: m31tensorprod(3, 3) 
     integer :: k1, k2 
     forall(k1=1:3, k2=1:3) 
      m31tensorprod(k1, k2) = a(k1) * b(k2) 
     end forall 
     return 
    end function m31tensorprod 
end program test2 

當我嘗試通過gfortran test2.f90編譯此,它說:

test2.f90:13.4:

function m31tensorprod(a, b) 
1 Error: Symbol at (1) is not a DUMMY variable 

我以爲m31tensorprod是內部函數,不需要聲明。我在哪裏做錯了?

感謝,

+1

之間的意思,意圖(out)不適合結果。有關更多(其他)細節,請參閱http://stackoverflow.com/q/24170024/3157076。 – francescalus

+0

@francescalus感謝您的回覆!我去參考的問題。這是否意味着:對於變量'function_name',它在內存中沒有分配地址,因此它不是指向輸出地址的虛擬變量。因此,「intent(out)」將是非法的。是對的嗎? –

+0

「虛擬」只是表示函數的參數。在這種情況下,'a'和'b' _在功能。意圖只能爲虛擬變量指定。 – francescalus

回答

6

你是正確m31tensorprod爲內部功能意味着您不必聲明它的主程序。用行話說:它有一個明確的界面。

但是,這不是你的代碼的問題。功能定義本身出了什麼問題。 [誠然編譯消息不是太大的幫助。]

功能子程序

function m31tensorprod(a, b) 

的定義定義了與結果變量m31tensorprod的功能。這個結果變量需要你的聲明

real(dp), intent(out) :: m31tensorprod(3, 3) 

這是這個聲明是不正確的。您可以聲明類型(real(dp))和尺寸((3,3)),但intent(out)是錯誤的。

intent屬性,在Fortran standard的話,是受約束(C538)

的意圖屬性應爲僞數據對象或虛設過程指針的實體。

回到編譯器消息,m31tensorprod不是一個虛擬變量。在這種情況下,虛擬參數是ab。一般來說,虛擬參數是(),