3

私は単純なプログラムでいくつかのデータを配列に読み込もうとして夢中になっています。セグメンテーション違反が発生する理由がわかりません。私のコードは次のように始まります:

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

障害を切り分けようとしましたが、何が問題なのか本当にわかりません。

どんな助けでも大歓迎です、ありがとう。

4

3 に答える 3

2

まだ準備が整っていない場合は、実行時の添え字チェックを使用してコンパイルすることをお勧めします。セグメンテーション違反の考えられる原因の 1 つは、添字エラーです。デバッグ中に最大限のコンパイラ診断を使用すると便利です。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
于 2012-10-14T16:08:47.477 に答える
1

セグメンテーション違反の原因を見つけるには、Valgrindのmemcheckツールを使用できます。構文は非常に単純です。

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

このツールは、メモリ管理の問題が発生するソースコードの正確な行を提供する必要があります。

于 2012-10-14T16:53:25.893 に答える
0

あなたのコンパイラは、"numatom" と "i" が 4 バイト整数であることを意味することを理解できるほど賢いですか? そうでない場合、「INTEGER」の長さは 2 バイトであると見なされ、負のメモリ空間の不思議な世界を掘り下げることになります。

于 2012-10-15T06:31:28.713 に答える