调用参数为指针别名的子例程

根据Fortran标准,我不确定这是否合法。我有一个通过重载调用的子例程。这里的意思是有时我可能会调用子例程,在该子例程中我有指向real的指针别名。 请看一下完整的代码。

module mpi_intf_exam
use mpi

interface GLB_SUM
module procedure GLB_SUM_INT
module procedure GLB_SUM_FLT
module procedure GLB_SUM_FLT_INPLACE
end interface 
integer :: mpierr

contains 


subroutine GLB_SUM_INT(buf,buf_out,n)
implicit none 
integer,intent(in) :: n
integer,intent(in)   :: buf(n)
integer,intent(out) :: buf_out(n)

call mpi_allreduce( buf,n,MPI_INTEGER,MPI_SUM,MPI_COMM_WORLD,mpierr)

end subroutine 

subroutine GLB_SUM_FLT(buf,intent(in) :: n
real,intent(in)   :: buf(n)
real,MPI_REAL,mpierr)

end subroutine 


subroutine GLB_SUM_FLT_INPLACE(buf,intent(inout)   :: buf(n)


call mpi_allreduce( MPI_IN_PLACE,buf,mpierr)

end subroutine 



end module 

program test_gather

use mpi_intf_exam

implicit none

integer :: rank,ierr,nranks,i
real,allocatable,target :: bufs(:),bufr(:)
real,pointer :: ptr(:)
call mpi_init(ierr)
call MPI_COMM_RANK(MPI_COMM_WORLD,rank,ierr)
call MPI_COMM_SIZE(MPI_COMM_WORLD,ierr)

n = 10
allocate(bufs(n))

ptr => bufs

call random_number(ptr)
ptr = ptr*(rank+1)
print*,sum(bufs),"BEF"
call GLB_SUM(ptr,n) !

print*,rank
end program

我的呼叫call GLB_SUM(ptr,n)旨在调用例程GLB_SUM_FLT_INPLACE。但是正如您所看到的,当我使用real pointer调用它时,该子例程具有真正的哑元参数。 对于此特定示例,它适用于IFORT V19.0.5。但这有效吗?我找不到标准对这种电话的评价。

zjhsir123 回答:调用参数为指针别名的子例程

以这种方式使用指针是合法的。

在过程引用中使用指针对应于非指针虚拟参数时,该指针的目标被视为与实际参数关联。指针本身必须与指针关联。对于Fortran 2018,您可以看到15.5.2.3。

对于问题,泛型GLB_SUM的每个特定子例程都没有指针参数。

,

将指针传递给非指针虚拟参数没有问题。 Fortran不需要您从其他编程语言中就可以知道的任何取消引用。该子例程仅接收作为指针目标的数组。可以。

本文链接:https://www.f2er.com/3156674.html

大家都在问