Fortran函数定义语法错误求助:ma函数编译报错
Fortran编译错误:函数定义处语法错误的排查与解决
核心错误原因
你遇到的第23行语法错误,本质是Fortran主程序块中内部函数的定义位置不符合语法规范:
Fortran要求主程序中的所有内部子程序/函数必须放在contains语句之后,不能直接穿插在主程序的执行代码(变量赋值、打印语句等)中间。你的代码在执行PRINT语句后直接定义ma函数,编译器会将函数声明误解析为数据声明,从而抛出语法错误。
解决步骤
1. 为内部函数添加contains块
在主程序的所有执行代码结束后、end Program programa之前,添加contains语句,然后将所有内部函数(ma、VOL、TRAS等)全部移到contains之后。
2. 修复其他潜在问题
除了核心语法错误,你的代码还有几处会导致编译/运行错误的问题:
conf = S1:S1未定义,需删除或提前声明该变量- 打印语句错误:
PRINT *, 'El valor de la constante de Avogadro es:', h中,h是普朗克常数,注释标注的是阿伏伽德罗常数,应改为Na - 整数除法陷阱:
1/1000是整数除法,结果为0,需改为1.0_bigreal/1000.0_bigreal以保留高精度实数运算 - 函数参数的
intent缺失:ma函数的参数M应添加intent(in)明确输入属性 - 函数结束语句不规范:部分函数(如
VOL)的结束语句应为END FUNCTION 函数名,而非仅END - 变量名大小写不匹配:
TRAS函数中使用了小写t,但参数定义的是大写T,需统一 - 变量引用错误:
Gcombi函数中引用了未定义的vtras和deg2,应改为函数参数vtras1和deg3
修正后的完整代码
Program programa integer, parameter :: bigreal = SELECTED_REAL_KIND(R=100) real(KIND=bigreal), PARAMETER:: T = 298 !En grados Kelvin real(KIND=bigreal), PARAMETER :: Na = 6.022E23 !Unidad mol real(KIND=bigreal), PARAMETER :: kb = 1.38E-23 !Unidad J/k real(KIND=bigreal), PARAMETER :: h = 6.626E-34 !Unidad J*s real(KIND=bigreal), PARAMETER :: pi = 3.1416 real(KIND=bigreal), PARAMETER :: R = 8.31446 real :: conf ! 注释:S1未定义,暂时注释该行 ! conf = S1 PRINT *, 'El valor de la constante de Avogadro es:', Na contains real(KIND=bigreal) FUNCTION ma(M) real(KIND=bigreal), intent(in) :: M real(KIND=bigreal) :: uma uma = M*(1.0_bigreal/1000.0_bigreal)*(1.0_bigreal/Na) ma = uma RETURN END FUNCTION ma real(KIND=bigreal) FUNCTION VOL() real(KIND=bigreal) :: v v = (Na*kb*T)/100000.0_bigreal VOL = v RETURN END FUNCTION VOL real(KIND=bigreal) FUNCTION TRAS(V1, M1) real(KIND=bigreal), intent(in) :: V1, M1 real(KIND=bigreal) :: q q = (((2.0_bigreal*pi*M1*kb*T)/(h**2.0_bigreal))**(1.5_bigreal))*V1 TRAS = q RETURN END FUNCTION TRAS real(KIND=bigreal) FUNCTION Stras(Q1) real(KIND=bigreal), intent(in) :: Q1 real(KIND=bigreal) :: s s=kb*LOG(Q1*EXP(1.5_bigreal)) Stras = s RETURN END FUNCTION Stras real(KIND=bigreal) FUNCTION Gtras(Q2) real(KIND=bigreal), intent(in) :: Q2 real(KIND=bigreal) :: g g = kb*T*LOG(EXP(1.0_bigreal)/Q2) Gtras = g RETURN END FUNCTION Gtras real(KIND=bigreal) FUNCTION U() real(KIND=bigreal) :: u1 u1 = kb*T*1.5_bigreal U = u1 RETURN END FUNCTION U real(KIND=bigreal) FUNCTION Sele(deg1) real(KIND=bigreal), intent(in) :: deg1 real(KIND=bigreal) :: sel sel = kb*LOG(deg1) Sele = sel RETURN END FUNCTION Sele real(KIND=bigreal) FUNCTION Gele(deg1) real(KIND=bigreal), intent(in) :: deg1 real(KIND=bigreal) :: gel gel = kb*T*LOG(EXP(1.0_bigreal)/deg1) Gele = gel RETURN END FUNCTION Gele real(KIND=bigreal) FUNCTION Scombi(vtras, deg2) real(KIND=bigreal), intent(in) :: vtras, deg2 real(KIND=bigreal) :: scomb scomb = (2.5_bigreal*R) + R*LOG(vtras*(deg2/Na)) Scombi = scomb RETURN END FUNCTION Scombi real(KIND=bigreal) FUNCTION Gcombi(vtras1, deg3) real(KIND=bigreal), intent(in) :: vtras1, deg3 real(KIND=bigreal) :: gcomb gcomb = -kb*T*LOG(vtras1*deg3) Gcombi = gcomb RETURN END FUNCTION Gcombi end Program programa
内容的提问来源于stack exchange,提问作者Alex Von D
相关产品推荐
相关产品推荐

