2

大量使用非1索引ALLOCATABLE数组,我希望知道它们的实际下限(以及上限),因为它们被赋予为IN/ INOUTargs 的过程(所以我将这些虚拟参数声明为延迟形状数组以制作它们与它们的界限一起传递;参见f_deferred_all示例代码)。

但。

有时这些过程(在数据声明部分之后)可以处理作为子数组的实际参数,所以当需要时,我通常最终制作一个过程的副本,更改其参数声明及其名称(参见过程f_assumed)。最好通过INTERFACE. 但是标准说我不能,因为

特定过程或绑定的接口通过其参数的固定属性来区分,特别是类型、种类类型参数、等级以及虚拟参数是否具有 POINTER 或 ALLOCATABLE 属性。

在下面的示例程序中,我通过使用指针实参和伪参数克服了这个“限制”(请参阅​​ 参考资料f_deferred_ptr)。

  1. 这个“解决方案”是否以某种方式被弃用、不鼓励、危险或其他什么?我问这个是因为我真的没有POINTER这么多地使用 s 。

此外,我定义了一个pntr函数,该函数将 a 返回POINTER到它的唯一(非ALLOCATABLE数组或数组的一部分)INput 参数,这样我就可以“内联”使用它而无需POINTER在主程序中定义 a 并且我没有将TARGET属性放在实际参数上。

  1. 我是否通过使用pntr创建了一个临时数组?我认为是的,但我不确定POINTER在主程序中定义和关联它是否会在这方面产生影响。
  2. 是否有可能/是否计划/更改标准以允许在仿制药之间进行这种区分是否有意义?如果这些建议有意义,在哪里发布这些建议?

这里的例子如下。

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
4

1 回答 1

4

您的示例代码不符合标准,因为具体名称F_DEFERRED_PTRF_DEFERRED_ALL明确。技术勘误 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) dummy 的实际参数可以是指针赋值语句(12.5.2.7 Pointer dummy variables J3/10-007r1)中虚拟指针的指针或有效目标。链接到问题的讨论解决方案

于 2018-01-24T10:07:56.227 回答