Fortran Coder

标题: 返回值的动态分配问题 [打印本页]

作者: 清宵逝水    时间: 2019-4-27 14:40
标题: 返回值的动态分配问题
大家好,请教两个问题
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里,然后用重载换成其他的名称。有没有什么好的方法解决,比如有没有指针那样的设置别名方法?

作者: 清宵逝水    时间: 2019-4-27 14:49
重载好像也不行,会提示GENERIC procedure ‘anomaly’ is not allowed as an actual argument
作者: liudy02    时间: 2019-4-27 15:01
第一个问题,子进程里的用动态数组分配的内存你不必担心,不会造成内存泄漏的,不需要你手动去释放。实际的机制应该是除了输入和输出的数组,其他的数组都在调用结束释放了。容易造成内存泄漏的都是指针,虽然动态数组基本都是用指针实现的,但是在Fortran里这个的内存管理比指针好

第二个问题,你说的办法就是标准的办法啊,通过重载之后可以通过通用名调用,原名完全可以用private之类的标识符让它不能在其他地方被调用。至于函数指针当然是有的,但是Fortran的函数指针是类型强关联的。就是函数指针有类型,由它的输入输出接口决定函数指针的类型,一个函数指针只能指向和它的输入输出接口完全一致的函数,这个东西感觉比较没啥意思。如果你只是想用它给函数指定别名,倒是完全没有问题
作者: 清宵逝水    时间: 2019-4-27 18:41
liudy02 发表于 2019-4-27 15:01
第一个问题,子进程里的用动态数组分配的内存你不必担心,不会造成内存泄漏的,不需要你手动去释放。实际的 ...

谢谢解答~




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