Fortran中数组索引的分段错误

时间:2017-03-28 00:38:41

标签: arrays indexing fortran

AI成为维度为N的整数类型的数组。通常,I是整数1:N的排列。我想做A(1:N) = A(I(1:N))。对于较小的N,这可以正常工作,但Segmentation fault很大时我得到了N。 这是我实际做的一个例子:

integer N
integer,dimension(:),allocatable::A,I
N = 10000000
allocate(A(N))
allocate(I(N))
A = (/ (i,i=1,N) /)
I = (/ (N-i+1,i=1,N) /)
A(1:N) = A(I(1:N))

有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

似乎A(I(1:N))是有效的语法,至少在我的测试中gfortran 4.8ifort 16.0pgfortran 15.10)。一个问题是iI是相同的,并且数组I不能像你一样在暗示中使用。用j替换它会产生一个为我运行的程序:

program main
   implicit none

   integer :: N, j
   integer, allocatable, dimension(:) :: A, I

   ! -- Setup
   N = 10000000
   allocate(A(N),I(N))
   A = (/ (j,j=1,N) /)
   I = (/ (N-j+1,j=1,N) /)

   ! -- Main operation
   A(1:N) = A(I(1:N))

   write(*,*) 'A(1): ', A(1)
   write(*,*) 'A(N): ', A(N)

end program main

至于为什么你会看到分段错误,我猜你在阵列大小变大时会耗尽内存。如果你仍然遇到麻烦,我建议如下。

您应该使用循环,例如

,而不是使用A(1:N) = A(I(1:N))
! -- Main operation
do j=1,N
   Anew(j) = A(I(j))
enddo
A = Anew

这更易于阅读,也更容易调试。