我想创建一个派生数据类型,其中包含一个表和这个表的长度。理想情况下,我想将其声明如下
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))管理此类案例的最佳方法是什么?
发布于 2013-11-06 19:16:27
解决问题的最佳方法是使用最新的兼容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并在显而易见的(?)中定义这些类型绑定过程道路。这将防止ndata和x的大小不同。
https://stackoverflow.com/questions/19810506
复制相似问题