我大量使用非1
索引ALLOCATABLE
数组,我希望知道它们的实际下限(以及上限),因为它们被赋予为IN
/ INOUT
args 的过程(所以我将这些虚拟参数声明为延迟形状数组以制作它们与它们的界限一起传递;参见f_deferred_all
示例代码)。
但。
有时这些过程(在数据声明部分之后)可以处理作为子数组的实际参数,所以当需要时,我通常最终制作一个过程的副本,更改其参数声明及其名称(参见过程f_assumed
)。最好通过INTERFACE
. 但是标准说我不能,因为
特定过程或绑定的接口通过其参数的固定属性来区分,特别是类型、种类类型参数、等级以及虚拟参数是否具有 POINTER 或 ALLOCATABLE 属性。
在下面的示例程序中,我通过使用指针实参和伪参数克服了这个“限制”(请参阅 参考资料f_deferred_ptr
)。
- 这个“解决方案”是否以某种方式被弃用、不鼓励、危险或其他什么?我问这个是因为我真的没有
POINTER
这么多地使用 s 。
此外,我定义了一个pntr
函数,该函数将 a 返回POINTER
到它的唯一(非ALLOCATABLE
数组或数组的一部分)IN
put 参数,这样我就可以“内联”使用它而无需POINTER
在主程序中定义 a 并且我没有将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