gpt4 book ai didi

arrays - Fortran 中的函数指针数组

转载 作者:行者123 更新时间:2023-12-04 01:53:11 25 4
gpt4 key购买 nike

我可以在 Fortran 90 中创建函数指针,代码如下

real, external :: f

然后使用 f作为另一个函数/子程序的参数。但是如果我想要一个函数指针数组呢?在 C 我只会做
double (*f[])(int);

创建一个返回 double 并采用整数参数的函数数组。我试过最明显的,
real, external, dimension(3) :: f

但 gfortran 不允许我混合 EXTERNAL 和 DIMENSION。有什么办法可以做我想做的事吗? (这里的上下文是一个求解微分方程组的程序,所以我可以输入方程,而我的子程序中没有一百万个参数。)

最佳答案

声明“real, external::f”并没有真正把“f”变成一个完整的指针,因为你不能改变它指向的过程——它确实允许你把这个单一的函数传递给另一个例程。,所以您还需要“指针”属性。 Metcalf、Reid 和 Cohen 在“Fortran 95/2003 解释”的第 267 页上有示例——谷歌搜索“fortran 过程指针”将显示此页面。一个接近您的简单示例是“真实的、外部的、指针::f_ptr”。或者:“过程(f),指针:: f_ptr”。这是 Fortran 2003 的一个特性 -- http://gcc.gnu.org/wiki/Fortran2003http://gcc.gnu.org/wiki/ProcedurePointers列出了 gfortran 的部分支持,最好是 4.5。我不确定是否直接允许“维度”,但是您可以将过程分配给指针,这提供了很大的灵活性。您还可以将指针放入派生类型,该派生类型可以制成数组。

编辑:这是一个适用于 gfortran 4.5 的代码示例:
编辑 2:根据下面的评论注释掉的行。

module ExampleFuncs

implicit none

contains

function f1 (x)
real :: f1
real, intent (in) :: x

f1 = 2.0 * x

return
end function f1


function f2 (x)
real :: f2
real, intent (in) :: x

f2 = 3.0 * x**2

return
end function f2


function fancy (func, x)

real :: fancy
real, intent (in) :: x

interface AFunc
function func (y)
real :: func
real, intent (in) ::y
end function func
end interface AFunc

fancy = func (x) + 3.3 * x

end function fancy

end module ExampleFuncs

program test_proc_ptr

use ExampleFuncs

implicit none

! REMOVE: pointer :: func
interface
function func (z)
real :: func
real, intent (in) :: z
end function func
end interface

procedure (func), pointer :: f_ptr => null ()

type Contains_f_ptr
procedure (func), pointer, nopass :: my_f_ptr
end type Contains_f_ptr

type (Contains_f_ptr), dimension (2) :: NewType


f_ptr => f1
write (*, *) f_ptr (2.0)
write (*, *) fancy (f_ptr, 2.0)

f_ptr => f2
write (*, *) f_ptr (2.0)
write (*, *) fancy (f_ptr, 2.0)

NewType(1) % my_f_ptr => f1
NewType(2) % my_f_ptr => f2

write (*, *) NewType(1) % my_f_ptr (3.0), NewType(2) % my_f_ptr (3.0)

stop

end program test_proc_ptr

关于arrays - Fortran 中的函数指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2521072/

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