使用数组值函数作为另一个函数的参数
Use array valued function as argument to another function
我已将问题从更复杂的 f90 代码转换为以下内容:
module userfunctions
implicit none
contains
function Function1(Argument,ArgumentSize)
! Input
integer, intent(in) :: ArgumentSize
real,dimension(ArgumentSize),intent(in) :: Argument
! Output
real,dimension(ArgumentSize) :: Function1
! Local
integer :: i
Function1 = Argument
! Random operation on argument, resembling generic vector function
do i=1,ArgumentSize
Function1(i) = Function1(i)**2
end do
end function Function1
function Function2(RandomFunction,Argument,ArgumentSize)
! Input
integer, intent(in) :: ArgumentSize
real,dimension(ArgumentSize), intent(in) :: Argument
! Array-type function of dimension ArgumentSize
real,external :: RandomFunction
! Evaluate RandomFunction to
real,dimension(ArgumentSize) :: Value
! Output
real :: Function2
! assign evaluation of RandomFunction to Value
Value = RandomFunction(Argument,ArgumentSize)
Function2 = dot_product(Value,Value)
end function Function2
end module userfunctions
program Fortran_Console_002
use userfunctions
implicit none
real :: Result1
real,dimension(6) :: Vector1
Vector1 = 2
Result1 = Function2(Function1,Vector1,6)
write(*,*) Result1
end program Fortran_Console_002
结果应该是“96”。使用 Visual Studio 2013 和 Intel Fortran 编译它会产生以下错误:
Error 1 error #6634: The shape matching rules of actual arguments and
dummy arguments have been violated. [FUNCTION1]
在实际情况下,我确实需要将数组值函数从子例程传递到模块中定义的函数(非线性函数的求解器,将函数作为参数)。我确实知道如何为标量值函数执行此操作,但未能将其应用于数组。
为了方便,我使用 Visual Studio 2013。真正的作品必须在虚拟机上使用 Compaq Visual Fortran 6 进行编译,据我所知,虚拟机最多只能兼容 fortran90。
请参阅 了解一般规则。
不要在这里使用 external
。它与数组值函数等高级功能不兼容。通常,external
仅适用于 FORTRAN 77 风格的旧程序。制作一个界面块(参见 link)或尝试
procedure(Function1) :: RandomFunction
改为(Fortran 2003)。
我已将问题从更复杂的 f90 代码转换为以下内容:
module userfunctions
implicit none
contains
function Function1(Argument,ArgumentSize)
! Input
integer, intent(in) :: ArgumentSize
real,dimension(ArgumentSize),intent(in) :: Argument
! Output
real,dimension(ArgumentSize) :: Function1
! Local
integer :: i
Function1 = Argument
! Random operation on argument, resembling generic vector function
do i=1,ArgumentSize
Function1(i) = Function1(i)**2
end do
end function Function1
function Function2(RandomFunction,Argument,ArgumentSize)
! Input
integer, intent(in) :: ArgumentSize
real,dimension(ArgumentSize), intent(in) :: Argument
! Array-type function of dimension ArgumentSize
real,external :: RandomFunction
! Evaluate RandomFunction to
real,dimension(ArgumentSize) :: Value
! Output
real :: Function2
! assign evaluation of RandomFunction to Value
Value = RandomFunction(Argument,ArgumentSize)
Function2 = dot_product(Value,Value)
end function Function2
end module userfunctions
program Fortran_Console_002
use userfunctions
implicit none
real :: Result1
real,dimension(6) :: Vector1
Vector1 = 2
Result1 = Function2(Function1,Vector1,6)
write(*,*) Result1
end program Fortran_Console_002
结果应该是“96”。使用 Visual Studio 2013 和 Intel Fortran 编译它会产生以下错误:
Error 1 error #6634: The shape matching rules of actual arguments and dummy arguments have been violated. [FUNCTION1]
在实际情况下,我确实需要将数组值函数从子例程传递到模块中定义的函数(非线性函数的求解器,将函数作为参数)。我确实知道如何为标量值函数执行此操作,但未能将其应用于数组。
为了方便,我使用 Visual Studio 2013。真正的作品必须在虚拟机上使用 Compaq Visual Fortran 6 进行编译,据我所知,虚拟机最多只能兼容 fortran90。
请参阅
不要在这里使用 external
。它与数组值函数等高级功能不兼容。通常,external
仅适用于 FORTRAN 77 风格的旧程序。制作一个界面块(参见 link)或尝试
procedure(Function1) :: RandomFunction
改为(Fortran 2003)。