Compilation Error: Dummy at (1) cannot have an initializer. What is Dummy Variable?
Compilation Error: Dummy at (1) cannot have an initializer. What is Dummy Variable?
我在模块中定义了子例程:
MODULE dmotifs
INTEGER, PARAMETER :: nsp=4,nrx=8,maxprx=4
TYPE :: PRM
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(nsp), INTENT(IN) :: y
INTEGER, DIMENSION(nsp,nrx), INTENT(OUT) :: s=0
REAL, DIMENSION(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)
r(1)=param%k(1,1)*mOut
s(ind_mOut,1)=-1
! and so on ....
END SUBROUTINE unreg
END MODULE dmotifs
当我使用 gfortran 编译时:gfortran -Wall -c "dmotifs.f90"
,我收到此错误:
SUBROUTINE unreg(y,param,r,s)
1
Error: Dummy 'r' at (1) cannot have an initializer
我不明白这个错误的性质。我尝试保留和删除 INTENT(OUT)
,但没有任何区别。
这里的虚拟变量是什么?
这个r(1)=param%k(1,1)*mOut
分配不正确吗?
这正是编译器告诉你的:你不能在声明中初始化一个虚拟变量。您的子例程应为:
SUBROUTINE unreg(y,param,r,s)
TYPE(PRM), INTENT(IN) :: param
REAL, DIMENSION(nsp), INTENT(IN) :: y
INTEGER, DIMENSION(nsp,nrx), INTENT(OUT) :: s
REAL, DIMENSION(nrx,1), INTENT(OUT) :: r
REAL :: mOut, mCtrl, pOut, pCtrl
! Initialize the output
s = 0
r = 0.
! and so on ....
END SUBROUTINE unreg
"arguments"y
、param
、r
和s
被称为虚拟变量 Fortran 将它们与 "real" 变量区分开来,例如 mOut
。
r
是一个二维数组,所以
r(1)=param%k(1,1)*mOut
不行...你可能是说
r(1,1)=param%k(1,1)*mOut
因为 r
的第二个维度只有一个长度。
我在模块中定义了子例程:
MODULE dmotifs
INTEGER, PARAMETER :: nsp=4,nrx=8,maxprx=4
TYPE :: PRM
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(nsp), INTENT(IN) :: y
INTEGER, DIMENSION(nsp,nrx), INTENT(OUT) :: s=0
REAL, DIMENSION(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)
r(1)=param%k(1,1)*mOut
s(ind_mOut,1)=-1
! and so on ....
END SUBROUTINE unreg
END MODULE dmotifs
当我使用 gfortran 编译时:gfortran -Wall -c "dmotifs.f90"
,我收到此错误:
SUBROUTINE unreg(y,param,r,s)
1
Error: Dummy 'r' at (1) cannot have an initializer
我不明白这个错误的性质。我尝试保留和删除 INTENT(OUT)
,但没有任何区别。
这里的虚拟变量是什么?
这个r(1)=param%k(1,1)*mOut
分配不正确吗?
这正是编译器告诉你的:你不能在声明中初始化一个虚拟变量。您的子例程应为:
SUBROUTINE unreg(y,param,r,s)
TYPE(PRM), INTENT(IN) :: param
REAL, DIMENSION(nsp), INTENT(IN) :: y
INTEGER, DIMENSION(nsp,nrx), INTENT(OUT) :: s
REAL, DIMENSION(nrx,1), INTENT(OUT) :: r
REAL :: mOut, mCtrl, pOut, pCtrl
! Initialize the output
s = 0
r = 0.
! and so on ....
END SUBROUTINE unreg
"arguments"y
、param
、r
和s
被称为虚拟变量 Fortran 将它们与 "real" 变量区分开来,例如 mOut
。
r
是一个二维数组,所以
r(1)=param%k(1,1)*mOut
不行...你可能是说
r(1,1)=param%k(1,1)*mOut
因为 r
的第二个维度只有一个长度。