Pointers 用类型/种类/等级以外的方法区分Fortran中的泛型

Pointers 用类型/种类/等级以外的方法区分Fortran中的泛型,pointers,fortran,standards,explicit-interface,allocatable-array,Pointers,Fortran,Standards,Explicit Interface,Allocatable Array,我大量使用非1索引的可分配数组,它们的实际下界和上界我想知道它们作为IN/INOUT参数提供给的过程,所以我将这些伪参数声明为延迟形状数组,使它们与它们的边界一起传递;请参见示例代码中的f_deferred_all 但是 有时,在数据声明部分之后的这些过程可以处理作为子数组的实际参数,因此,当需要时,我通常会制作一个过程的副本,更改其参数声明及其名称cf.procedure f_。通过一个接口将两个过程放在同一个名称下会很好。但是警察说我不能,因为 特定过程或绑定的接口通过 固定了参数的属性,特

我大量使用非1索引的可分配数组,它们的实际下界和上界我想知道它们作为IN/INOUT参数提供给的过程,所以我将这些伪参数声明为延迟形状数组,使它们与它们的边界一起传递;请参见示例代码中的f_deferred_all

但是

有时,在数据声明部分之后的这些过程可以处理作为子数组的实际参数,因此,当需要时,我通常会制作一个过程的副本,更改其参数声明及其名称cf.procedure f_。通过一个接口将两个过程放在同一个名称下会很好。但是警察说我不能,因为

特定过程或绑定的接口通过 固定了参数的属性,特别是类型、种类和类型 参数、秩以及伪参数是否具有指针或 可分配属性

在下面的示例程序中,我通过使用指针实际参数和伪参数克服了这个限制

这个解决方案是不赞成、气馁、危险还是其他什么?我问这个是因为我真的没有这么多使用指针。 此外,我还定义了一个pntr函数,该函数返回指向其唯一不可分配数组或数组输入参数部分的指针,这样我就可以在线使用它,而无需在主程序中定义指针,并且不必将TARGET属性放在实际参数上

我是否使用pntr创建了一个临时数组?我想是的,但我不确定在主程序中定义指针并将其关联是否会在这方面产生影响。 是否有可能/是否计划/是否有必要对标准进行更改,以允许对泛型进行此类区分?如果这些建议有意义,在哪里发布这些建议呢? 这里的例子如下

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

您的示例代码不一致,因为F_DEFERRED_PTR和F_DEFERRED_的具体名称都不明确。更改12.4.3.4.5通用声明限制中的措辞,添加而非INTENTIN属性


这是因为指针INTENTIN dummy的实际参数可以是指针赋值语句12.5.2.7指针伪变量中的指针或伪指针的有效目标。链接到问题的和。

注意:模块应放在主程序之前。我很惊讶它能为你编译。哦,谢谢你!幸运的是,我对程序和模块使用了两个单独的文件。我无法回答你的问题,但是请注意,v1仍然需要target属性:pntr的函数结果是与伪参数vso v1关联的指针,没有target属性意味着函数完成后,函数结果就变成了未定义的关联状态。我希望我的问题至少有意义。你是说fpntrv1:中的f只是偶然地返回正确的值,这取决于编译器和其他东西吗?我认为这不必要地复杂了。你所需要的只是f_假定函数,因此根本不需要泛型。回答得好。你知道勘误的原因吗?甚至是interp的链接?interp是感谢您的链接。事实上,我同意@francescalus的观点,即最好扩展答案,明确描述目标变量可以传递给pointer,intentin,这就是为什么在泛型消歧中必须避免pointer,intentin。我没有立即看到它,尽管我也许应该看到。
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.