如何诊断fortran中的总线错误

时间:2015-10-19 14:20:56

标签: fortran

我正在学习如何使用fortran进行一些数据分析。我正在通过以下示例:

program linalg
  implicit none

  real :: v1(3), v2(3), m(3,3)
  integer :: i,j

  v1(1) = 0.25
  v1(2) = 1.2
  v1(3) = 0.2

  ! use nested do loops to initialise the matrix
  ! to the unit matrix
  do i=1,3
     do j=1,3
        m(i,j) = 0.0
     end do
     m(i,j) = 1.0
  end do

  ! do a matrix multiplicationof a vector equivalent to v2i = mij v1j
  do i = 1,3
     v2(i) = 0.0
     do j = 1,3
        v2(i) = v2(i) + m(i,j)*v1(j)
     end do
  end do

  write(*,*) 'v2 = ', v2

end program linalg

我用

执行
f95 -o linalg linalg.f90
./linalg

但是,我在终端中收到以下消息:

Bus error

我在网上关注的一些链接表明这与未预先定义变量有关,但我确信我在此脚本中无法找到错误的来源。还有另一个原因我会得到这个错误吗?

1 个答案:

答案 0 :(得分:6)

你的错误就在这里

  do i=1,3
     do j=1,3
        m(i,j) = 0.0
     end do
     m(i,j) = 1.0    ! here be a dragon
  end do

Fortran明确指出,在循环结束后,索引变量的值比循环的最后一次迭代时的值大1。因此,在这种情况下,语句m(i,j) = 1.0将尝试在第一轮处理m(1,4),然后m(2,4),等等。

有时候你很幸运#39;尝试在数组的边界外写入,写入保留在您正在处理的进程的地址空间内。' Lucky'从某种意义上说,你的程序是错误的但不会崩溃 - 这种崩溃是一个更好的情况。bus error表明编译器生成了一个写入的地址,位于禁区内任何过程。

您可以通过启用“运行时限制检查”来自行找到此信息。用你的编译器。您的编译器文档或其他Q和As在此处将告诉您如何执行此操作。

我会留下你按照自己的意愿解决这个问题,你现在知道规则就能显示出能够弄明白的每一个迹象。