Fortran 基于元素类型写入数组元素
我想实现的最好的解释是通过一个例子。在Fortran中,我有一个Fortran 基于元素类型写入数组元素,fortran,function-pointers,overloading,derived-types,Fortran,Function Pointers,Overloading,Derived Types,我想实现的最好的解释是通过一个例子。在Fortran中,我有一个a类型的数组mixed,它包含一个函数指针、一个整数变量和一个实变量 type mixed procedure(), pointer, nopass :: f_ptr integer :: vi real :: vr end type type(mixed), dimension(10) :: a 指针f_ptr应该指向一个重载函数,该函数要么返回整数vi,要么返回实数vr function f_i(i)
a
类型的数组mixed
,它包含一个函数指针、一个整数变量和一个实变量
type mixed
procedure(), pointer, nopass :: f_ptr
integer :: vi
real :: vr
end type
type(mixed), dimension(10) :: a
指针f_ptr
应该指向一个重载函数,该函数要么返回整数vi
,要么返回实数vr
function f_i(i)
implicit none
integer, intent(in) :: i
integer :: f_i
f_i = a(i)%vi
return
end function
function f_r(i)
implicit none
integer, intent(in) :: i
real :: f_r
f_r = a(i)%vr
return
end function
例如,该数组由
a(1)%vi = 2
a(1)%f_ptr => f_i
a(2)%vr = 3.14
a(2)%f_ptr => f_r
...
a(10)%vr = 42
a(10)%f_ptr => f_r
在一个可变数量元素的循环中,然后我想通过f_ptr
指向的函数将数组元素vi
或vr
写入一个未格式化的文件
n = 2
write(lununf) (a(j)%f_ptr, j=1,n)
(可读形式)输出应为
2 3.14
我试图实现这一点,但找不到解决方案。可以通过某种方式实现吗?当您尝试实现此功能时,出现了什么问题?当然,对函数的引用应该类似于
a(j)%f_pt(arg)
“指针f_ptr应该指向重载函数”指针不能指向泛型函数。但是你没有显示任何重载。您将显示一个指针指向两个不兼容的函数。这也不好。你必须改变你的方法。令人困惑的是,编译器允许您执行a(10)%f_ptr=>f_r
,但这是非法的<代码>过程()表示一个子例程。你不能把函数放在那里。我不确定您想用该数据结构做什么,因此我不可能为您提供正确的选择。可能是包含类(*)
数据项的派生类型数组?或者只是一个简单的标志,告诉我们实数或整数是否有效?这两种方法都是可能的,这取决于你的使用情况,但你没有显示。经过一番思考,我设法解决了这个问题:-)最后,手头的问题是使用数组索引上的循环将可变长度的未格式化数据写入文件。我打开了一个未格式化的流,确定要写入循环的字节数,并根据变量类型(以int形式存储在另一个数组中)写入单个条目。很好用!无论如何,谢谢你的回答。