返回数组策略比较
在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
- `意图( )可能是一个问题,因为你必须对传入的数组大小做出假设。
- 返回一个数组也是一个问题,因为接收代码将不得不做出关于返回的数组大小的假设
- 指向数组的指针存在与大小和问题相关的问题o f假设指针是否关联。
- 另一种方法是创建一个模块,并且该模块中具有同时包含分配数组和一个整数,详细说明该阵列的尺寸的类型:
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类型。只要记住当你完成它们时释放阵列...
好吧,从技术上讲,你已经拥有一个数组的大小,而不需要一个类型。用'size'查询可以达到同样的效果。 – 2011-01-07 09:10:26
还有#2的解决方案。函数可以返回可分配数组。请参阅http://stackoverflow.com/questions/4647772/function-returning-array-with-no-defined-explicit-shape – 2011-01-10 17:03:10
当你使用不同策略返回时,是否存在堆栈崩溃等问题?假设你返回一百万个实数。你会溢出堆栈,并将它从函数上下文复制到调用者上下文中吗? – 2011-01-05 16:33:15