我在模块中定义了子程序:
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
作业是否错误?
答案 0 :(得分:2)
这正是编译器告诉你的:你不能在声明中初始化一个虚拟变量。您的子程序应为:
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
"参数" Fortran中将y
,param
,r
和s
称为虚拟变量,以区别于" real"变量如mOut
。
r
是一个二维数组,所以
r(1)=param%k(1,1)*mOut
不行......你可能意味着
r(1,1)=param%k(1,1)*mOut
因为r
的第二维只有一个长度。