如何将fortran指针传递给子程序?

时间:2016-01-23 07:21:18

标签: pointers attributes fortran

由于某种原因,我需要将Fortran指针传递给子例程。子程序位于模块内,主程序使用该模块确保显式接口。

我的问题是,为了接收传入的指针,我应该在子程序的伪参数上指定什么属性?

我尝试了下面的代码。

program main

    use aaa

    implicit none

    integer*4 :: i1, ierr
    integer*4, target  :: arr(10)
    integer*4, pointer :: ptr_arr(:)

    do i1 = 1, 10
        arr(i1) = i1
    end do

    ptr_arr => arr

    ierr = print_ptr_arr_1( ptr_arr )
    ierr = print_ptr_arr_2( ptr_arr )
    ierr = print_ptr_arr_3( ptr_arr )

    nullify( ptr_arr )

end program main

sj2734@sonaram:~/work/practice/fortran_pointer$ ./a.out 
 as pointer
          10
  1  2  3  4  5  6  7  8  9 10

 as target
          10
  1  2  3  4  5  6  7  8  9 10

 as assumed shape array
          10
  1  2  3  4  5  6  7  8  9 10

sj2734@sonaram:~/work/practice/fortran_pointer$

模块aaa中的三个子程序显示如下正确的输出。

{{1}}

什么是正确的,什么不是?或者,这些都是正确的吗?

1 个答案:

答案 0 :(得分:2)

这取决于您将如何使用您传递给该功能的内容。你需要它作为指针吗?然后给它pointer属性。你需要用函数中的另一个指针指向它吗?然后,为其指定target属性。伪参数将采用您提供的任何属性。

如果将其声明为pointer,则可以将其用作指针并分配/指向函数内的新事物。

如果你将它声明为target,那么函数中的其他指针可以指向它,但是你不能指向它target,因为它是'不是指针。

如果您只想将其视为数组,那么您可以将其声明为假定大小的数组,并将其视为常规数组,但同样您又无法以相同的方式使用它好像它有pointertarget属性。

所以他们在某种程度上是对的。这取决于背景。但是,除非您确实需要它作为特定原因的指针或目标,并且您只是将其视为一个数组,那么您最好将其声明为假定大小的数组以避免潜在的记忆问题。