Fortran Coder

查看: 7121|回复: 3
打印 上一主题 下一主题

[子程序] 返回值的动态分配问题

[复制链接]

9

帖子

3

主题

0

精华

入门

F 币
49 元
贡献
27 点
跳转到指定楼层
楼主
发表于 2019-4-27 14:40:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,请教两个问题
1.请问function里手动设置动态分配数组,调用结束时,这块内存也会被自动释放吗?
如果不会的话。那我将function的返回值设置为allocatable,要怎么手动释放呢(释放了就返回不了了啊),例如下面
[Fortran] 纯文本查看 复制代码
function anomaly_1d(x) result(result)
	    implicit none
	    real, intent(in) :: x(:)
	    real, allocatable :: result(:)
	    integer :: n
	    n = size(x)
	    allocate(result(n))
	    result = x-mean(x)
	end function anomaly_1d


2. 如果若干函数都调用了函数A,一旦A的名称要改变,岂不是要逐个修改?我现在是把函数都写在module里,然后用重载换成其他的名称。有没有什么好的方法解决,比如有没有指针那样的设置别名方法?
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

9

帖子

3

主题

0

精华

入门

F 币
49 元
贡献
27 点
沙发
 楼主| 发表于 2019-4-27 14:49:21 | 只看该作者
重载好像也不行,会提示GENERIC procedure ‘anomaly’ is not allowed as an actual argument

178

帖子

15

主题

0

精华

大宗师

F 币
4973 元
贡献
1152 点
板凳
发表于 2019-4-27 15:01:23 | 只看该作者
第一个问题,子进程里的用动态数组分配的内存你不必担心,不会造成内存泄漏的,不需要你手动去释放。实际的机制应该是除了输入和输出的数组,其他的数组都在调用结束释放了。容易造成内存泄漏的都是指针,虽然动态数组基本都是用指针实现的,但是在Fortran里这个的内存管理比指针好

第二个问题,你说的办法就是标准的办法啊,通过重载之后可以通过通用名调用,原名完全可以用private之类的标识符让它不能在其他地方被调用。至于函数指针当然是有的,但是Fortran的函数指针是类型强关联的。就是函数指针有类型,由它的输入输出接口决定函数指针的类型,一个函数指针只能指向和它的输入输出接口完全一致的函数,这个东西感觉比较没啥意思。如果你只是想用它给函数指定别名,倒是完全没有问题

9

帖子

3

主题

0

精华

入门

F 币
49 元
贡献
27 点
地板
 楼主| 发表于 2019-4-27 18:41:41 | 只看该作者
liudy02 发表于 2019-4-27 15:01
第一个问题,子进程里的用动态数组分配的内存你不必担心,不会造成内存泄漏的,不需要你手动去释放。实际的 ...

谢谢解答~
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-4-27 02:04

Powered by Tencent X3.4

© 2013-2024 Tencent

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