我正在寻找一些关于创建派生类型的最佳方法的一般建议,该派生类型存储具有任意等级的任意数据。
假设我有一个派生类型 Result
和一个 data
组件(以及其他组件):
type, public :: Result
private
class(*), allocatable :: data
...
end type
由一些过程初始化(从接口(interface) Result
调用):
function init(data) result(this)
type(Result) :: this
class(*), intent(in) :: data
allocate(this%data, source=data)
end function
这适用于标量数据,但我不确定如何为任意等级数据设置它。我知道程序可以接受假设秩参数,所以 init(data)
函数中的 data
可以是 data(..)
,但我我不确定是否可以将派生类型属性 this%data
指定为假定等级?
我想到的另一种方法是将任意排名数据存储为标量,如果这样的事情在 Fortran 中可行的话?这相当于使用 serialize()
和 PHP 中的 unserialize()
函数。如果有人对类似方法有任何指导,我将不胜感激。
最终我希望能够做这样的事情:
type(Result) :: scalarResult
type(Result) :: 2DResult
scalarResult = Result(data=1.234)
2DResult = Result(data=[[1,2,3],[4,5,6]])
最佳答案
不可能有假定的排名派生类型组件。您需要找到其他解决方案,例如 Vladimir 建议的解决方案。另一个想法,有点像 kluge,是存储数据的 C_LOC 和等级,调出构造适当 C 描述符的 C 例程,然后使用假定等级参数回调 Fortran 例程。
请记住,您不能对 Fortran 中的假定等级做很多事情 - SELECT RANK 直到 F2015 才存在。
关于arrays - 使用假定秩 Fortran 数组作为派生类型组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44564872/