返回数组策略比较

问题描述:

在Fortran中,我可以用三种方法从子例程返回数组。第一个是通过intent(out)参数。第二个是通过具有result阵列的函数。第三个函数的功能是result指向数组的指针,该指针在函数中分配。返回数组策略比较

每种方法的优点和缺点是什么?

我的做法是在函数只改变一个变量而不作其他输出时使用函数返回值。如果多个变量被更改或者过程执行其他操作,我会将输出变量放在参数列表中。这是一种风格选择。使用指针创建内存泄漏是可能的,尤其是指针作为函数参数返回时,所以我会避免使用这个选项,除非在特定情况下有令人信服的理由。

UPDATE:没有与意图(下)数组参数没有问题......任何假设需要进行关于所述阵列的大小,如下面的示例示出了:

module example_one 

implicit none 

contains 

subroutine two_arrays (in_arr, out_arr) 

    integer, dimension (:), intent (in) :: in_arr 
    integer, dimension (:), allocatable, intent (out) :: out_arr 

    integer :: i, len 

    len = size (in_arr) 

    allocate (out_arr (1:len)) 

    do i=1, len 
     out_arr (i) = 3 * in_arr (i) 
    end do 

return 

end subroutine two_arrays 

end module example_one 


program test 

use example_one 

implicit none 

integer, dimension (1:5) :: in_arr = [ 1, 2, 4, 5, 10 ] 
integer, dimension (:), allocatable :: out_arr 

write (*, *) allocated (out_arr) 
call two_arrays (in_arr, out_arr) 

write (*, *) size (out_arr) 
write (*, *) out_arr 

write (*, *) allocated (out_arr) 
deallocate (out_arr) 
write (*, *) allocated (out_arr) 

stop 

end program test 
+0

当你使用不同策略返回时,是否存在堆栈崩溃等问题?假设你返回一百万个实数。你会溢出堆栈,并将它从函数上下文复制到调用者上下文中吗? – 2011-01-05 16:33:15

  1. `意图( )可能是一个问题,因为你必须对传入的数组大小做出假设。
  2. 返回一个数组也是一个问题,因为接收代码将不得不做出关于返回的数组大小的假设
  3. 指向数组的指针存在与大小和问题相关的问题o f假设指针是否关联。
  4. 另一种方法是创建一个模块,并且该模块中具有同时包含分配数组和一个整数,详细说明该阵列的尺寸的类型:
module mymodule 
    type myvector 
     double precision,allocatable::values(:) 
     integer::length 
    end type 
end module 

那么你的功能可以是:

function myvecreturner(someparam) 
    use mymodule 
    type(myvector)::myvecreturner 
    integer::someparam 

    allocate(myvecreturner%values(someparam)) 
    myvecreturner%length = someparam 
end function 

你可以愉快地传递这些myvector类型。只要记住当你完成它们时释放阵列...

+1

好吧,从技术上讲,你已经拥有一个数组的大小,而不需要一个类型。用'size'查询可以达到同样的效果。 – 2011-01-07 09:10:26

+0

还有#2的解决方案。函数可以返回可分配数组。请参阅http://stackoverflow.com/questions/4647772/function-returning-array-with-no-defined-explicit-shape – 2011-01-10 17:03:10