You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 22:24:53