Fortran中函数赋值中的不兼容列组导致

Fortran中函数赋值中的不兼容列组导致,fortran,gfortran,fortran90,Fortran,Gfortran,Fortran90,我想创建一个函数,返回矩阵中的最大绝对值,但编译器返回此错误 mv = maxVal(a, n) 1 Error: Incompatible ranks 0 and 1 in assignment at (1) 这是我的Fortran代码 real*8, dimension(:, :), allocatable :: a integer :: n real*8 :: mv read*, n allocate(a(n, n)) read*,

我想创建一个函数,返回矩阵中的最大绝对值,但编译器返回此错误

 mv = maxVal(a, n)
 1
Error: Incompatible ranks 0 and 1 in assignment at (1)
这是我的Fortran代码

    real*8, dimension(:, :), allocatable :: a
    integer :: n
    real*8 :: mv

    read*, n
    allocate(a(n, n))
    read*, a

    mv = maxVal(a, n)
end

real*8 function maxVal(a, n)
       integer :: n
       integer :: i, j, max
       integer, dimension(2) :: index
       real*8, dimension(n, n) :: a
       max = abs(a(1, 1))
       index = (/1, 1/)
       do i = 1, size(a)
          do j = 1, size(a, 1)
             if (abs(a(i, j)) .gt. max) then
                max = abs(a(i, j))
                index = (/i, j/)
             endif
          end do
       end do
       maxVal = a(index(1), index(2))
       return
end

MAXVAL是一个Fortran内部函数。由于主程序没有将MaxVal声明为外部,也没有显式接口,因此编译器假定您使用的是内部。(如果您将其声明为外部,您还需要将其声明为REAL*8。我会很迂腐,建议您不要使用REAL*8之类的扩展,因为该语言有标准的方法来执行这些操作。)


MAXVAL,当提供DIM参数(第二个参数)时,如果第一个参数的秩大于1,则始终返回一个数组-这就是为什么编译器会抱怨,因为无法将数组分配给标量。

这是它的副本,在这种情况下,编译器似乎可以提供更详细的错误消息。“警告用户定义的符号名称与内在冲突”大多数Fortran编译器不会发出这样的警告,因为这样做是bog标准Fortran,在许多应用程序中会触发不必要的警告。在许多情况下,如果参数与内在期望值不匹配,编译器会抱怨,但在这里它们确实匹配。真正的答案是使用模块或内部过程,以便显式接口可用,而不是依赖隐式接口。感谢您提供错误消息。请下次使用该功能,以避免出现已关闭的投票问题。如果你有更多的,它可以导致一项禁令。看看我是如何编辑这个问题,使它更容易阅读和更直接。您不必在StackOverflow中使用

。我建议您了解模块和内部函数。它们对Fortran 90及更高版本非常重要,将帮助您诊断其中一些错误。