Fortran 派生类型声明中出错:此上下文中(1)处的变量必须为常量
我在如下模块中声明了一个派生类型:Fortran 派生类型声明中出错:此上下文中(1)处的变量必须为常量,fortran,fortran90,derived-types,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
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
“必须是常数”的含义是什么;在编译过程中,它是否应该是不可变的,如参数
但还有一个问题,我不能在派生类型中声明参数。如何处理这个错误?将这些对象移出派生类型并使其成为参数是否是唯一的选项
最重要的是,我想了解为什么会发生这种情况
我是使用gfortran编译的:
gfortran-Wall-c“dmotifs.f90”
是的。在非参数化派生类型中声明显式形状数组需要常量表达式。你也可以
- 使
k
(和(取消)分配),或可分配,维度(:,:)
- 制作
和nrx
全局/模块常量(或立即替换)李>maxprx
(摘自并调整自。)@VladimirF整个部分都很大。它包含使用这种类型的子例程。您可以轻松地将定义提取到单独的源文件中,以显示问题就在那里。请看,但实际上,在这里包含完整的错误消息已经足够了,包括指向错误行的1。首先,我没有注意到另一个出现的
nrx
。只是一个小问题:在这里使用固定大小的数组有什么明显的优势吗?此数组只保存需要由不同子例程引用的数据。所以我永远不会重新分配它。
Error: Variable 'nrx' at (1) in this context must be constant
type :: PRM(nrx,maxprx) ! parameterized derived type definition
integer, len :: nrx
integer, len :: maxprx
real :: k(nrx,maxprx)
! ...
end type PRM