【发布时间】:2017-06-15 10:15:17
【问题描述】:
我正在寻找一些关于创建存储具有任意等级的任意数据的派生类型的最佳方法的一般建议。
假设我有一个派生类型 Result 和一个 data 组件(等等):
type, public :: Result
private
class(*), allocatable :: data
...
end type
由某个过程初始化(从接口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 中是可能的?这相当于在 PHP 中使用 serialize() 和 unserialize() 函数。如果有人对类似方法有任何指导,我将不胜感激。
最终我希望能够做这样的事情:
type(Result) :: scalarResult
type(Result) :: 2DResult
scalarResult = Result(data=1.234)
2DResult = Result(data=[[1,2,3],[4,5,6]])
【问题讨论】:
-
我建议为不同的等级和泛型函数设置不同的类型,并为每种类型提供细节,或者 - 如果您的编译器支持它 - 使用等级类型参数对类型进行参数化。
-
构建变量后,你打算如何处理它们?
-
我正在使用它们从函数返回以及错误消息:
type(Result)还有一个error组件,此处未显示,这是另一个派生类型type(ErrorInstance),因此每个函数都返回数据并可能返回错误。数据本身的最终用途会有所不同,例如它可能会被传递给其他函数,打印在某处等。我决定接受 Vladimir 的建议,即拥有单独的类型,尽管这有明显的局限性,即只能处理有限的维度。
标签: arrays fortran polymorphism