2017-12-18 258 views
0

最近,我在我的Fortran代碼段錯誤 - 用Fortran無效的內存參考

Program received signal SIGSEGV: Segmentation fault - invalid memory reference. 

Backtrace for this error: 
#0 0x2AD9B0F8FE08 
#1 0x2AD9B0F8EF90 
#2 0x2AD9B12D44AF 
#3 0x401A3E in MAIN__ at tstreadin.f90:? 

和我的代碼收到以下錯誤如下

Program www 

implicit none 
integer ::i,j,rows,cols,row 
real(kind=8) ::x,y,z 
real(kind=8),allocatable::mat(:,:),xrange(:),yrange(:) 
real(kind=8),allocatable::pot_bar(:,:),acc_bar_x(:,:),acc_bar_y(:,:) 
real(kind=8),allocatable::pot_sph(:,:),acc_sph_x(:,:),acc_sph_y(:,:) 
rows=2250000 
cols=8 
row=1500 
allocate(mat(cols,rows)) 
allocate(xrange(row),yrange(row),pot_bar(row,row)) 
allocate(acc_bar_x(row,row),acc_bar_y(row,row)) 
allocate(pot_sph(row,row),acc_sph_x(row,row),acc_sph_y(row,row)) 
open(24,file='pot.txt',status='old',form='Formatted', access='SEQUENTIAL') 
do i=1,rows,1 
    read(24,*)mat(:,i) 
enddo 
close(24) 
do i=1,rows,row 
    xrange(i)=mat(1,i) 
enddo 
do i=1,row,1 
    yrange(i)=mat(2,i) 
enddo 
do i=1,row,1 
    do j=1,row,1 
     pot_bar(j,i)=mat(3,j+(i-1)*1500) 
     acc_bar_x(j,i)=mat(4,j+(i-1)*1500) 
     acc_bar_y(j,i)=mat(5,j+(i-1)*1500) 
     pot_sph(j,i)=mat(6,j+(i-1)*1500) 
     acc_sph_x(j,i)=mat(7,j+(i-1)*1500) 
     acc_sph_x(j,i)=mat(8,j+(i-1)*1500) 
    enddo 
enddo 
print*,xrange 
print*,yrange 
end Program www 

我想從ASCII配置文件輸入數據數組,所以我編寫了測試代碼。這是我第一次使用Fortran,而且我完全不明白錯誤出現的原因。

+0

歡迎,請參加[旅遊]。在組件中啓用調試檢查以輕鬆識別錯誤。在gfortran手冊中學習標誌'-g -fbacktrace -Wall -fcheck = all'。它們非常有用。當顯示錯誤消息時,應始終使用「-g」標誌。請注意'kind = 8'是一個醜陋的壞習慣,並且使代碼不可移植。在所有編譯器中,「8」並不意味着雙精度。請參閱https://stackoverflow.com/questions/838310/fortran-90-kind-parameter –

回答

3

數組xrange僅分配了1500個元素。然而在以下

do i=1,rows,row 
    xrange(i)=mat(1,i) 
enddo 

你正試圖與索引遠遠大於1500(行>> 1500)來訪問的xrange的元素。因此無效的內存引用。