Fortran中,在派生数据类型中使用参数和静态表

4
我希望创建一个派生的数据类型,其中包含一个表格和该表格的长度。理想情况下,我希望将其声明如下:
type mydata
    integer                :: ndata
    real, dimension(ndata) :: x
end type mydata

但是在开始时,ndata是未知的,因此x是一个动态表。

我是否需要对x使用allocatable,并在ndata已知时进行分配?

type mydata
    integer                         :: ndata
    real, dimension(:), allocatable :: x
end type mydata

....

type(mydata) :: var
var % ndata = 10
allocate(var % x(10))

什么是管理这些情况的最佳方法?
1个回答

6

解决你的问题最好的方法是使用最新的Fortran 2003兼容编译器,并使用“参数化派生类型”。如果我的记忆没有出错,目前只有Cray和IBM编译器支持此功能。它将允许您定义如下类型:

type mydata(sz)
    integer, len :: sz
    real, dimension(sz) :: x
end type mydata

这似乎正是你想要的。如果你没有这两个编译器,那么暂时只能使用你提出的解决方案。当然,你也可以把自己偏爱的解决方案打包成非默认类型构造器。
如果你无法使用参数化派生类型,我建议从以下类型定义开始:
type mydata
    real, dimension(:), allocatable :: x
  contains
    procedure :: setSize
    procedure :: getSize
end type mydata

并且以显而易见的方式定义这些类型限定过程。这将防止ndatax的大小变得不同。


我对Fortran中的OOP并不是很熟悉,也不理解你所说的“非默认类型构造函数”。你是指一个简单的子程序来填充结构体吗?然而,你最后的例子很优雅。将ndatax的长度绑定在一起是一个好主意,但我应该如何定义这些过程呢?它们只是与结构体在同一模块中的标准子程序吗? - Ger
看起来你对学习Fortran的面向对象编程(OOP)特性很有动力。Metcalf,Reid和Cohen的书对此有很好但简练的覆盖范围。类型(或结构)构造器(默认和非默认)共享类型名称,例如 object = mydata(2,[0.3,0.4]) ;你需要定义一个名为mydata的接口及实现该接口的例程。像其他过程一样定义 getSizesetSize ,并探索pass绑定属性。如果遇到问题,请进一步提问。 - High Performance Mark

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