由于某种原因,我需要将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}}
什么是正确的,什么不是?或者,这些都是正确的吗?
答案 0 :(得分:2)
这取决于您将如何使用您传递给该功能的内容。你需要它作为指针吗?然后给它pointer
属性。你需要用函数中的另一个指针指向它吗?然后,为其指定target
属性。伪参数将采用您提供的任何属性。
如果将其声明为pointer
,则可以将其用作指针并分配/指向函数内的新事物。
如果你将它声明为target
,那么函数中的其他指针可以指向它,但是你不能指向它target
,因为它是'不是指针。
如果您只想将其视为数组,那么您可以将其声明为假定大小的数组,并将其视为常规数组,但同样您又无法以相同的方式使用它好像它有pointer
或target
属性。
所以他们在某种程度上是对的。这取决于背景。但是,除非您确实需要它作为特定原因的指针或目标,并且您只是将其视为一个数组,那么您最好将其声明为假定大小的数组以避免潜在的记忆问题。