函数结果中的排名不匹配
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
的接口和实现有不匹配的参数,a
与 test1
的结果不匹配。如果您将 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
我正在学习用 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
的接口和实现有不匹配的参数,a
与 test1
的结果不匹配。如果您将 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