亲爱的Fortran程序员,
是否有人知道,是否可以在Fortran 2003或更高版本中声明一个常量(参数)过程指针数组?
如下所示,我有一个切换器功能,它根据传入的整数参数调用不同的函数。它使用一组过程指针(包含在派生中)类型。在使用之前,必须在运行时期间通过init()
例程初始化此数组。有没有办法,在编译期间初始化这个数组并避免这种初始化例程的必要性?它也可以定义为parameter
,因为它的值在运行期间不会改变。
module testmod
implicit none
interface
function funcInterface() result(res)
integer :: res
end function funcInterface
end interface
type :: ptrWrap
procedure(funcInterface), nopass, pointer :: ptr
end type ptrWrap
type(ptrWrap) :: switcher(2)
contains
subroutine init()
switcher(1)%ptr => func1
switcher(2)%ptr => func2
end subroutine init
function callFunc(ii) result(res)
integer, intent(in) :: ii
integer :: res
res = switcher(ii)%ptr()
end function callFunc
function func1() result(res)
integer :: res
res = 1
end function func1
function func2() result(res)
integer :: res
res = 2
end function func2
end module testmod
program test
use testmod
implicit none
call init() ! I'd like to get rid of this call.
print *, callFunc(1)
print *, callFunc(2)
end program test
答案 0 :(得分:2)
我不认为这是允许的。从我对2008标准parameter
的读取是data object
的属性,数据对象的类不包括过程或过程指针。
当您为代码提供代码时,您的编译器会告诉您什么?
答案 1 :(得分:2)
Fortran 2008允许将过程指针和过程指针组件初始化到过程目标(而不是NULL()
)。语法与其他初始化器一致。
! In the scope of the module.
...
type(ptrWrap), parameter :: switcher(2) = [ptrWrap(func1), ptrWrap(func2)]
...