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
を割り当てることによって、本当に、そこに誰かが大規模に '実数(8)'の事を教えなければならないことを回避することができます。それは良い教科書やチュートリアルから来ていません。 –
gfortran 5.3でコードがクラッシュすることはありません。本当にあなたのために 'data_vec(1.1d0、rv)'の式を見ると、おそらくコンパイラで一時オブジェクトが生成されます。コンパイラ、コンパイラフラグ、オペレーティングシステムについて詳しく教えてください。 –