派生类型声明中的错误:此上下文中(1)处的变量必须是常量

时间:2015-02-12 17:45:41

标签: fortran fortran90 derived-types

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

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

&#34的含义是什么;必须是常数&#34 ;;它应该在编译期间是不可变的,比如参数吗?

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

最重要的是,我希望了解为什么会这样。

我正在使用gfortran编译:{{1​​}}

1 个答案:

答案 0 :(得分:2)

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

  • make k allocatable,dimension(:,:)(和(de-)),或
  • 制作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拍摄并调整。)