Fortran编译报错:Symbol has no implicit type问题求助
Fortran子程序显式声明变量仍报“无隐式类型”错误排查
问题背景
在Fortran子程序中新增变量后编译报错,提示a4、area、dia、skalHF等符号无隐式类型,但已在代码中显式声明这些变量,怀疑是拼写错误或其他未知原因。
子程序代码
subroutine UPrhoha_as33() implicit none c ------------------------------------------------------------------ include 'xDatMetDefS_TPM.h' c ------------------------------------------------------------------ include 'xMaPa_as26.h' include 'xDatB_as26.h' include 'eldata.h' include 'tdata.h' c ------------------------------------------------------------------ integer i,tstep,j real*8 alpha,beta,k real*8 be real*8 facaT,qhL(3),qhI(3) real*8 ngradtheta(3),vorfac,norm real*8 skalHF,area,a1,a2,a3,a4,dia c ------------------------------------------------------------------ c tstep = dint(ttim/dt) Tbr=thetamix-273.15 ! write(*,*)'Tbr= ',Tbr c............................................................. rhodhI =0.0d0 skalHF = 0.0d0 c..... area calculation from micro scale a1=196.7638d0 a2=-3.3443d0 a3=0.3925d0 a4=-1.2582d0 dia=a4+(a1-a4)*dexp(-dexp(-a2*(nhI-a3))) c.....convert to dimensional form dia=2.84d0*dia c..... area with units m2 area=0.000001d0*3.14d0*dia**2.0d0/4.0d0 norm = sqrt(Gradthetamix(1)**2.d0+Gradthetamix(2)**2.d0+ & Gradthetamix(3)**2.d0) do i=1,3 if (norm.eq.0.0d0) then ngradtheta(i) = 0.0d0 else ngradtheta(i) = Gradthetamix(i)/norm end if qhL(i)=-0.5d0*Gradthetamix(i) qhI(i)=-2.3d0*Gradthetamix(i) skalHF = skalHF + (qhL(i)-qhI(i))*ngradtheta(i) c rhodhI =-facaT*skalHF/(335000d0) end do return end
错误信息
mate_as33.f:239:8: a4=-1.2582d0 1 Error: Symbol ‘a4’ at (1) has no IMPLICIT type mate_as33.f:244:10: area=0.000001d0*3.14d0*dia**2.0d0/4.0d0 1 Error: Symbol ‘area’ at (1) has no IMPLICIT type mate_as33.f:240:9: dia=a4+(a1-a4)*dexp(-dexp(-a2*(nhI-a3))) 1 Error: Symbol ‘dia’ at (1) has no IMPLICIT type mate_as33.f:234:12: skalHF = 0.0d0 1 Error: Symbol ‘skalhf’ at (1) has no IMPLICIT type
排查与解决
1. 调整implicit none的位置
代码将implicit none写在所有include语句之前,若某个头文件中包含implicit类型声明(如老Fortran代码常见的implicit real*8(a-h,o-z)),会覆盖implicit none的作用,导致新增变量无法被识别为显式声明。
解决:将implicit none移至所有include语句之后,确保它覆盖后续所有代码的隐含类型规则。
2. 修正续行符语法错误
代码中计算norm的续行使用了&(HTML转义字符),而Fortran固定格式要求续行符为第6列的&。该错误会导致编译器解析中断,进而无法识别后续的变量声明。
解决:将&替换为&,并确保续行符位于代码行的第6列位置。
3. 检查编译器大小写敏感性
错误信息中skalHF被显示为小写的skalhf,若编译器启用了大小写敏感选项(如gfortran的-fcase-sensitive),会将大小写不同的变量视为不同符号。
解决:统一变量名的大小写,或关闭编译器的大小写敏感选项。
4. 验证声明行完整性
确认变量声明行没有被注释截断、换行错误或逗号遗漏,比如real*8 skalHF,area,a1,a2,a3,a4,dia中的逗号分隔正确,无遗漏。
修正后的示例代码
subroutine UPrhoha_as33() c ------------------------------------------------------------------ include 'xDatMetDefS_TPM.h' c ------------------------------------------------------------------ include 'xMaPa_as26.h' include 'xDatB_as26.h' include 'eldata.h' include 'tdata.h' c ------------------------------------------------------------------ implicit none integer i,tstep,j real*8 alpha,beta,k real*8 be real*8 facaT,qhL(3),qhI(3) real*8 ngradtheta(3),vorfac,norm real*8 skalHF,area,a1,a2,a3,a4,dia c ------------------------------------------------------------------ c tstep = dint(ttim/dt) Tbr=thetamix-273.15 ! write(*,*)'Tbr= ',Tbr c............................................................. rhodhI =0.0d0 skalHF = 0.0d0 c..... area calculation from micro scale a1=196.7638d0 a2=-3.3443d0 a3=0.3925d0 a4=-1.2582d0 dia=a4+(a1-a4)*dexp(-dexp(-a2*(nhI-a3))) c.....convert to dimensional form dia=2.84d0*dia c..... area with units m2 area=0.000001d0*3.14d0*dia**2.0d0/4.0d0 norm = sqrt(Gradthetamix(1)**2.d0+Gradthetamix(2)**2.d0+ & Gradthetamix(3)**2.d0) do i=1,3 if (norm.eq.0.0d0) then ngradtheta(i) = 0.0d0 else ngradtheta(i) = Gradthetamix(i)/norm end if qhL(i)=-0.5d0*Gradthetamix(i) qhI(i)=-2.3d0*Gradthetamix(i) skalHF = skalHF + (qhL(i)-qhI(i))*ngradtheta(i) c rhodhI =-facaT*skalHF/(335000d0) end do return end
内容的提问来源于stack exchange,提问作者R2197
相关产品推荐
相关产品推荐

