【问题标题】:Fortran: Array of unknown size in typeFortran:类型未知大小的数组
【发布时间】:2013-02-26 21:59:42
【问题描述】:

也许这是一个非常愚蠢的问题,人们真的应该这样做,但是: 有没有可能有类似的东西

type food
 INTEGER :: NBananasLeft(NBananaTypes)
 INTEGER :: NApplesLeft(NAppleTypes)
end type food

NBananaTypes 和 NAppleTypes 在编译时是未知的?

【问题讨论】:

    标签: arrays types fortran


    【解决方案1】:

    在 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,..
    • 或多或少是的。您还可以将内部构造函数与 Fortran 2003 自动重新分配一起使用(我相信它应该可以工作,但如果没有,请纠正我)。
    • 如果您同意答案,您可以(并且可能应该在一段时间后)通过单击左侧的绿色对勾来接受它。这也适用于您之前的问题。
    • 哦,对不起!不知道 - 我对 Fortran 编程和堆栈交换一样陌生...
    • @user1638145:我经常使用这种类型的“构造函数”来隐藏动态类型组件的分配,或者做一些比简单赋值更复杂的事情。您还可以使用interface food 来连接任意数量的与您的派生类型同名的此类函数。这允许以bar = food(NBananaTypes, NAppleTypes) 或您指定的任何其他签名透明地创建对象。
    猜你喜欢
    • 2013-11-27
    • 1970-01-01
    • 2023-02-09
    • 2021-07-30
    • 2016-03-03
    • 1970-01-01
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多