1

我正在使用的 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。我认为应该在循环中重新初始化IIP

我的问题是,当我尝试在调试器中单步执行时,一旦我进入 READ 语句,它似乎执行然后抛出错误。我不知道如何阅读它。我尝试进入该函数,但由于我不熟悉 gfortran 库,这似乎是一条艰难的道路。输入文件看起来不错,我认为应该可以正常阅读。这让我觉得这个 READ 语句没有按预期循环。

我对 Fortran 和像这样的隐式 DO 循环完全陌生,但是从我可以收集的内容来看,第 182 行应该根据格式字符串 #310 读取 6 个整数。但是,当我到达时,NP它的值为 2,这让我认为它只会尝试读取 2 个整数 16 次。

如何调试此读取语句以检查IPPARM从文件中读取的值?我必须逐步浏览 Fortran 库吗?

任何可以消除我对这些隐式循环的困惑的提示将不胜感激!

谢谢!

注意:我在 Linux 上使用 gfortran/gcc 和 gdb。

4

2 回答 2

1

您是否有任何理由需要在阅读时使用特定格式?我会在可行的情况下使用 READ(IT4, *) ...

更高版本的 gfortran 支持无限格式读取(请参阅链接http://fortranwiki.org/fortran/show/Fortran+2008+status

那么指定

310 FORMAT("*(1X,6I12)")

或者对于较旧的编译器

310 FORMAT(1000(1X,6I12))
于 2012-07-17T20:06:27.070 回答
1

变量 IP 和 I 是循环索引,因此它们由循环重新初始化。在 NP=2 的情况下,第一条语句将读取总共 32 个整数——它有助于确定要读取的项目列表。格式决定了它们的读取方式。随着"1X,6I12"输入文件的每行,它们将被读取为 6 个整数。当从一行/记录中读取所请求的 32 个整数中的前 6 个时,Fortran 将认为该行/记录已完成并前进到下一条记录。

具有格式"1X,6I12"的整数必须在文件中精确排列。应该有一个空格,然后每个整数都应该在 12 列的字段中右对齐。如果它们不对齐,您可能会读取错误的值或运行时错误。

于 2012-07-17T14:47:51.093 回答