Fortran Coder

查看: 62|回复: 3

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

[复制链接]

9

帖子

3

主题

0

精华

入门

F 币
47 元
贡献
26 点
发表于 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 币
47 元
贡献
26 点
 楼主| 发表于 2019-4-27 14:49:21 | 显示全部楼层
重载好像也不行,会提示GENERIC procedure ‘anomaly’ is not allowed as an actual argument

97

帖子

8

主题

0

精华

大师

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

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

9

帖子

3

主题

0

精华

入门

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

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

本版积分规则

QQ|捐赠本站|Archiver|关于我们 About Us|群聊|Fcode

GMT+8, 2019-5-25 15:43

Powered by Discuz! X3.2

© 2001-2017 Comsenz Inc.

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