Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran 基于元素类型写入数组元素_Fortran_Function Pointers_Overloading_Derived Types - Fatal编程技术网

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)

我想实现的最好的解释是通过一个例子。在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)
   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形式存储在另一个数组中)写入单个条目。很好用!无论如何,谢谢你的回答。