Fortran Coder

标题: 模块内子程序使用动态数组的问题 [打印本页]

作者: lihu8918    时间: 2017-3-6 10:03
标题: 模块内子程序使用动态数组的问题
问题描述:我写了个程序,有三个源文件,一个模块var.f90(里面定义了主程序内使用的一些变量),一个模块proc.f90(里面use了var,并定义了子程序内部用到的变量,封装了三个子程序),一个主程序use了var和proc,调用了一个子程序。其中:
var模块中定义了变量nx,ny
proc模块中定义了子程序cal_tracer用到的8个动态数组 ,子程序cal_tracer对这8个动态数组进行分配
主程序main中对nx, ny进行了赋值(nx=51, ny=51),并调用了cal_tracer。
编译没问题,但运行时出现如下错误,请问是什么原因,怎么解决呢?先谢谢了!



作者: vvt    时间: 2017-3-6 10:08
这是动态数组多次分配了。如果你的 cal_tracer 函数被多次调用的话,就会这样。
作者: lihu8918    时间: 2017-3-6 10:23
谢谢版主回复!
我想着有两个解决方法,不知到对不对,希望您指点指点
1,我发现把real,allocatable 这几个声明语句写到子程序cal_tracer内部可以解决问题,不知到这样对不对?
2,将子程序内的allocate改为
if (.not. allocated()) then
allocate()
end if
作者: lihu8918    时间: 2017-3-6 10:24
vvt 发表于 2017-3-6 10:08
这是动态数组多次分配了。如果你的 cal_tracer 函数被多次调用的话,就会这样。 ...

谢谢版主回复!
我想着有两个解决方法,不知到对不对,希望您指点指点
1,我发现把real,allocatable 这几个声明语句写到子程序cal_tracer内部可以解决问题,不知到这样对不对?
2,将子程序内的allocate改为
if (.not. allocated()) then
allocate()
end if
作者: vvt    时间: 2017-3-6 10:33
1. 因为子程序内部的数组,在子程序返回的时候,会自动被 deallocate
2. 是的,你加了判断,就避免了重复分配。但是会有一个问题,如果你第二次想要分配的大小,和你第一次分配的不一样。
那么就会造成,你以为分配了,就不再进行分配。但是大小却不一样。
3. 所以,最佳的方法是,在合适的位置,对其进行 deallocate。
作者: lihu8918    时间: 2017-3-6 10:39
vvt 发表于 2017-3-6 10:33
1. 因为子程序内部的数组,在子程序返回的时候,会自动被 deallocate
2. 是的,你加了判断,就避免了重复分 ...

好的,学习了!
作者: 大头鼹鼠    时间: 2017-3-6 13:15
1)将real(kind=8) alloctable::xx(:,:)写入moudule
2)在主程序use moudle
3)同在子程序allcoted(xx(bb,cc)),结束后释放空间就可以





欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2