2012-10-14 34 views
3

我一直在瘋狂嘗試讀取一些數據到我的簡單程序中的數組。我無法弄清楚爲什麼我會遇到分段錯誤。我的代碼開始:Fortran中的非常簡單的程序給了我一個分段錯誤。非常困惑

program guess_input 
implicit none 

CHARACTER*2, allocatable, dimension(:) :: element 
double precision, allocatable, dimension(:,:)  :: xyzq 
INTEGER, allocatable, dimension(:)     :: label,cs_num, br_num, xx_num 
real, allocatable, dimension(:)     :: distance 
real, allocatable, dimension(:)     :: ep 
INTEGER        :: stat, numatom, i, j 
CHARACTER*80 :: line 

numatom = 61502 
allocate(element(numatom)) 
allocate(xyzq(4,numatom)) 
allocate(label(numatom)) 

OPEN(UNIT=22,FILE='EMBQ_EPF.OUT',iostat=stat) 
If(stat.ne.0) Stop "File not found" 

!Read in the input into two arrays 

do i=1,numatom 
READ(22,'(A)') line 
READ(line, *) xyzq(1,i), xyzq(2,i), xyzq(3,i), xyzq(4,i), label(i) 
enddo 
CLOSE(22) 

!Define element type in parallel array based on the charge 
do i=1,numatom 
if(xyzq(4,i) == 1.00) then 
      element(i) = 'Cs' 
elseif(xyzq(4,i) == -1.00) then 
      element(i) = 'Br' 
else 
     element(i) = 'XX' 
    endif 
enddo 

OPEN(33, FILE='element.out') 
do i=1,numatom 
write(33,*) element(i) 
enddo 

end program guess_input 

我試過隔離錯誤,但我真的不能解決什麼問題。

任何幫助將不勝感激,謝謝。

+1

沒有輸入文件就很難猜測。我生成了一些假輸入(在python中:'for i in xrange(61502):fd.write(「%d \ t%d \ t%d \ t%d \ t%s \ n」%(1, -1,-1,-1 + i%5,'22'))'),工作正常。 – abbot

+1

你能告訴我們它的段錯誤嗎?使用GDB或其他? – tpg2114

+3

由於您只發布了一部分代碼,並且您沒有確定發生分段錯誤的行或塊,因此您可以向我們保證,您發佈的片段會導致分段錯誤,這樣我們就不會浪費時間尋找錯誤的地方。 –

回答

2

我建議使用運行時下標檢查進行編譯,如果你還沒有完成所有的準備工作。分段錯誤的一個可能原因是下標錯誤。在調試過程中使用最大的編譯器診斷信息很有幫助。隨着gfortran:-O2 -fimplicit-none -Wall -Wline-truncation -Wcharacter-truncation -Wsurprising -Waliasing -Wimplicit-interface -Wunused-parameter -fwhole-file -fcheck=all -std=f2008 -pedantic -fbacktrace。使用ifort:-O2 -stand f03 -assume realloc_lhs -check all -traceback -warn all -fstack-protector -assume protect_parens -implicitnone-fcheck=all-check all包括運行時間下標檢查;如果需要,可以選擇運行時間下標檢查 - 查閱編譯器文檔。

另外:精確比較浮點值是有風險的。我建議要麼將xyzq爲整型變量或測試的範圍:

if(abs (xyzq(4,i) - 1.00) < 0.01) then 
+0

'1.0'可以用單曲和雙精度IEEE 745精確表示,但是您的筆記仍然適用。 +1 –

1

要了解你可以使用的ValgrindMEMCHECK工具分割故障的原因。語法很簡單:

valgrind --tool=memcheck --leak-check=full <binary> <arguments> 

該工具應爲您提供在memory-management problems發生的源代碼的確切行。

+0

與C/C++不同,Fortran不會丟失內存分配的軌跡,大多數F90 +實現使用數組描述符,這使得它們可以在必要時執行運行時邊界檢查。在這種情況下使用'valgrind'有點矯枉過正。 –

0

你的編譯器足夠聰明,知道你的意思是「numatom」和「i」是4字節整數嗎?如果不是,並且它假設您的意思是「整數」爲2個字節,那麼您將深入到負面存儲空間的神祕世界。

+0

雖然Fortran標準沒有指定默認'INTEGER'類型的大小,但我懷疑現在的Fortran處理器默認使用16位整數(除非他使用的是一些舊的16位DOS處理器......) ) –

相關問題