把子程序的局部变量定义到mod中作为全局变量后运行出错
本帖最后由 大橙子cqx 于 2020-4-6 20:19 编辑因为一些原因我需要把一些局部变量改写成全局变量,比如下面:
MODULE dynspg
CONTAINS:
SUBROUTINE dyn_spg_ts( kt )
REAL(wp), DIMENSION(jpi,jpj) :: zCdU_u, zCdU_v
....
这两个变量我想定义在MODULE下作为全局变量,因为我把这个名为dyn_spg_ts的子程序拆分成了好几个子程序,而这两个变量是要在这些子程序之间传递的。
但是当我把他们写成:
REAL(wp), ALLOCATABLE, PUBLIC, DIMENSION(:,:) :: zCdU_u, zCdU_v
然后放在MODULE下时,编译通过但是运行时会报错:
Program received signal SIGSEGV: Segmentation fault - invalid memory reference.
Backtrace for this error:
#00x7FE6046E5C57
#10x7FE6046E4E50
#20x3CF7C358EF
#30x7F3662 in __dynspg_ts_MOD_dyn_drg_init
#40x818012 in __dynspg_ts_MOD_dynspg_ts1
#50x820425 in __dynspg_ts_MOD_dyn_spg_ts
#60x7EA57B in __dynspg_MOD_dyn_spg
#70x46A847 in __step_MOD_stp
#80x41ADA0 in __nemogcm_MOD_nemo_gcm
这两个变量在我拆的子程序的第一部分dynspg_ts1中被用到的部分是:CALL dyn_drg_init( zu_frc, zv_frc,zCdU_u, zCdU_v )
SUBROUTINE dyn_drg_init的部分结构为:
SUBROUTINE dyn_drg_init( pu_RHSi, pv_RHSi, pCdU_u, pCdU_v )
REAL(wp), DIMENSION(jpi,jpj), INTENT(out) :: pCdU_u , pCdU_v
pCdU_u = ....
然后这两个变量在dynspg_ts3中被调用,之后就没有了。
因为程序比较大所以只能这样描述一下,主要是希望有人能提供一下可能是哪里出错的思路。。
FAQ之 常见错误分析
http://fcode.cn/guide-36-1.html li913 发表于 2020-4-7 09:57
FAQ之 常见错误分析
http://fcode.cn/guide-36-1.html
谢谢你的解答,我刚刚发现问题是出在这些数组没有DEALLOCATE上。我之前曾经认为是数组没有分配的问题,所以尝试去ALLOCATE数组 但是运行时会报错说重复分配已分配的数组 让我以为这个思路是错的 后来才发现是没有释放内存导致的。。我猜测说重复分配的原因可能是因为这个程序会执行多次 希望可以给遇到相同问题的人一点思路。。 你可以先分配,在执行这个程序,完了再释放。或者在程序里分配、使用、释放。 li913 发表于 2020-4-7 12:41
你可以先分配,在执行这个程序,完了再释放。或者在程序里分配、使用、释放。 ...
感谢 已经解决了!
页:
[1]