旧Microsoft Fortran Power Station代码编译适配问题求助
旧Fortran代码编译问题与修复方案
一、初始问题
有一段旧Fortran代码,软件指南要求使用Microsoft Fortran for Power Station编译,用gfortran编译时出现大量“无IMPLICIT类型”“无法分类语句”错误,疑问:
- 如何顺利编译这段代码?
- 能否下载或购买Microsoft Fortran for Power Station?
- 如何修改代码适配gfortran或Intel Fortran?
二、更新:改用Intel Fortran后的剩余错误
改用Intel Fortran后错误大幅减少,但多数剩余错误集中在write语句续行、变量声明续行的语法问题上,以下是典型示例及修复方案:
示例1:Write语句跨行字符常量错误
原代码:
write(*,'(a65,5i5)')'Excit CrosSec fit-method is unknown for XE, + iSS, LL, LU, mth=', nX, iSS, LL, LU, mth
错误信息:
Users_BS_1520_Dec2023.for(417): error #5082: Syntax error, found ''' when expecting one of: ( , <END-OF-STATEMENT> ; <IDENTIFIER> <CHAR_CON_KIND_PARAM> <CHAR_NAM_KIND_PARAM> ... write(*,'(a65,5i5)')'Excit CrosSec fit-method is unknown for XE, ----------------------------^ Users_BS_1520_Dec2023.for(417): error #5082: Syntax error, found END-OF-STATEMENT when expecting one of: ( <IDENTIFIER> INTEGER <CHAR_CON_KIND_PARAM> <CHAR_NAM_KIND_PARAM> <CHARACTER_CONSTANT> ... write(*,'(a65,5i5)')'Excit CrosSec fit-method is unknown for XE, -------------------------------------------------------------------------^ Users_BS_1520_Dec2023.for(418): error #5120: Unterminated character constant + iSS, LL, LU, mth=', nX, iSS, LL, LU, mth ----------------------------^ Users_BS_1520_Dec2023.for(418): error #5082: Syntax error, found END-OF-STATEMENT when expecting one of: , + iSS, LL, LU, mth=', nX, iSS, LL, LU, mth ---------------------------------------------------^ Users_BS_1520_Dec2023.for(417): error #6404: This name does not have a type, and must have an explicit type. [EXCITCROSSECFIT] write(*,'(a65,5i5)')'Excit CrosSec fit-method is unknown for XE, -----------------------------^ Users_BS_1520_Dec2023.for(417): error #6404: This name does not have a type, and must have an explicit type. [METHODISUNKNOWNFORXE] write(*,'(a65,5i5)')'Excit CrosSec fit-method is unknown for XE,
问题原因与修复:
旧版Microsoft Fortran允许字符常量跨行时不闭合引号,但标准Fortran(包括Intel Fortran、gfortran)要求每行字符常量必须完整闭合,跨行需要用&连接。
修复后的代码(固定格式):
write(*,'(a65,5i5)')'Excit CrosSec fit-method is unknown for XE, '& & 'iSS, LL, LU, mth=', nX, iSS, LL, LU, mth
或直接合并为一行:
write(*,'(a65,5i5)')'Excit CrosSec fit-method is unknown for XE, iSS, LL, LU, mth=', nX, iSS, LL, LU, mth
示例2:变量声明与DATA语句续行错误
原代码:
real(8) X,Y, B(22), RI(15), XN(15), YN(15), D0(25), D1(25),D2(25), + D3(25), D4(25), HN(25), XX(3), HH(3), NBY2(19), Cv(21), + CO, UU, VV, U, Y2, Hv, DXv, V DATA B/0.,.7093602d-7,.0,.0,.0,.0,.0,.0,.0,.0,.0,.0,.0,.0,.0,.0, + .0,.0,.0,.0,.0,.0/, XN/10.,9.,2*8.,7.,6.,5.,4.,7*3./, + YN/3*.6,.5,2*.4,4*.3,1.,.9,.8,2*.7/, Hv/.201/, XX/.5246476, + 1.65068,.7071068/, HH/.2562121,.2588268E-1,.2820948/, NBY2/9.5, + 9.,8.5,8.,7.5,7.,6.5,6.,5.5,5.,4.5,4.,3.5,3.,2.5,2.,1.5,1.,.5/, + Cv/.7093602E-7,-.2518434E-6,.8566874E-6,-.2787638E-5,.866074E-5, + -.2565551E-4,.7228775E-4,-.1933631E-3,.4899520E-3, -.001173267, + .2648762E-2, -.005623190, .01119601, -.02084976, .03621573, + -.05851412, .08770816, -.121664, .15584, -.184, .2/
错误信息:
Users_BS_1520_Dec2023.for(2307): error #5082: Syntax error, found END-OF-STATEMENT when expecting one of: %FILL <IDENTIFIER> + D3(25), D4(25), HN(25), XX(3), HH(3), NBY2(19), Cv(21), ---------------------------------------------------------------------^ Users_BS_1520_Dec2023.for(2308): error #5082: Syntax error, found '+' when expecting one of: <LABEL> <END-OF-STATEMENT> ; <IDENTIFIER> TYPE MODULE ELEMENTAL IMPURE NON_RECURSIVE ... + CO, UU, VV, U, Y2, Hv, DXv, V --------^ Users_BS_1520_Dec2023.for(2309): error #6404: This name does not have a type, and must have an explicit type. [B] DATA B/0.,.7093602d-7,.0,.0,.0,.0,.0,.0,.0,.0,.0,.0,.0,.0,.0,.0, -----------^ ...(剩余错误略)
问题原因与修复:
- 续行符号位置错误:固定格式Fortran要求续行符
+必须放在第6列,原代码中部分续行的+位置偏移,导致编译器无法识别为续行,将后续行视为新语句,进而触发变量未声明错误。 - 修复方案:
- 固定格式修正(确保
+在第6列):real(8) X,Y, B(22), RI(15), XN(15), YN(15), D0(25), D1(25),D2(25), + D3(25), D4(25), HN(25), XX(3), HH(3), NBY2(19), Cv(21), + CO, UU, VV, U, Y2, Hv, DXv, V DATA B/0.,.7093602d-7,.0,.0,.0,.0,.0,.0,.0,.0,.0,.0,.0,.0,.0,.0, + .0,.0,.0,.0,.0,.0/, XN/10.,9.,2*8.,7.,6.,5.,4.,7*3./, + YN/3*.6,.5,2*.4,4*.3,1.,.9,.8,2*.7/, Hv/.201/, XX/.5246476, + 1.65068,.7071068/, HH/.2562121,.2588268E-1,.2820948/, NBY2/9.5, + 9.,8.5,8.,7.5,7.,6.5,6.,5.5,5.,4.5,4.,3.5,3.,2.5,2.,1.5,1.,.5/, + Cv/.7093602E-7,-.2518434E-6,.8566874E-6,-.2787638E-5,.866074E-5, + -.2565551E-4,.7228775E-4,-.1933631E-3,.4899520E-3, -.001173267, + .2648762E-2, -.005623190, .01119601, -.02084976, .03621573, + -.05851412, .08770816, -.121664, .15584, -.184, .2/ - 转换为自由格式(后缀改为
.f90,用&续行):real(8) :: X,Y, B(22), RI(15), XN(15), YN(15), D0(25), D1(25),D2(25), & D3(25), D4(25), HN(25), XX(3), HH(3), NBY2(19), Cv(21), & CO, UU, VV, U, Y2, Hv, DXv, V DATA B/0.,.7093602d-7,.0,.0,.0,.0,.0,.0,.0,.0,.0,.0,.0,.0,.0,.0, & .0,.0,.0,.0,.0,.0/, XN/10.,9.,2*8.,7.,6.,5.,4.,7*3./, & YN/3*.6,.5,2*.4,4*.3,1.,.9,.8,2*.7/, Hv/.201/, XX/.5246476, & 1.65068,.7071068/, HH/.2562121,.2588268E-1,.2820948/, NBY2/9.5, & 9.,8.5,8.,7.5,7.,6.5,6.,5.5,5.,4.5,4.,3.5,3.,2.5,2.,1.5,1.,.5/, & Cv/.7093602E-7,-.2518434E-6,.8566874E-6,-.2787638E-5,.866074E-5, & -.2565551E-4,.7228775E-4,-.1933631E-3,.4899520E-3, -.001173267, & .2648762E-2, -.005623190, .01119601, -.02084976, .03621573, & -.05851412, .08770816, -.121664, .15584, -.184, .2/ - 额外建议:在每个程序单元开头添加
IMPLICIT NONE,强制显式声明所有变量,彻底避免“无IMPLICIT类型”错误。
- 固定格式修正(确保
三、关于Microsoft Fortran for Power Station的获取
Microsoft Fortran for Power Station是老旧编译器(适配Windows 9x/NT时代),微软早已停止支持,官方渠道无法下载或购买。不建议尝试使用,它无法在现代Windows系统稳定运行,且兼容性极差。
四、适配gfortran/Intel Fortran的通用建议
- 强制显式类型声明:在主程序、子程序、函数等所有程序单元开头添加
IMPLICIT NONE,所有变量必须显式声明类型。 - 修正续行格式:固定格式文件续行符
+必须在第6列;自由格式文件用&放在行尾,字符常量跨行需在每行末尾和下一行开头都加&。 - 替换非标准语法:将Microsoft Fortran的专属扩展语法(如特定IO语句、类型定义)替换为标准Fortran语法。
- 调整编译选项:
- gfortran:用
-ffixed-form(固定格式)或-ffree-form(自由格式)指定源文件格式,添加-std=legacy启用旧代码兼容模式。 - Intel Fortran:用
/fixed或/free指定格式,添加/warn:declarations排查未声明变量。
- gfortran:用
内容的提问来源于stack exchange,提问作者Pavel Bernshtam
相关产品推荐
相关产品推荐

