我有一个接口块来定义一个通用子程序,它具有一个假定大小的数组作为伪参数(为了能够作用于传递数组的中间部分,如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 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)
由于
答案 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
没有使用ifort
或gfortran
创建的临时数组。您可以使用以下方式检查:
ifort -check arg_temp_created
gfortran -Warray-temporaries