我正在使用的Fortran程序在处理输入文件时遇到运行时错误。
At line 182 of file ../SOURCE_FILE.f90 (unit = 1, file = 'INPUT_FILE.1')
Fortran runtime error: Bad value during integer read
查看第182行,我看到一个带有隐式/隐含DO循环的READ语句:
182: READ(IT4, 310 )((IPPRM2(IP,I),IP=1,NP),I=1,16) ! read 6 integers
183: READ(IT4, 320 )((PPARM2(IP,I),IP=1,NP),I=1,14) ! read 5 reals
格式声明:
310 FORMAT(1X,6I12)
当我在调试器NP
中找到此代码时,其值为2. I
的值为6,而IP
的值为67.我认为{{1应该在循环中重新初始化{}和I
。
我的问题是,当我尝试在调试器中单步执行READ语句时,它似乎执行然后抛出错误。我不确定如何阅读它。我尝试进入该功能,但似乎这可能是一个困难的路线,因为我不熟悉gfortran库。输入文件看起来没问题,我认为应该读得很好。这让我觉得这个READ语句没有按预期循环。
我对Fortran完全是新手,并且隐式DO循环是这样的,但是从我可以收集的内容,第182行应该根据格式字符串#310读取6个整数。但是,当我到达IP
的值为2时,我认为它只会尝试读取2次整数16次。
如何调试此read语句以检查从文件中读取时读入NP
的值?我是否必须逐步浏览Fortran库?
任何可以消除我对这些隐式循环的困惑的提示都将不胜感激!
谢谢!
注意:我在Linux上使用gfortran / gcc和gdb。
答案 0 :(得分:1)
变量IP和I是循环索引,因此它们由循环重新初始化。当NP = 2时,第一个语句将读取总共32个整数 - 它有助于确定要读取的项目列表。格式决定了它们的读取方式。对于"1X,6I12"
,它们将被读取为输入文件的每行6个整数。当从行/记录中读取所请求的32个整数中的前6个时,Fortran将认为该行/记录已完成并前进到下一个记录。
格式为"1X,6I12"
时,必须在文件中精确排列整数。应该有一个空白,然后整数应该在12列的字段中右对齐。如果它们不对齐,您可能会读取错误的值或运行时错误。
答案 1 :(得分:1)
是否有任何理由需要在阅读中使用特定格式?我会在可行的情况下使用READ(IT4,*)......
gfortran的更高版本支持无限格式读取(请参阅链接http://fortranwiki.org/fortran/show/Fortran+2008+status)
然后指定
可能会有所帮助310 FORMAT("*(1X,6I12)")
或者对于较旧的编译器
310 FORMAT(1000(1X,6I12))