具有假定形状伪参数的过程必须具有显式接口
Procedure with assumed-shape dummy argument must have an explicit interface
我是 Fortran 90 的新手,我想了解如何将数组传递给函数。我在网上看了看,找不到任何足够清晰和简单的例子,所以我决定在这里post。
我希望该函数能够处理 任意长度的数组(数组的长度不应是函数的参数之一)。
我尝试编写一个简单的函数示例,该函数 returns 数组元素的总和:
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
我的程序有什么问题?
假定形状虚拟参数(带有 (:)
的参数)需要 显式接口 才能在调用站点上使用该过程。这意味着调用代码必须知道子例程 header 到底是什么样子。另见 Module calling an external procedure with implicit interface
可以通过多种方式提供显式接口
1。
首选 - 模块程序
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
2。
内部过程 - 仅适用于简短的简单过程或者如果过程需要访问主机的变量。由于访问主机变量,它是 error-prone.
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
3。
接口块 - 完全不推荐,你应该有一些特殊的理由使用它
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 的新手,我想了解如何将数组传递给函数。我在网上看了看,找不到任何足够清晰和简单的例子,所以我决定在这里post。
我希望该函数能够处理 任意长度的数组(数组的长度不应是函数的参数之一)。
我尝试编写一个简单的函数示例,该函数 returns 数组元素的总和:
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
我的程序有什么问题?
假定形状虚拟参数(带有 (:)
的参数)需要 显式接口 才能在调用站点上使用该过程。这意味着调用代码必须知道子例程 header 到底是什么样子。另见 Module calling an external procedure with implicit interface
可以通过多种方式提供显式接口
1。 首选 - 模块程序
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
2。 内部过程 - 仅适用于简短的简单过程或者如果过程需要访问主机的变量。由于访问主机变量,它是 error-prone.
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
3。 接口块 - 完全不推荐,你应该有一些特殊的理由使用它
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