"PROCEDURE attribute conflicts with INTENT attribute" 用模块编译简单的 Fortran 程序时

"PROCEDURE attribute conflicts with INTENT attribute" when compiling simple Fortran program with module

我有一个简单的 Fortran 95 程序

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)

我环顾四周,发现 few questions 讨论了模块、函数等或类似这样的错误,但我不明白为什么它无法编译。

您的 mat 被声明为标量

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

但你把它当作数组使用

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

并且编译器将其解析为函数调用并假定 mat() 是一个函数。函数不能有 intent.

我认为正确的做法是在声明中使 mat 成为一个数组。像

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

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

使用前者可以避免将 mn 作为参数传递。