【问题标题】:Using assumed-rank Fortran array as derived type component使用假定秩 Fortran 数组作为派生类型组件
【发布时间】: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


【解决方案1】:

不可能有假定的等级派生类型组件。您需要找到另一种解决方案,例如 Vladimir 建议的解决方案。另一个想法,有点像 kluge,是存储数据的 C_LOC 和排名,调用构造适当 C 描述符的 C 例程,然后用假定的排名参数调用 Fortran 例程。

请记住,在 Fortran 中假设排名不能做很多事情 - SELECT RANK 直到 F2015 才存在。

【讨论】:

    猜你喜欢
    • 2014-10-18
    • 2013-08-13
    • 2023-03-13
    • 1970-01-01
    • 2017-04-25
    • 1970-01-01
    • 2012-10-23
    • 2019-03-02
    • 1970-01-01
    相关资源
    最近更新 更多