首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用假设大小数组在fortran中使用泛型子程序

如何使用假设大小数组在fortran中使用泛型子程序
EN

Stack Overflow用户
提问于 2014-06-18 13:53:21
回答 1查看 1.8K关注 0票数 4

我有一个接口块来定义一个通用子例程,它的假设大小数组作为虚拟参数(以便能够对传递的数组的‘中间’进行操作,就像一个C指针),并且它不编译。下面是简单的例子:

代码语言:javascript
复制
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的,它说:

代码语言:javascript
复制
$ 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)

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-18 14:59:08

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

代码语言:javascript
复制
call sub(ai(2:2))

它正在传递一个长度为1的数组。我想知道为什么call isub(ai(2))会被接受.

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

如果将自己限制在连续数组上,则可以使用call sub(ai(2:4)) ,而不需要使用延迟形状数组来降低性能:

代码语言:javascript
复制
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
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24287436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档