在Fortran中区分泛型而不是类型/种类/等级

时间:2018-01-21 15:14:39

标签: pointers fortran standards explicit-interface allocatable-array

我使用巨大使用非1索引ALLOCATABLE数组,这些数组的实际较低(以及因此上限)界限我想知道它们的程序#39 ;重新赋予IN / INOUT args(所以我将这些伪参数声明为延迟形状数组,以使它们与它们的边界一起传递;请参阅示例代码中的f_deferred_all

但是

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

  

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

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

  1. 这是"解决方案"不知何故被贬低,气馁,危险或其他什么?我问这个是因为我真的没有使用POINTER这么多。
  2. 此外,我定义了一个pntr函数,它将POINTER返回到其唯一的(非ALLOCATABLE数组或数组的一部分)IN put参数,所以我可以使用它" in-line"没有在主程序中定义POINTER而我不必将TARGET属性放在实际参数上。

    1. 我是否可以使用pntr创建临时数组?我想是的,但我不确定定义POINTER并将其与主程序联系起来是否会在这方面产生影响。
    2. 是否有可能/有计划/是否有意义改变标准以允许区分泛型?如果有意义,可以在哪里发布这些建议?
    3. 以下是示例。

      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
      

1 个答案:

答案 0 :(得分:4)

您的示例代码不符合规范,因为特定名称F_DEFERRED_PTRF_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-007r1discussion的链接。