2017-04-07 46 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()'。有时候这些大小可能是全局(模块)变量,在这种情况下分享它是有意义的。 –