使用模块

时间:2017-04-07 13:44:58

标签: fortran gfortran fortran90

我有一个简单的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或者这样的错误,但我无法弄清楚为什么这不会编译。

1 个答案:

答案 0 :(得分:6)

您的mat被声明为标量

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

但你将它用作数组

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

并且编译器将其解析为函数调用,并假设mat()是函数。功能不能有intent

我认为正确的做法是在声明中使mat成为一个数组。类似于mat(:,:)mat(m,n)的内容。 使用前者,您可以避免将mn作为参数传递。