Fortran:类型中大小未知的数组

4
也许这是一个非常愚蠢的问题,也许我们应该用不同的方式解决,但是:是否有可能有类似于这样的内容?
type food
 INTEGER :: NBananasLeft(NBananaTypes)
 INTEGER :: NApplesLeft(NAppleTypes)
end type food

在编译时不知道NBananaTypes和NAppleTypes的情况下,怎样处理?

1个回答

4

在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

我是否正确理解,我需要编写一个函数,例如:type(food) makeFood(NBananaTypes, NAppleTpyes, NBananasLeft, NApplesLeft),在其中分配makeFood%NapplesLeft和makeFood%NBananasLeft,然后说makeFood%NapplesLeft = NApplesLeft,.. - user1638145
更或少是的。您还可以使用Fortran 2003自动重新分配的内在构造函数(我相信它应该可以工作,但如果不正确,请纠正我)。 - Vladimir F Героям слава
如果您同意这个答案,可以(并且可能应该)点击左侧的绿色勾选来接受它。这也适用于您之前的问题。 - Vladimir F Героям слава
哦,抱歉!我不知道 - 我对Fortran编程和Stack Exchange一样新... - user1638145
@user1638145:我经常使用这种“构造函数”来隐藏动态类型组件的分配或执行比简单赋值更复杂的操作。您还可以拥有一个interface food,以接口任何数量的具有与派生类型相同名称的函数。这允许透明地创建对象,例如bar = food(NBananaTypes, NAppleTypes)或任何其他您指定的签名。 - sigma
显示剩余4条评论

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