gpt4 book ai didi

fortran - 将泛型过程作为实际参数传递给函数

转载 作者:行者123 更新时间:2023-12-04 07:18:38 24 4
gpt4 key购买 nike

我正在尝试将通用过程作为实际参数传递给函数:

module mymod
implicit none

interface func
module procedure :: func1
module procedure :: func2
endinterface func

contains

real function func1(x)
real,intent(in) :: x
func1 = 2*x
endfunction func1

real function func2(x,y)
real,intent(in) :: x
real,intent(in) :: y
func2 = 2*x + 3*y
endfunction func2

real function func3(func,x,y)
interface
real function func(x,y)
real,intent(in) :: x
real,intent(in) :: y
endfunction func
endinterface
real,intent(in) :: x
real,intent(in) :: y
func3 = func(x,y)
endfunction func3

endmodule mymod

program myprogram
use mymod
implicit none
write(*,*)func3(func,2.,3.)
endprogram myprogram

gfortran 6.2.0 指出我不能这样做:
test.f90:43:16:

write(*,*)func3(func,2.,3.)
1
Error: GENERIC procedure ‘func’ is not allowed as an actual argument at (1)

同样,对于 ifort 17:
test.f90(39): error #8164: A generic interface name shall not be used as an actual argument.   [FUNC]
write(*,*)func3(func,2.,3.)
----------------^
test.f90(39): error #6637: When a dummy argument is a function, the corresponding actual argument must also be a function. [FUNC]
write(*,*)func3(func,2.,3.)
----------------^
compilation aborted for test.f90 (code 1)

我正在阅读有关通用接口(interface)的 2008 标准部分,但找不到这样的限制。我也想不出编译器无法在编译时解析通用接口(interface)的原因。我的直觉告诉我这应该是可行的,但我可能没有正确的方法。您知道执行此操作的符合标准的方法吗?

最佳答案

不,这是不允许的。实际上,您甚至不能将通用 INTRINSIC 函数作为伪参数传递。

一种符合标准的方式是直接使用正确的特定功能。使用 INTRINSIC 函数,当特定的没有标准名称时,您有时必须为正确的类型编写包装器。

例如:

  call integrate(derf,0.,1.)

contains
function derf(x)
real(dbl) :: derf
real(dbl), intent(in) :: x
derf = erf(x)
end function
end

如果您想传递 erf() 的 double 实数(或任何其他)版本,则这是必需的因为没有可用的特定功能。

关于fortran - 将泛型过程作为实际参数传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39643775/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com