当我使用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在使用小型动态数组时不会出现总线错误,也不会解除分配。
答案 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。