【问题标题】:Error in Derived type declaration: Variable at (1) in this context must be constant派生类型声明中的错误:此上下文中 (1) 处的变量必须是常量
【发布时间】:2015-02-12 17:45:40
【问题描述】:

我在这样的模块中声明了一个派生类型:

MODULE dmotifs
TYPE :: PRM
    INTEGER, PRIVATE :: nsp=4,nrx=8,maxprx=4
    REAL, PRIVATE :: cref=1e-6,tref=1
    REAL, DIMENSION(nrx,maxprx) :: k
    REAL :: input
END TYPE PRM

CONTAINS

SUBROUTINE unreg(y,param,r,s)

    TYPE(PRM), INTENT(IN) :: param
    REAL, DIMENSION(param%nsp), INTENT(IN) :: y
    INTEGER, DIMENSION(param%nsp,param%nrx), INTENT(OUT) :: s=0
    REAL, DIMENSION(param%nrx,1), INTENT(OUT) :: r=0
    REAL :: mOut, mCtrl, pOut, pCtrl
    mOut=y(ind_mOut)
    mCtrl=y(ind_mCtrl) 
    pOut=y(ind_pOut)
    pCtrl=y(ind_pCtrl)

    ! <some operations on "r" and "s">
    RETURN 

END SUBROUTINE unreg
END MODULE dmotifs

编译时出现此错误:

Error: Variable 'nrx' at (1) in this context must be constant

“必须是常数”是什么意思;它在编译期间应该是不可变的,即像参数一样吗?

但是还有另一个问题,我不能在派生类型中声明 PARAMETERS。如何处理这个错误?将这些对象从派生类型中移出并使其成为 PARAMETERS 是唯一的选择吗?

最重要的是,我希望了解为什么会发生这种情况。

我正在使用 gfortran 进行编译:gfortran -Wall -c "dmotifs.f90"

【问题讨论】:

  • @VladimirF 整个部分都很大。它包含使用这种类型的子程序。
  • 您可以轻松地将定义提取到单独的源文件中,以显示问题就在那里。请参阅stackoverflow.com/help/mcve 但实际上,这里包含完整的错误消息 包括 指向违规行的 1 就足够了。我没有首先注意到nrx 的其他出现。

标签: fortran fortran90 derived-types


【解决方案1】:

是的。在非参数化派生类型中声明显式形状数组需要常量表达式。你也可以

  • 制作kallocatable,dimension(:,:)(和(取消)分配),或
  • 制作nrxmaxprx 全局/模块常量(或立即替换它们)。

如果你的compiler supports it,你可以使用parameterized derived types

  type :: PRM(nrx,maxprx)  ! parameterized derived type definition
    integer, len :: nrx
    integer, len :: maxprx
    real         :: k(nrx,maxprx) 
    ! ...
  end type PRM

(取自here。)

【讨论】:

  • 只是一个小问题:在这里使用固定大小的数组有什么明显的优势吗?该数组仅保存需要由不同子例程引用的数据。所以我永远不会重新分配它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-06
  • 2017-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多