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

标签 arrays fortran polymorphism

我正在寻找一些关于创建派生类型的最佳方法的一般建议,该派生类型存储具有任意等级的任意数据。

假设我有一个派生类型 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/

相关文章:

iphone - 数组对象的属性(Objective-c)

Java 乐透模拟

multithreading - 使用 openmp 和私有(private)子句的梯形规则集成

compiler-errors - Fortran - 无法从主机范围单元导入 `c_char`

Scala - 抽象类型和隐式参数解析

php - 用特定变量替换 php echo 输出

javascript - Javascript Map 函数是异步的吗?

c - 可见性、Fortran 公共(public)变量、共享库的运行时加载

delphi - 从抽象基类创建子类的最佳方法

c++ - C++ 和/或克隆模式中的多态就地重建