"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)
使用前者可以避免将 m
和 n
作为参数传递。
我有一个简单的 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)
使用前者可以避免将 m
和 n
作为参数传递。