2017-03-22 15 views
0

私はFortran 90コード(下記)を書いていますが、segfault(コアダンプ)エラーが発生します。コアダンプとは何ですか?どのように修正しますか?Fortran 90のセグメンテーションフォルト(コアダンプ)

program make_pict 
    IMPLICIT NONE 
    INTEGER, PARAMETER :: REAL8=SELECTED_REAL_KIND(15,300) 
    INTEGER, SAVE :: nstp,npr,step 
    REAL(REAL8), SAVE :: r 
    REAL(REAL8), DIMENSION(:,:), ALLOCATABLE, SAVE :: f,fa 
    INTEGER :: xw,yw,x,y 
    REAL:: ax,ay 
    INTEGER, DIMENSION(250000) :: pxa 
    REAL(REAL8) :: s,s2 
    LOGICAL, SAVE :: initialized=.FALSE. 

    WRITE(*,*) 'give values ax,ay' 
    READ(*,*) ax,ay 
    xw = 256 
    yw = 256 

    OPEN(1,FILE='picture.pxa') 

    do x=0, xw-1 
     do y=0, yw-1 
      f(x,y)=(765./2)*(ax*(1-cos(2*3.14159*x*(1.0/xw)))+ay(1+cos(2*3.14159*y*(1.0/yw)))) 
     end do 
    end do 

    WRITE(1,'(2I6)') xw,yw 
    ALLOCATE(f(0:xw-1,0:yw-1),fa(0:xw-1,0:yw-1)) 
    DO y=0,yw-1 
    WRITE(1,'(256I4)') (f(x,y),x=0,xw-1) 
    END DO 
    CLOSE(1)  
    initialized=.TRUE. 

    step=0 
    nstp=100 
end program make_pict 

答えて

1

割り当て前にfを設定しようとしています。それを設定するダブルループの前にallocate文が必要です!この問題を自分で解決する1つの方法は、どこにでも出力ステートメントを置くことです。これはエラーの位置を特定します。

他のいくつかの問題は私が気づいた:あなたはay(*を逃している

  • 。私はこのコードが実際にあなたのためにコンパイルされているのに驚いています。
  • piにこのような低精度の値を使用しているのはなぜですか? 15小数点までの精度を要求していますが、piの値は6にしかなりません。
  • step、nstp、initializedの目的は何ですか?彼らは機能が実装されていると思いますか? minimal, complete, and verifiable exampleを提供するよう努めなければなりません。
  • save属性を追加しても、ここでは何も行われません。実際に何が行われているのかを読むべきですが、通常は必要ありません。あるプログラムでは、それは間違いなく何もしません。

2番目の質問に答えるには、さまざまな理由でセグメンテーションが発生する可能性があります。コアダンプされるのは、システムがセグメンテーションフォルトを処理することだけです。セグメンテーションフォルトには多くの原因があります。割り当てられていない配列にアクセスしようとする試みの1つです。

+0

私はいくつかのコンパイラフラグは、この種の問題のデバッグに本当に役立つことを追加します。 gfortranについては、 '-g -Wall -fcheck = all'で始めるでしょう。 –

関連する問題