7

在 Fortran 中,我可以通过三种方法从子例程返回数组。第一个是通过intent(out)参数。第二个是通过具有数组的函数作为result. 第三个是有一个函数作为result指向数组的指针,它在函数中分配。

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

4

2 回答 2

5

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

更新:意图(出)数组参数没有问题......不需要对数组的大小做出假设,如以下示例所示:

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
于 2011-01-05T15:51:41.053 回答
0
  1. `intent(out)` 可能是一个问题,因为您必须对传入的数组的大小做出假设。
  2. 返回一个数组也是一个问题,因为接收代码必须对返回的数组的大小做出假设
  3. 指向数组的指针存在与大小相关的问题以及对指针是否关联进行假设的问题。
  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 类型。请记住在完成数组后释放它们......

于 2011-01-05T16:00:32.307 回答