forrtl严重错误(66)求助:输出语句溢出记录问题排查
问题原因分析
你遇到的forrtl: severe (66)错误,根源出在dynho_Util.f90第66行的WRITE语句写法上:
WRITE(ex_no(2:3),5) j !! This is line 66 !! 5 FORMAT(i2)
在Fortran中,直接写WRITE(ex_no(2:3), ...)时,编译器会把数组ex_no(2:3)的每个元素当作独立的输出目标。也就是说,它会尝试用i2格式把j分别写入ex_no(2)和ex_no(3)两个长度为1的字符元素中——但i2格式需要2个字符的空间,单个长度1的元素根本放不下,直接触发了"输出语句溢出记录"的错误。
而前9次循环(j<10)能成功,是因为WRITE(ex_no(3),4) j中只有单个元素作为目标,i1格式刚好匹配长度1的字符空间。
解决方案
有两种可行的修复方式:
方式一:修正数组WRITE的写法
把数组用括号包裹,告诉编译器将其视为连续的字符缓冲区,而非多个独立输出项:
IF(j.lt.10) then WRITE( (ex_no(3)) ,4) j ! 加括号 4 FORMAT(i1) ELSEIF (j.ge.10.and.j.lt.100) then WRITE( (ex_no(2:3)) ,5) j ! 加括号,原第66行 5 FORMAT(i2) ELSE WRITE( (ex_no(:)) ,6) j ! 加括号 6 FORMAT(i3) END IF
方式二:简化代码(更推荐)
直接使用单个长度为3的字符变量,利用格式化输出的自动补零功能,完全不需要分情况判断:
SUBROUTINE InitSaveData (j) USE dynho_Parameters INTEGER :: j CHARACTER(LEN=3) :: ex_no ! 定义长度为3的字符变量 ! i3.3格式会自动补前导零,适配1-999的所有j值 WRITE(ex_no, '(i3.3)') j OPEN( unit=10, file="dynho_"//ex_no//".dat") END SUBROUTINE InitSaveData
这种写法不仅更简洁,还能避免数组操作带来的潜在问题,同时支持j从1到999的所有情况,扩展性更好。
内容的提问来源于stack exchange,提问作者GiorgioT
相关产品推荐
相关产品推荐

