我使用巨大使用非1
索引ALLOCATABLE
数组,这些数组的实际较低(以及因此上限)界限我想知道它们的程序#39 ;重新赋予IN
/ INOUT
args(所以我将这些伪参数声明为延迟形状数组,以使它们与它们的边界一起传递;请参阅示例代码中的f_deferred_all
)
但是
有时这些过程(在数据声明部分之后)可以处理作为子数组的实际参数,所以当需要时,我通常最终制作过程的副本,更改其参数声明及其名称( cf。程序f_assumed
)。最好通过INTERFACE
将两个程序放在同一个名称下。但standard说我不能,因为
特定程序或绑定的接口区分 固定其参数的属性,特别是类型,种类 参数,等级以及伪参数是否具有POINTER或 ALLOCATABLE属性。
在下面的示例程序中,我克服了这个"限制"通过使用指针实际和伪参数(参见f_deferred_ptr
)。
POINTER
这么多。此外,我定义了一个pntr
函数,它将POINTER
返回到其唯一的(非ALLOCATABLE
数组或数组的一部分)IN
put参数,所以我可以使用它" in-line"没有在主程序中定义POINTER
而我不必将TARGET
属性放在实际参数上。
pntr
创建临时数组?我想是的,但我不确定定义POINTER
并将其与主程序联系起来是否会在这方面产生影响。以下是示例。
module mymod
implicit none
interface f
module procedure f_deferred_all, f_deferred_ptr!, f_assumed
end interface f
contains
integer function f_assumed(x) result(y)
integer, dimension(:), intent(in) :: x
y = lbound(x,1)
end function f_assumed
integer function f_deferred_ptr(x) result(y)
integer, pointer, dimension(:), intent(in) :: x
y = lbound(x,1)
end function f_deferred_ptr
integer function f_deferred_all(x) result(y)
integer, allocatable, dimension(:), intent(in) :: x
y = lbound(x,1)
end function f_deferred_all
function pntr(v) result(vp)
integer, dimension(:), target, intent(in) :: v
integer, dimension(:), pointer :: vp
vp => v
end function pntr
end module mymod
program prog
use mymod
implicit none
integer :: i
integer, dimension(-5:5) :: v1
integer, dimension(:), allocatable :: v2
v1 = [(i, i = 1, 11)]
allocate(v2, source = v1)
print *, 'f_assumed(v1)', f_assumed(v1)
print *, 'f(pntr(v1))', f(pntr(v1(:))) ! is a temporary created?
print *, 'f(v2)', f(v2)
end program prog
答案 0 :(得分:4)
您的示例代码不符合规范,因为特定名称F_DEFERRED_PTR
和F_DEFERRED_ALL
不明确。 Technical Corrigendum f08/0001更改" 12.4.3.4.5对通用声明的限制"中的措辞,添加" 而不是INTENT(IN)属性" ,到
Two dummy arguments are distinguishable if
• one is a procedure and the other is a data object,
• they are both data objects or known to be functions, and neither is TKR compatible with the other,
• one has the ALLOCATABLE attribute and the other has the POINTER attribute and not the INTENT(IN) attribute, or
• one is a function with nonzero rank and the other is not known to be a function.
这是因为POINTER,INTENT(IN)虚拟的实际参数可以是指针或指针赋值语句中伪指针的有效目标(12.5.2.7指针虚拟变量{{3} })。指向问题的J3/10-007r1和discussion的链接。