Fortran 认为未分配的数组已经分配
Fortran thinks non allocated array is already allocated
我面临以下问题,无法弄清楚发生了什么。
我有一个在代码开头分配一些工作数组的例程。这些工作数组是数据结构的一部分。
结构定义为:
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 后我 运行 再次陷入同样的错误。我现在所做的是手动重新编译所有模块,而不更改代码本身的任何内容。这解决了问题。
我面临以下问题,无法弄清楚发生了什么。
我有一个在代码开头分配一些工作数组的例程。这些工作数组是数据结构的一部分。
结构定义为:
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 后我 运行 再次陷入同样的错误。我现在所做的是手动重新编译所有模块,而不更改代码本身的任何内容。这解决了问题。