Fortran,派生数据类型中的参数和静态表

Ger*_*Ger 4 fortran derived-types

我想创建一个派生数据类型,其中包含一个表和该表的长度.理想情况下,我想声明如下

type mydata
    integer                :: ndata
    real, dimension(ndata) :: x
end type mydata
Run Code Online (Sandbox Code Playgroud)

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

我必须使用allocatablex并在知道ndata时分配它吗?

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

....

type(mydata) :: var
var % ndata = 10
allocate(var % x(10))
Run Code Online (Sandbox Code Playgroud)

管理此类案件的最佳方法是什么?

Hig*_*ark 6

解决问题的最佳方法是使用最新的Fortran 2003兼容编译器并使用参数化派生类型.如果内存对我很有帮助,那么只有Cray和IBM编译器目前支持此功能.它允许您定义这样的类型

type mydata(sz)
    integer, len :: sz
    real, dimension(sz) :: x
end type mydata
Run Code Online (Sandbox Code Playgroud)

这似乎正是你想要的.如果您没有这些编译器中的任何一个,那么解决方法(例如您建议的那个)将暂时满足您的需求.当然,您可以将首选的变通方法捆绑到非默认类型构造函数中.

如果您没有参数化派生类型而陷入困境,那么我将从这样的类型定义开始:

type mydata
    real, dimension(:), allocatable :: x
  contains
    procedure :: setSize
    procedure :: getSize
end type mydata
Run Code Online (Sandbox Code Playgroud)

并以明显的(?)方式定义那些类型绑定的过程.这将防止ndatax变得不同的大小.