2017-08-30 1 views
2

j'obtiens cette erreur de compilation avec gfortran 5.4 et un code .f90expression non variable dans la définition des variables d'erreur de compilation contexte

call abc_output(struc,nx,ny,nz,'AB' ,get_ab_dat(p_f),& 
               1 
Error: Non-variable expression in variable definition context (actual argument to INTENT = OUT/INOUT) at (1) 

L'appel de méthode qui génère l'erreur de compilation est présentée ci-dessous et l'erreur est le get_ab_dat

type(b_f)    :: p_f 
call abc_output(struc,nx,ny,nz,'AB' ,get_ab_dat(p_f),& 
           'BD' ,get_bc_dat(p_f),& 
           'EF' , aaa) 

La fonction get_ab_dat est représentée ci-dessous

function get_ab_dat(bf) result(qx_arr) 
    type(b_f),intent(in) :: bf 
    real,dimension(:,:,:),allocatable :: qx_arr 
    qx_arr = bf%qx 
end function get_ab_dat 


subroutine abc_output (struc,nx,ny,nz,dname1,data1,& 
     dname2,data2,dname3,data3,dname4,data4) 

type(c_s),intent(in)     :: struc 
integer,intent(in)       :: nx,ny,nz  
character(len=*),intent(in)     :: dname1 
real,dimension(:,:,:),allocatable,intent(inout)   :: data1 
character(len=*),intent(in),optional   :: dname2,dname3,dname4  
real,dimension(:,:,:),allocatable,intent(inout),optional ::     data2,data3,data4 

Quelqu'un peut-il expliquer ce que cette erreur signifie et comment je peux le réparer?

+0

S'il vous plaît montrer le code complet et le message d'erreur complet. Où (1) dans le message d'erreur pointe-t-il? –

+0

BTW, votre code n'est pas Fortran 90, mais Fortran 2003, donc la balise fortran90 est confuse. L'extension de fichier .f90 ne signifie pas Fortran 90, cela signifie une source de formulaire fixe. –

+0

peut-être associé à 'abc_output', montrez cela. – agentp

Répondre

2

Vous ne pouvez pas publier une expression ou une constante dans un argument intent(OUT) ou . Vous devez toujours transmettre une variable, car elle peut être modifiée dans la procédure que vous appelez.

Ainsi, parce que le sixième argument de abc_output est intent(OUT) ou (plus probablement) intent(INOUT) vous devez d'abord affecter la valeur de get_ab_dat(p_f) à une variable et vous devez passer la variable à abc_output. Faites attention à l'aliasing des arguments.

Dans ce cas particulier, l'argument est également allocatable, de sorte que la variable doit également être allocatable.