Fortran Coder

查看: 15553|回复: 6
打印 上一主题 下一主题

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

[复制链接]

10

帖子

3

主题

0

精华

入门

F 币
24 元
贡献
33 点
跳转到指定楼层
楼主
发表于 2017-3-6 10:03:36 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
问题描述:我写了个程序,有三个源文件,一个模块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。
编译没问题,但运行时出现如下错误,请问是什么原因,怎么解决呢?先谢谢了!


分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
沙发
发表于 2017-3-6 10:08:58 | 只看该作者
这是动态数组多次分配了。如果你的 cal_tracer 函数被多次调用的话,就会这样。

10

帖子

3

主题

0

精华

入门

F 币
24 元
贡献
33 点
板凳
 楼主| 发表于 2017-3-6 10:23:36 | 只看该作者
谢谢版主回复!
我想着有两个解决方法,不知到对不对,希望您指点指点
1,我发现把real,allocatable 这几个声明语句写到子程序cal_tracer内部可以解决问题,不知到这样对不对?
2,将子程序内的allocate改为
if (.not. allocated()) then
allocate()
end if

10

帖子

3

主题

0

精华

入门

F 币
24 元
贡献
33 点
地板
 楼主| 发表于 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

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
5#
发表于 2017-3-6 10:33:40 | 只看该作者
1. 因为子程序内部的数组,在子程序返回的时候,会自动被 deallocate
2. 是的,你加了判断,就避免了重复分配。但是会有一个问题,如果你第二次想要分配的大小,和你第一次分配的不一样。
那么就会造成,你以为分配了,就不再进行分配。但是大小却不一样。
3. 所以,最佳的方法是,在合适的位置,对其进行 deallocate。

10

帖子

3

主题

0

精华

入门

F 币
24 元
贡献
33 点
6#
 楼主| 发表于 2017-3-6 10:39:13 | 只看该作者
vvt 发表于 2017-3-6 10:33
1. 因为子程序内部的数组,在子程序返回的时候,会自动被 deallocate
2. 是的,你加了判断,就避免了重复分 ...

好的,学习了!

66

帖子

16

主题

0

精华

专家

F 币
452 元
贡献
271 点
7#
发表于 2017-3-6 13:15:40 | 只看该作者
1)将real(kind=8) alloctable::xx(:,:)写入moudule
2)在主程序use moudle
3)同在子程序allcoted(xx(bb,cc)),结束后释放空间就可以
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-12-25 21:19

Powered by Tencent X3.4

© 2013-2024 Tencent

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