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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 16:12:06