私は次の問題に直面していて、何が起こっているのか理解できません。
コードの先頭にいくつかの作業配列を割り当てるルーチンがあります。これらの作業配列はデータ構造の一部です。
構造は次のように定義されます。
Type bond_stat
Real*8,Allocatable,Dimension( : , : ) ::data_space
Real*8,Allocatable,Dimension( : , : ) ::data_time
Real*8,Allocatable,Dimension( : ) ::bin_width
Real*8,Allocatable,Dimension( : ) ::time
Integer,Allocatable,Dimension( : , : ) ::connection_table
End Type bond_stat
Type( bond_stat ),allocatable,dimension( : ) ::Hbonds
これはモジュール内で行われます。私がしている次のステップは、この構造を次のように割り当てることです。
Allocate( Hbonds( 1:2 ) )
次に、構造体に含まれている配列が割り当てられるサブルーチンを呼び出します。奇妙なことに、配列を次のように割り当てようとすると、
Allocate( Hbonds( i )%data_space( 1 : 3 , 1 : Nbins ) )
Allocate( Hbonds( i )%data_time( 1 : 1 , 1 : Nbins ) )
Allocate( Hbonds( i )%time( 1 : N ) )
Allocate( Hbonds( i )%bin_width( 1 : 2 ) )
Allocate( Hbonds( i )%connection_table( 1 : 2 , 1 : N ) ) )
そうすると、実行中にコードが状態を示します。たとえば、時間配列はすでに割り当てられています。以前にこの配列を割り当てなかったことを100%確信しています。また、配列は以前は使用されていなかったと確信しており、すでに使用されているため、コンパイラが配列を割り当てている可能性があります。そのため、配列がすでに割り当てられているかどうかを確認し、割り当てられている場合は、割り当てを解除して再割り当てすることを考えました。そうすると、割り当て解除ラインでセグメンテーション違反が発生します。
If ( Allocated( Hbonds( i )%time ) ) then
Deallocate( Hbonds( i )%time )
End If
Allocate( Hbonds( i )%time( 1 : N ) )
私はここで何が起こっているのか完全に戸惑っています。誰でも助けてください。出力は次のようになります。
Program received signal SIGSEGV: Segmentation fault - invalid memory
reference.
Backtrace for this error:
#0 0x2b54685d3f0d in ???
#1 0x2b54685d314d in ???
#2 0x2b5468e4acaf in ???
#3 0x2b5468e9715c in ???
#4 0x4d27cf in __bond_statistics_MOD_bond_stat_init
at/fs/home/jona/programs/gfortran/eval_new01/playground/H_bond_analysis.f90:35
#5 0x4c8f5f in __bond_statistics_MOD_prep_bond_stat
at/fs/home/jona/programs/gfortran/eval_new01/playground/H_bond_analysis.f90:
350
#6 0x44477a in ???
#7 0x446724 in ???
#8 0x2b5468e35f44 in ???
#9 0x4016c8 in ???
#10 0xffffffffffffffff in ???
Segmentation fault (core dumped)
そして、次のようになる前に配列の割り当てを解除しようとしない場合:
At line 38 of file H_bond_analysis.f90
Fortran runtime error: Attempting to allocate already allocated variable 'hbonds'
Error termination. Backtrace:
#0 0x2ae8991bef0d in ???
#1 0x2ae8991bfa45 in ???
#2 0x2ae8991bfdfa in ???
#3 0x4d28e5 in __bond_statistics_MOD_bond_stat_init
at/fs/home/jona/programs/gfortran/eval_new01/playground/H_bond_analysis.f90:38
#4 0x4c8f5f in __bond_statistics_MOD_prep_bond_stat
at/fs/home/jona/programs/gfortran/eval_new01/playground/H_bond_analysis.f90:350
#5 0x44477a in ???
#6 0x446724 in ???
#7 0x2ae899a20f44 in ???
#8 0x4016c8 in ???
#9 0xffffffffffffffff in ???
38行目が時間が割り当てられている行です。フラグ付きのgfortranコンパイラを使用していますFLAGS = -fopenmp -g -Wall -fcheck = all -fbounds-check
私は今、問題がどこにあるのかを理解しました。私はmakefileを使用してコードをコンパイルしています。今日、bond_statモジュールにさらにいくつかの配列を追加したかったのですが、makefileを実行した後、同じエラーが再び発生しました。私が今やったことは、コード自体を何も変更せずに、すべてのモジュールを手動で再コンパイルすることです。これで問題は解決しました。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加