Fortran Coder

模块内子程序使用动态数组的问题

查看数: 15171 | 评论数: 6 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2017-3-6 10:03

正文摘要:

问题描述:我写了个程序,有三个源文件,一个模块var.f90(里面定义了主程序内使用的一些变量),一个模块proc.f90(里面use了var,并定义了子程序内部用到的变量,封装了三个子程序),一个主程序use了var和proc,调 ...

回复

大头鼹鼠 发表于 2017-3-6 13:15:40
1)将real(kind=8) alloctable::xx(:,:)写入moudule
2)在主程序use moudle
3)同在子程序allcoted(xx(bb,cc)),结束后释放空间就可以
lihu8918 发表于 2017-3-6 10:39:13
vvt 发表于 2017-3-6 10:33
1. 因为子程序内部的数组,在子程序返回的时候,会自动被 deallocate
2. 是的,你加了判断,就避免了重复分 ...

好的,学习了!
vvt 发表于 2017-3-6 10:33:40
1. 因为子程序内部的数组,在子程序返回的时候,会自动被 deallocate
2. 是的,你加了判断,就避免了重复分配。但是会有一个问题,如果你第二次想要分配的大小,和你第一次分配的不一样。
那么就会造成,你以为分配了,就不再进行分配。但是大小却不一样。
3. 所以,最佳的方法是,在合适的位置,对其进行 deallocate。
lihu8918 发表于 2017-3-6 10:24:21
vvt 发表于 2017-3-6 10:08
这是动态数组多次分配了。如果你的 cal_tracer 函数被多次调用的话,就会这样。 ...

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

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-5-4 12:06

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表