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

问题描述 投票:2回答:2

我不确定根据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, buf_out, n, MPI_INTEGER, MPI_SUM, MPI_COMM_WORLD, mpierr)

end subroutine 

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

call mpi_allreduce( buf, buf_out, n, MPI_REAL, MPI_SUM, MPI_COMM_WORLD, mpierr)

end subroutine 


subroutine GLB_SUM_FLT_INPLACE(buf, n)
implicit none 
integer, intent(in) :: n
real, intent(inout)   :: buf(n)


call mpi_allreduce( MPI_IN_PLACE, buf, n, MPI_REAL, MPI_SUM, MPI_COMM_WORLD, mpierr)

end subroutine 



end module 

program test_gather

use mpi_intf_exam

implicit none

integer :: rank, ierr, nranks, n, 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, nranks, ierr)

n = 10
allocate(bufs(n))

ptr => bufs

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

print*, sum(bufs), rank
end program

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

pointers fortran mpi intel-fortran
2个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.