2017-03-02 4 views
0

NDが大きい(1000000)場合、次のコードがセグメンテーションフォルトを生成する理由を説明できますか?スタック制限を増やしても効果はありません。大きな配列コンポーネントを持つFortran派生データ型のセグメンテーションフォールト

module parametros_mod 
    integer, parameter :: ND = 1000000 
end module parametros_mod 

module data_mod 
    use parametros_mod 
    implicit none 
    private 

    type, public :: data_vec 
    real(8) :: f0 
    real(8), dimension(ND) :: fvec 
    end type data_vec 
end module data_mod 

!test program 
program test 
    use parametros_mod 
    use data_mod 
    implicit none 

    type(data_vec) :: v1 
    real(8), dimension(ND) :: rv, xv 

    rv = 0d0 
    rv(2) = 1d0 

    v1 = data_vec(1.1d0,rv) 
    xv = v1%fvec 
    write(*,'(*(f0.4,2x))') xv(1:3) 
end program test 
+0

を割り当てることによって、本当に、そこに誰かが大規模に '実数(8)'の事を教えなければならないことを回避することができます。それは良い教科書やチュートリアルから来ていません。 –

+0

gfortran 5.3でコードがクラッシュすることはありません。本当にあなたのために 'data_vec(1.1d0、rv)'の式を見ると、おそらくコンパイラで一時オブジェクトが生成されます。コンパイラ、コンパイラフラグ、オペレーティングシステムについて詳しく教えてください。 –

答えて

1

私はあなたのエラーを複製しましたが、私は大きいNDを使用しなければなりませんでした。それは実際に行です

v1 = data_vec(1.1d0,rv) 

おそらく一時オブジェクトがスタック上に作成されます。

あなたはcompnentsに

v1%f0 = 1.1d0 
v1%fvec = rv 
+0

ありがとう、ウラジミール、それは今働いています。私はGNU Fortran(Debian 4.9.2-10)4.9.2でコンパイルしています。 – Francisco

+0

問題のSOの代替ソリューションが見つかりました。「ulimit -s unlimited」とは何ですか? – Francisco

+1

スタックサイズを増やしても効果がありませんでした。それはあなた次第です。私はプログラムを多くの異なるコンピュータ上で実行し、それぞれのスタックサイズを気にしたくないので、私のプログラムは頑丈なものが好きです。 –

関連する問題