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

标签 fortran derived-types

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

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

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

我必须使用 allocatable为 x 并在 ndata 已知时分配它?
type mydata
    integer                         :: ndata
    real, dimension(:), allocatable :: x
end type mydata

....

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

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

最佳答案

解决问题的最佳方法是使用最新的 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

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

关于派生数据类型中的 Fortran、参数和静态表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19810506/

相关文章:

派生类型的构造函数

oop - 多态父派生类型

python - 如何在 Fortran 派生类型或类中实现类型绑定(bind)写入语句输出

fortran - 如何将 Fortran c_ptr 与 null 进行比较

c# - 在 C# 中实现此 Fortran 片段的最佳方法是什么

module - Fortran 模块版本 fatal error

arrays - 定义派生类型数组

filter - 在 Fortran 中是否可以确定两个多态对象是否是相同的派生类型?

Fortran 子例程/函数参数名称和声明

fortran - 在 Fortran 中没有提升数组的标量参数