旧Fortran程序编译报错求助:EQUIVALENCE与语法问题
旧Fortran程序编译问题
问题1:MacOS ARM64下gfortran编译出现EQUIVALENCE秩不匹配错误
原编译指令为 f77 aa.f bb.f cc.f -o xx.out,使用gfortran执行 gfortran aa.f bb.f cc.f -o xx.out 时,触发EQUIVALENCE语句秩不匹配错误,相关代码片段如下:
C DIMENSION USQMAT(3,3),ROOT(3),A(3,3),B(3,3),UTR(6) C EQUIVALENCE (AAM,USQMAT(1,1)),(BAM,USQMAT(2,2)), * (CAM,USQMAT(3,3)) EQUIVALENCE (FAM,USQMAT(2,3)),(GAM,USQMAT(1,3)) *,(HAM,USQMAT(1,2)) EQUIVALENCE( A(1), USQMAT(1) ), (UTR(1), B(1))
问题2:Ubuntu下fort77编译出现语法错误
在VMware Ubuntu环境中使用fort77编译时,代码第414-416行触发语法错误:
SUBROUTINE EIGEN(A,R,N,MV) DOUBLE PRECISION A,R,ANORM,ANRMX,THR,X,Y,SINX,SINX2,COSX, 1COSX2,SINCS,RANGE
解决方案
针对问题1:EQUIVALENCE秩不匹配错误
gfortran对Fortran标准的兼容性检查更严格,旧f77允许的非标准特性会被拦截。报错核心原因:
- 最后一条EQUIVALENCE语句中,
A(二维数组)与USQMAT(二维数组)的元素等价,以及UTR(一维数组,长度6)与B(二维数组,长度9)的元素等价,违反了现代Fortran对数组秩、存储长度匹配的要求。
解决办法:
- 添加f77兼容编译选项,放宽检查:
gfortran -ffixed-form -fno-range-check -ff2c aa.f bb.f cc.f -o xx.out-ffixed-form:指定代码为旧Fortran固定格式-fno-range-check:关闭数组范围与长度匹配检查-ff2c:模拟f2c编译器行为,兼容更多f77非标准写法
- 若选项无效,可尝试修改代码:
- 将
EQUIVALENCE( A(1), USQMAT(1) )改为EQUIVALENCE(A, USQMAT)(部分编译器允许数组整体等价) - 确认
UTR仅使用B的前6个元素,若逻辑如此,保留原语句并依赖兼容选项即可
- 将
针对问题2:fort77编译的语法错误
旧f77固定格式要求续行符必须放在代码第6列,原代码的续行符1位置错误,导致语法识别失败。
解决办法:
调整续行格式,将续行符1移至第6列,后续加空格再写变量:
SUBROUTINE EIGEN(A,R,N,MV) DOUBLE PRECISION A,R,ANORM,ANRMX,THR,X,Y,SINX,SINX2,COSX, 1 COSX2,SINCS,RANGE
内容的提问来源于stack exchange,提问作者user1535430
相关产品推荐
相关产品推荐

