2

我正在通过 Ubuntu 在 Fortran 中进行编码,并使用 make 文件来运行编译器——当涉及到编译器时,我有点新手,但我认为问题就在于此。我做了一些研究,我的问题与这里提出的问题相同:Index of matrix out of range。但是,在我的情况下,-C(检查边界)标志一直处于打开状态,而我最近才遇到这个问题。我根本没有改变编译器,所以非常困惑。所以例如我写:

  REAL, ALLOCATABLE   :: mat_b(:,:)
  INTEGER             :: i

  ALLOCATE(mat_b(5,5))
  mat_b = 0.0
  DO i = -1, 10
        WRITE(*,*) mat_b(i,:)
  END DO

  WRITE(*,*) 100000*mat_b(6,:)

很高兴写第一个:

     -0.98799251802048516        0.0000000000000000        0.0000000000000000        0.0000000000000000        0.0000000000000000     
  4.43497120311741914E-312   0.0000000000000000        0.0000000000000000        0.0000000000000000        0.0000000000000000     
   0.0000000000000000        0.0000000000000000        0.0000000000000000        0.0000000000000000        0.0000000000000000     
   0.0000000000000000        0.0000000000000000        0.0000000000000000        0.0000000000000000        0.0000000000000000     
   0.0000000000000000        0.0000000000000000        0.0000000000000000        0.0000000000000000        0.0000000000000000     
   0.0000000000000000        0.0000000000000000        0.0000000000000000        0.0000000000000000        0.0000000000000000     
   0.0000000000000000        0.0000000000000000        0.0000000000000000        0.0000000000000000        0.0000000000000000     
   0.0000000000000000        0.0000000000000000        0.0000000000000000        0.0000000000000000       1.05365618368981430E-312
   0.0000000000000000        0.0000000000000000        0.0000000000000000        0.0000000000000000      -4.64431912125404020E-042
   0.0000000000000000        0.0000000000000000        0.0000000000000000        0.0000000000000000       0.13957067792614544     
   0.0000000000000000        0.0000000000000000        0.0000000000000000        0.0000000000000000       3.60739284562909423E-313
   0.0000000000000000        0.0000000000000000        0.0000000000000000        0.0000000000000000       7.03660474880717784E-002

但确实抱怨第二个写语句说它“超出预期范围(1:5)”知道为什么它没有第一次把它刺起来吗?非常感谢。

4

1 回答 1

1

在gfortran bugzilla中将此作为错误提出是很重要的。修复后您会收到一封电子邮件,然后您可以下载最新版本。

当打印语句中没有进行任何算术运算时,它看起来会忽略边界检查标志。如果最后一个打印语句已读取

write(*,*) mat_b(6:)

它不会触发边界检查。由于我们现在知道它会在打印语句中有算术时检查边界,我们可以等待修复或在打印循环中执行一个简单的低成本算术函数。例如,打印语句可以重新编码为

write(*,*) 0+mat_b(i:)

当存在边界检查违规时,这将导致它翻倒。

于 2013-05-06T06:36:29.687 回答