编译错误:(1)处的虚拟不能有初始化程序。什么是虚拟变量?

时间:2015-02-12 19:17:54

标签: arrays fortran fortran90

我在模块中定义了子程序:

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作业是否错误?

1 个答案:

答案 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中将yparamrs称为虚拟变量,以区别于" real"变量如mOut

r是一个二维数组,所以

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

不行......你可能意味着

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

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