如何使用隐式DO循环调试Fortran READ / WRITE语句?

时间:2012-07-17 13:40:33

标签: gcc fortran gfortran

我正在使用的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。

2 个答案:

答案 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))