我希望在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