函数结果中的排名不匹配

Rank mismatch in function result

我正在学习用 Fortran 编程,并且正在编写一个基本程序。在其中,我试图从程序中的函数 return 一个数组,这导致了这个错误:Interface mismatch in global procedure 'test1' at (1): Rank mismatch in function result (0/1).

错误重建如下:

program Test
    implicit none
    integer :: a
    interface
        function test1(n) result (m)
            integer :: n
        end function test1
    end interface

    a = test1(4)

end program Test

function test1(n) result (m)
    implicit none
    integer :: n, m(2)
    m(1) = n**2
end function test1

错误发生在 function test1(n) result (m) 处的 interface 语句之后。

由于我是 Fortran 的新手,我想我错过了一些基本的东西,所以感谢任何帮助。

test1 的接口和实现有不匹配的参数,atest1 的结果不匹配。如果您将 a 声明为长度为 2 的数组,并将 m 的声明添加到您的 interface 也为长度为 2 的数组,则一切正常:

program Test
   implicit none
   integer :: a(2)
   interface
       function test1(n) result (m)
           integer :: n, m(2)
       end function test1
   end interface

   a = test1(4)
   write(*,*) a

end program Test

function test1(n) result (m)
   implicit none
   integer :: n, m(2)
   m(1) = n**2
end function test1

声明函数

在全局范围内声明函数并通过 interface 调用它们将导致大量额外的代码编写和维护。有两种更好的方法来声明函数;作为内部函数,或在模块中。

如果您正在编写一个简短的程序,您可以使用 contains 将您的函数直接放在您的程序中。这完全摆脱了对接口的需要:

program Test
   implicit none
   integer :: a(2)

   a = test1(4)
contains
   function test1(n) result (m)
      integer :: n, m(2)
      m(1) = n**2
   end function test1
end program Test

请注意,我从函数中删除了 implicit none,因为它现在继承自 Test

如果您的代码变得更大,您将希望在单独的模块中声明您的函数,如:

module test_module
   implicit none
contains
function test1(n) result (m)
   integer :: n, m(2)
   m(1) = n**2
end function test1
end module

program Test
   use test_module
   implicit none
   integer :: a(2)

   a = test1(4)
end program Test