如何使用通用子例程在fortran中使用假定大小的数组

时间:2014-06-18 13:53:21

标签: arrays fortran90 generic-programming

我有一个接口块来定义一个通用子程序,它具有一个假定大小的数组作为伪参数(为了能够作用于传递数组的中间部分,如C指针)它没有编译。这是一个简单的例子:

module foo

  interface sub
     module procedure isub
     module procedure dsub
  end interface

  contains

  subroutine isub(a,n)
    integer, intent(in) :: a(*), n
    integer :: i
    print*, 'isub'
    do i=1,n
     print*, a(i)
    enddo
  end subroutine isub

  subroutine dsub(a)
    real(8), intent(in) :: a(*)
    integer, intent(in) :: n
    integer :: i
    print*, 'dsub'
    do i=1,n
     print*, a(i)
    enddo
  end subroutine dsub

end module foo

program test

  use foo

  implicit none

  integer :: ai(4)
  real(8) :: ad(4)

  ai=(/1,2,3,4/)
  ad=(/1.,2.,3.,4./)

  call sub(ai,3)
  call sub(ad,3)

  call isub(ai(2),3)
  !call sub(ai(2),3)

end program test

注释行不能编译,而用call isub(ai(2),3)直接调用子例程(用gfortran和ifort测试)是可以的。为什么并且可以让它与call sub(ai(2),3)一起使用?

使用ifort

编辑,它说:

$ ifort overload.f90
overload.f90(37): error #6285: There is no matching specific subroutine for this generic subroutine call.   [SUB]
  call sub(ai(2),3)
-------^
compilation aborted for overload.f90 (code 1)

由于

1 个答案:

答案 0 :(得分:3)

您正在将标量传递给期望数组的函数。尝试

call sub(ai(2:2))

传递长度为1的数组。我想知道为什么call isub(ai(2))被接受了,但是......

回答你的新问题(部分在评论中):

如果您将自己限制为连续数组,则可以使用延迟形状数组使用call sub(ai(2:4)) 而不会性能下降:

subroutine isub(a)
  integer,intent(in) :: a(:)
  integer            :: i

  print*, 'isub'
  do i=1,size(a)
    print*, a(i)
  enddo
end subroutine isub

没有使用ifortgfortran创建的临时数组。您可以使用以下方式检查:

  • ifort -check arg_temp_created

  • gfortran -Warray-temporaries