Fortran - 矩阵索引越界

时间:2013-05-04 17:46:12

标签: matrix fortran

我是通过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)”任何想法为什么它不会第一次刺破它?非常感谢。

1 个答案:

答案 0 :(得分:1)

gfortran bugzilla中将此引发为错误非常重要。修复后会收到一封电子邮件,然后您可以下载最新版本。

在print语句中没有进行算术运算时,它看起来忽略了bounds-check标志。如果最后一个打印语句已经读过

write(*,*) mat_b(6:)

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

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

当存在边界检查违规时,这会导致它崩溃。

相关问题