fortran - 派生类型声明错误 : Variable at (1) in this context must be constant

标签 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

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

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

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

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

最佳答案

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

  • 使 k allocatable,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 并进行调整。)

关于fortran - 派生类型声明错误 : Variable at (1) in this context must be constant,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28484278/

相关文章:

c++ - 为什么值放在 fortran 函数的数组中而不是在调用 c++ 函数中?

python - 如何在 Fortran 派生类型或类中实现类型绑定(bind)写入语句输出

c - Fortran 派生类型包含可从 C 访问的派生类型

pointers - Fortran 解除分配

compilation - gfortran:非法预处理器指令和无效字符/非数字字符编译错误

fortran - 较新的 gfortran 不编译 Fortran90 代码

string - 在 Fortran 中读取带空格的字符串

crash - 运行时Fortran程序崩溃

object - Fortran 派生类型 :

fortran - DATA 语句问题 : Not enough variables