大型动态数组Fortran声明-seg错误



我希望在fortran95中使用allocate(matrix(size))对大数组使用动态声明,而size=10^7,内容为实数*8。如果size<13*10^6,一切运行顺利,没有任何错误,但如果size>13*10^6,那么我得到一个分段错误在运行。我使用动态声明是很重要的,因为数组的大小是在程序中计算的。我使用Mac OSX 64位和gfortran 4.6。有人能帮帮我吗?

real*8的10**7个元素是76 MiB,所以应该没有问题(我已经成功地用GFortran分配了几个GiB数组,尽管我不使用OSX)。你能贴一个独立的例子,以便进一步分析你的问题吗?

下面是一个使用大小为10**8的数组的示例。它适用于我的Mac OS X和gfortran 4.6。在你的电脑上能用吗?

program test_lrg
   integer, parameter :: DoubleReal_K = selected_real_kind (14)
   integer, parameter :: QuadReal_K = selected_real_kind (32)
   integer, parameter :: RegularInt_K = selected_int_kind (8)
   integer, parameter :: VeryLongInt_K = selected_int_kind (18)
   real (DoubleReal_K), dimension (:), allocatable :: array
   integer (RegularInt_K) :: i
   integer (RegularInt_K), parameter :: N = 100000000_RegularInt_K
   real (QuadReal_K) :: sum
   integer (VeryLongInt_K) :: CalcSum
   allocate (array (N))
   do i=1, N
      array (i) = i
   end do
   do i=1, N
      sum = sum + array (i)
   end do
   write (*, *) sum
   CalcSum = N
   CalcSum = ( CalcSum * (CalcSum + 1_VeryLongInt_K) ) / 2_VeryLongInt_K
   write (*, *) CalcSum
   stop
end program test_lrg

尝试使用调试选项进行编译,例如:

-fimplicit-none  -Wall  -Wline-truncation  -Wcharacter-truncation  -Wsurprising  -Waliasing  -Wimplicit-interface  -Wunused-parameter  -fwhole-file  -fcheck=bounds  -fcheck=do  -fcheck=mem  -fcheck=recursion  -std=f2008  -pedantic  -fbacktrace

最新更新