Fortran中能否在自定义类型内定义函数指针数组?
Fortran自定义类型中定义过程指针数组的实现方法
Fortran完全支持在自定义类型中定义过程指针数组,不管是固定长度还是可分配类型,问题通常出在写法不符合语法规范。以下是正确的实现方式:
1. 先定义抽象接口
过程指针必须匹配明确的接口签名,所以首先要定义抽象接口来规范函数的参数、返回值类型:
abstract interface ! 示例:输入实数返回实数的函数接口 function real_func(x) result(y) real, intent(in) :: x real :: y end function real_func end interface
2. 固定长度的过程指针数组
在自定义类型中直接声明固定长度的数组,元素类型为上述抽象接口的过程指针:
type :: species ! 固定长度为3的过程指针数组,nopass表示函数不需要访问类型实例 procedure(real_func), pointer, nopass :: func_arr(3) end type species
如果函数需要访问类型的成员变量,将nopass替换为pass(this),同时抽象接口要添加类型参数:
abstract interface function bound_func(this, x) result(y) class(species), intent(in) :: this real, intent(in) :: x real :: y end function bound_func end interface type :: species real :: param ! 类型成员变量 procedure(bound_func), pointer, pass(this) :: func_arr(2) end type species
3. 可分配的过程指针数组
只需在数组声明中添加allocatable关键字,即可定义动态长度的过程指针数组:
type :: species procedure(real_func), pointer, nopass, allocatable :: func_arr(:) end type species
使用时通过allocate分配长度:
type(species) :: my_spec allocate(my_spec%func_arr(5)) ! 分配长度为5的过程指针数组 ! 使用后记得释放 deallocate(my_spec%func_arr)
关键注意事项
- 过程指针的签名必须和抽象接口严格匹配,包括参数类型、个数、intent属性,以及返回值类型
- 可分配数组在使用前必须先分配内存,使用完毕后建议释放避免内存泄漏
pass/nopass的选择取决于函数是否需要访问自定义类型的成员变量
内容的提问来源于stack exchange,提问作者infinityalways1
相关产品推荐
相关产品推荐

