bar
フィールドが に存在する場合、次のプログラムが SIGSEGV で segfault し、コメントアウトされている場合は問題なく動作する理由がわかりませんcontainerType
。私は x86_64 を使用しており、gfortran-4.4.6 と gfortran-4.6.3 の両方でコンパイルしています。
私が理解しているように、へのポインターを使用するcontainerType
と、含まれている大きな配列の割り当てがヒープ上で強制的に発生するはずですが、そうではないようです。実行valgrind
可能ファイルで実行すると、
Warning: client switching stacks? SP change: 0x7ff000448 --> 0x7fe0603f8
to suppress, use: --max-stackframe=16384080 or greater
(残りの出力は関係ありませんが、必要に応じて編集できます)。これは、スタック オーバーフローがあることを示しています。おそらく、スタックに 8*8*8*4000 * 8(1 実数バイト) = 16384000 バイトを割り当てたためです。
bar
フィールドをコメントアウトすると、valgrind
完全に幸せです。さらに奇妙なことに、「-O」を指定して gfortran-4.6.3 でコンパイルすると、問題が解消されます (gfortran-4.4.6 ではそうではありません)。
コンパイラのバグに出くわしたか、(おそらく、Fortran にかなり慣れていないため) データがどこに割り当てられているかを理解していません。誰かが私に何が起こっているのか教えてもらえますか?
問題のコード:
main.f90:
program main
use problematicArray
implicit none
type (containerType),pointer :: container
allocate(container)
container%foo%arrayData = 17.0
write(*,*) container%foo%arrayData(7,7,7,100)
deallocate(container)
write(*,*) 'Program finished'
end program main
問題のあるArray.f90:
module problematicArray
implicit none
private
integer, parameter, public :: dim1 = 4000
type, public :: typeWith4DArray
real(8), dimension(8,8,8,dim1) :: arrayData
end type typeWith4DArray
type :: typeWithChars
character(4), dimension(:), allocatable :: charData
end type typeWithChars
type, public :: containerType
type(typeWith4DArray) :: foo
type(typeWithChars) :: bar
end type containerType
end module problematicArray