分配大矩阵时的Fortran总线错误(gfortran)

时间:2014-11-15 16:50:19

标签: memory-management fortran fortran95

当我使用gfortran编译以下Fortran代码并运行它时,它给我'信号SIGBUS:访问内存对象的未定义部分',只要n> = 180。我是在Mac OSX Mavericks上运行的。

PROGRAM almatrix
  IMPLICIT NONE
  INTEGER :: i,j,n
  REAL,ALLOCATABLE :: a(:,:)
  READ(*,*)n
  ALLOCATE(a(n+1,n+1))
  DO i=0,n
    DO j=0,n
      a(i,j)=0.0
    END DO
  END DO
  DEALLOCATE(a)
END PROGRAM almatrix

我明白了,而不是

ALLOCATE(a(n+1,n+1))

ALLOCATE(a(n+1,n+1),STAT=err)
IF(err /= 0) STOP

可以防止崩溃。然而,它没有。为什么? 我试图看看类似的问题,但到目前为止他们没有帮助。 我尝试使用-Wall, -g, -fcheck=all进行编译,如另一个答案所示,但那些没有给我警告。

我之前也注意到,与C不同,Fortran在使用小型动态数组时不会出现总线错误,也不会解除分配。

1 个答案:

答案 0 :(得分:1)

问题不在于allocate语句,而在于访问生成的数组。 [另请注意,数组181x181不是“大”。]由于分配没有任何问题,err确实为零。

allocate那里留下一个数组a,其中包含元素a(1,1)a(2,1),...,a(n+1,1),..., a(n+1,n+1)。因此,a(0,0)(循环中的第一次访问)无效。

有两个选项:请求循环所需的数组元素为a(0,0)a(n,n),或者更改循环:

allocate(a(0:n,0:n))

do i=1,n+1
  do j=1,n+1
    a(j,i) = 0  ! Note I've changed the order to Fortran-friendly
  end od
end do

最后,这些循环甚至不是必需的:

allocate(a(0:n,0:n))
a = 0.

甚至

allocate(a(0:n,0:n), source=0.)

如果您的编译器晚于Fortran 95。