Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran 派生类型声明中出错:此上下文中(1)处的变量必须为常量_Fortran_Fortran90_Derived Types - Fatal编程技术网

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