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"yparamrs被称为虚拟变量 Fortran 将它们与 "real" 变量区分开来,例如 mOut

r是一个二维数组,所以

r(1)=param%k(1,1)*mOut

不行...你可能是说

r(1,1)=param%k(1,1)*mOut

因为 r 的第二个维度只有一个长度。