2017-04-07 51 views
0

編譯簡單Fortran程序時,我有一個簡單的Fortran 95程序「PROCEDURE屬性與INTENT屬性衝突」與模塊

include "sandboxlib.f95" 
program sandbox 
    implicit none 
    write(*, *) 'abc' 
end program 

和含有功能

module sandboxlib 

integer, parameter :: dp = kind(1.d0) 

contains 
function cumsum(mat, m, n) result(c) 
    implicit none 
    real(dp), intent(in) :: mat 
    integer, intent(in) :: m, n 
    integer i, j 
    real(dp), dimension(m, n) :: c 

    c(:, 1) = 0.d0 

    do i = 2, m 
     do j = 1, n 
      c(i, j) = c(i-1, j) + mat(i, j) 
     end do 
    end do 
end function 
end module 

我編譯sandbox.f95與單模此命令

/usr/bin/gfortran -O -std=gnu -Wfatal-errors -pedantic -Wall sandbox.f95 -o sandbox 

其中導致此錯誤

sandboxlib.f95:6.23: 
    Included at sandbox.f95:1: 

    function cumsum(mat, m, n) 
         1 
Error: PROCEDURE attribute conflicts with INTENT attribute in 'mat' at (1) 

我環顧四周,發現一個fewquestions是討論的模塊,功能等,或者類似這樣的錯誤,但我不明白,爲什麼這不會編譯。

回答

5

mat聲明標

real(dp), intent(in) :: mat 

,但你把它作爲一個數組

c(i, j) = c(i-1, j) + mat(i, j) 

和編譯器解析這個是一個函數調用,並假定mat()是一個函數。功能不能有intent

我認爲正確的做法是在聲明中創建mat數組。類似於mat(:,:)mat(m,n)。 與前者相比,您可以避免將mn作爲參數傳遞。

+0

啊,謝謝你的幫助。 'mat(m,n)'修復錯誤。但是,如果我使用'mat(:, :))',因此不會傳入'm'和'n',我仍然需要計算函數內的維數,對?否則'do'循環將不起作用? –

+0

@MichaelA你是對的,你必須。檢查'size()'和'lbound()'和'ubound()'。有時候這些大小可能是全局(模塊)變量,在這種情況下分享它是有意義的。 –