【发布时间】:2013-02-26 21:59:42
【问题描述】:
也许这是一个非常愚蠢的问题,人们真的应该这样做,但是: 有没有可能有类似的东西
type food
INTEGER :: NBananasLeft(NBananaTypes)
INTEGER :: NApplesLeft(NAppleTypes)
end type food
NBananaTypes 和 NAppleTypes 在编译时是未知的?
【问题讨论】:
也许这是一个非常愚蠢的问题,人们真的应该这样做,但是: 有没有可能有类似的东西
type food
INTEGER :: NBananasLeft(NBananaTypes)
INTEGER :: NApplesLeft(NAppleTypes)
end type food
NBananaTypes 和 NAppleTypes 在编译时是未知的?
【问题讨论】:
在 Fortran 90-95 中:
type food
INTEGER,pointer :: NBananasLeft(:)
INTEGER,pointer :: NApplesLeft(:)
end type food
您必须使用allocate(var%NBananasLeft(NBananaTypes))) 自己分配数组。
在 Fortran 2003 中:
type food
INTEGER,allocatable :: NBananasLeft(:)
INTEGER,allocatable :: NApplesLeft(:)
end type food
您还必须使用allocate(var%NBananasLeft(NBananaTypes))) 自己分配数组,但要避免内存泄漏的可能性。
在 Fortran 2003 中通过参数化数据类型(只有少数编译器支持):
type food(NBananaTypes,NAppleTypes)
integer,len :: NBananaTypes,NAppleTypes
INTEGER :: NBananasLeft(NBananaTypes)
INTEGER :: NApplesLeft(NAppleTypes)
end type food
【讨论】:
interface food 来连接任意数量的与您的派生类型同名的此类函数。这允许以bar = food(NBananaTypes, NAppleTypes) 或您指定的任何其他签名透明地创建对象。