使用假定秩Fortran数组作为派生类型组件

3
我希望您能提供一些关于创建一个存储任意数据和任意阶数的派生类型的最佳方法的通用建议。
假设我有一个名为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]])

我建议为不同的等级设置单独的类型,并使用特定于每种类型的通用函数,或者 - 如果您的编译器支持 - 使用等级类型参数对类型进行参数化。 - Vladimir F Героям слава
你在构建变量之后打算用它们做什么? - IanH
我正在使用它们来从函数中返回以及错误消息:type(Result) 还有一个 error 组件,这里没有显示,是另一个派生类型 type(ErrorInstance),因此每个函数都返回数据和可能的错误。数据本身的最终用途将是多种多样的,例如可能会传递给其他函数、打印在某个地方等等。我决定采用 Vladimir 的建议,使用单独的类型,尽管这显然有一个限制,即只能处理有限的维度。 - Sam Harrison
1个回答

2
无法使用假定等级派生类型组件。您需要找到另一个解决方案,例如Vladimir建议的方法。另一个想法是将数据的C_LOC和等级存储起来,调用一个C例程构造一个适当的C描述符,然后再调用一个带有假定等级参数的Fortran例程,这种方法有点笨拙。
请记住,在Fortran中,您无法对假定等级进行太多操作 - 直到F2015才存在SELECT RANK。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接