2

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
4

1 に答える 1

2

これは gfortran のバグに違いありません。そこには何も問題はありません。また、Intel および Oracle コンパイラでも機能します。gfortran 開発者に報告するのが最善です。gfortran 4.8トランクの 2 日前のビルドだけで試してみました。

このエラーは、スタック/ヒープの違いとは関係ありません。allocateステートメント中にクラッシュするだけです。stat=と設定しても機能しませんerrmsg=

モジュールとメイン プログラムを 1 つのソース ファイル内に含めることができます。

于 2013-02-27T09:36:18.400 に答える