Matrix Fortran—矩阵的索引越界

Matrix Fortran—矩阵的索引越界,matrix,fortran,Matrix,Fortran,我通过Ubuntu用Fortran编写代码,并使用make文件来运行编译器——当涉及到编译器时,我有点像新手,但我认为问题在于此。我做了一些研究,我的问题与这里的问题相同:。然而在我的例子中,-C(checkbounds)标志一直处于打开状态,我最近才遇到这个问题。我一点也没有更改编译器,所以非常困惑。比如我写: REAL,可分配::mat_b(:,:) 整数::i 分配(材料b(5,5)) 材料b=0.0 我是不是=-1,10 写(*,*)材料b(i,:) 结束 写(*,*)100000*材料

我通过Ubuntu用Fortran编写代码,并使用make文件来运行编译器——当涉及到编译器时,我有点像新手,但我认为问题在于此。我做了一些研究,我的问题与这里的问题相同:。然而在我的例子中,-C(checkbounds)标志一直处于打开状态,我最近才遇到这个问题。我一点也没有更改编译器,所以非常困惑。比如我写:

REAL,可分配::mat_b(:,:)
整数::i
分配(材料b(5,5))
材料b=0.0
我是不是=-1,10
写(*,*)材料b(i,:)
结束
写(*,*)100000*材料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)”吗?有人知道为什么第一次不把它捅起来吗?非常感谢。

重要的是,您必须将此作为一个错误提出。修复后,您将收到一封电子邮件,然后可以下载最新版本

在print语句中未执行任何运算时,它似乎会忽略边界检查标志。如果上次打印语句已读

write(*,*) mat_b(6:)
它不会触发边界检查。因为我们现在知道,当print语句中有算术运算时,它会检查边界,所以我们可以等待修复,或者在print循环中执行简单的低成本算术函数。例如,print语句可以重新编码为

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

这将导致它在边界检查违反时崩溃。

gfortran 4.7会拾取第二个,但不会拾取第一个。唯一的区别是变量和常量索引。。。特有的ifort检测到第一个。上有编译器诊断比较。请注意页面底部使用的编译器标志。