Fortran 77 READ语句语法错误排查:DIRECT访问记录参数问题
处理Fortran 77 READ语句的语法错误问题
问题场景
编译80-90年代的老式Fortran 77代码时,遇到READ语句的语法错误。代码中文件采用直接访问模式,但READ语句的写法无法通过Intel编译器编译。
错误代码片段
文件打开与第一条READ语句
OPEN (UNIT=11,FILE=DRDFIL,ACCESS='DIRECT', * STATUS='OLD',FORM='FORMATTED',RECORD SIZE=360) NFRD=1 READ (11''NFRD,FMT=90019,ERR=11) AO,DHI,B,NR,NC,FS,FAR,ASP,APP,AOP, * AIP,KF,LT,NT,L,H,LS,LEB,TUBETYPE,AIRSIDE,LD
跳转后的第二条READ语句
11 NFRD=2 READ (11''NFRD,FMT=90029) A1,B1,C1,D1,A2,B2,C2,D2,E2,A3,B3, * (DRYCF(I),I=1,3),(WETCF(I),I=1,3)
编译器报错信息
error #5082: Syntax error, found IDENTIFIER 'NFRD' when expecting one of: :: ) , : * <END-OF-STATEMENT> ; . (/ + - ] /) ' ** > PRIVATE / // ... READ (11 NFRD,ERR=11) AO,DHI,B,NR,NC,FS,FAR,ASP,APP,AOP, ---------------^
输入文件格式
打开的是空格分隔的长数字串文本文件,示例内容:
0.12066861E+03 0.29457249E-01 0.69446688E+01 0.10000000E+01 0.40000000E+02 0.27042252E+03 0.79557860E+00 0.32429367E+02 0.37945886E+01 0.36223957E+02 0.52160816E+01
解决方案
问题出在READ语句中错误的写法11''NFRD,这是老式代码的书写疏漏。由于文件采用直接访问模式(ACCESS='DIRECT'),必须明确指定要读取的记录号,正确写法需添加REC参数:
修正后的第一条READ语句
READ (11, REC=NFRD, FMT=90019, ERR=11) AO,DHI,B,NR,NC,FS,FAR,ASP,APP,AOP, * AIP,KF,LT,NT,L,H,LS,LEB,TUBETYPE,AIRSIDE,LD
修正后的第二条READ语句
11 NFRD=2 READ (11, REC=NFRD, FMT=90029) A1,B1,C1,D1,A2,B2,C2,D2,E2,A3,B3, * (DRYCF(I),I=1,3),(WETCF(I),I=1,3)
代码意图解释
NFRD=1和NFRD=2是指定直接访问文件中的第1条记录和第2条记录。直接访问模式下,文件被划分为固定长度的记录(RECORD SIZE=360指定了单条记录长度),通过REC参数指定读取的记录序号。- 原代码中的
11''NFRD是打字疏漏,正确逻辑是用逗号分隔单元号和记录号参数,即11, REC=NFRD(也可省略REC关键字写为11, NFRD,但显式指定关键字可读性更强)。
内容的提问来源于stack exchange,提问作者Glen Herman
相关产品推荐
相关产品推荐

