在Fortran中分配函数结果时不兼容的排名

时间:2017-10-22 22:26:36

标签: 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*, 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

1 个答案:

答案 0 :(得分:3)

MAXVAL是Fortran内部函数。由于您的主程序未将MaxVal声明为EXTERNAL,也没有明确的接口,因此编译器假定您正在使用内在函数。 (如果你声明它是EXTERNAL你还需要声明它是REAL * 8.而且我会迂腐并且建议你不要使用REAL * 8这样的扩展,当语言有标准方法来做这些事情。)

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