Function 具有假定形状伪参数的过程必须具有显式接口
我是Fortran 90的新手,我正在尝试理解如何将数组传递给函数。我在网上查了一下,找不到任何足够清晰和简单的例子,所以我决定在这里发帖 我希望函数能够处理任意长度的数组(数组的长度不应该是函数的参数之一) 我尝试编写一个简单的函数示例,该函数返回数组元素的总和:Function 具有假定形状伪参数的过程必须具有显式接口,function,fortran,fortran90,Function,Fortran,Fortran90,我是Fortran 90的新手,我正在尝试理解如何将数组传递给函数。我在网上查了一下,找不到任何足够清晰和简单的例子,所以我决定在这里发帖 我希望函数能够处理任意长度的数组(数组的长度不应该是函数的参数之一) 我尝试编写一个简单的函数示例,该函数返回数组元素的总和: function mysum(arr) implicit none real, dimension(:), intent(in) :: arr real :: mysum integer :: i,a
function mysum(arr)
implicit none
real, dimension(:), intent(in) :: arr
real :: mysum
integer :: i,arrsize
arrsize = size(arr)
mysum=0.0
do i=1,arrsize
mysum=mysum+arr(i)
enddo
end function mysum
program test
implicit none
real, dimension(4) :: a
real :: mysum,a_sum
call random_number(a)
print *,a
a_sum=mysum(a)
print *,a_sum
end program
当我尝试编译时,出现以下错误:
array_test.f90:17.14:
real mysum,a_sum
1
Error: Procedure 'mysum' at (1) with assumed-shape dummy argument 'arr' must have an explicit interface
我的程序有什么问题?假定的形状伪参数(那些具有
(:)
)的参数)需要在调用站点提供过程的显式接口。这意味着调用代码必须知道子例程头的确切外观。另见
该显式接口可以通过多种方式提供
一,。
首选-模块程序
module procedures
implicit none
contains
function mysum(arr)
real, dimension(:), intent(in) :: arr
real :: mysum
integer :: i,arrsize
arrsize = size(arr)
mysum=0.0
do i=1,arrsize
mysum=mysum+arr(i)
enddo
end function mysum
end module
program test
use procedures
implicit none
!no mysum declared here, it comes from the module
...
end program
二,。
内部过程-仅适用于简短的简单过程,或者该过程需要访问主机变量时。由于可以访问主机变量,因此很容易出错
program test
implicit none
!no a_sum declared here, it is visible below contains
...
contains
function mysum(arr)
!implicit none inherited from the program
real, dimension(:), intent(in) :: arr
real :: mysum
integer :: i,arrsize
arrsize = size(arr)
mysum=0.0
do i=1,arrsize
mysum=mysum+arr(i)
enddo
end function mysum
end program
三,。
接口块-完全不推荐使用,您应该有特定的理由使用它
function mysum(arr)
! removed to save space
end function mysum
program test
implicit none
interface
function mysum(arr)
real, dimension(:), intent(in) :: arr
real :: mysum
end function
end interface
!no mysum declared there
!it is declared in the interface block
...
end program
请使用标签,Fortran 90只是一个旧版本。我现在可以结束你的问题了……这里已经讨论过好几次了。该过程必须位于模块或内部,或者必须在调用站点提供接口块。模块是首选。如果你想编写现代风格的Fortran,所有的程序都应该在一个模块内。@VladimirF好的,我会检查这些模块(和接口)。我阅读了您指出的问题,认为可能是重复的,但不幸的是,我目前的Fortran水平太低,无法理解如何准确地使用模块和接口的概念来解决我的问题。好的,让我们对这个确切的错误消息作一个简单的回答。非常感谢,第一种方法(模块)完美地解决了我的问题,帮助我更好地理解模块和接口的概念。更具体地说,如果有人想尝试这个例子,为了使它起作用,我必须在“程序”中用“real::a_sum”替换“real::mysum,a_sum”。是的,必须删除它。此外,还必须删除任何
外部
。我忘了检查它(子程序不一定要在那里)。