在子程序调用期间保持fortran中的数组限制

时间:2010-12-06 12:42:59

标签: arrays fortran fortran90

我有以下程序

module test
contains
   subroutine foo()
      integer, allocatable :: a(:)
      allocate(a(-5:5))
      call bar(a)
      print *, a
   end subroutine
   subroutine bar(a)
      integer, intent(out) :: a(:)
      a = 0 
      a(-4) = 3  ! here
      a(2) = 3   
   end subroutine
end module

program x
   use test
   call foo()
end program

在标有“here”的行中,我做错了。事实是,当我收到数组a(在从-5到+5分配的调用者中)时,被调用者使用常规编号(1到n),这意味着分配-4我正在做一个超出边界的分配。如何指示编译器在bar例程中,a数组的编号必须与调用者中的编号相同?

3 个答案:

答案 0 :(得分:4)

您正在子例程中使用的伪参数类型(使用冒号指定的维度)称为“假定形状”。这个名字是线索 - Fortran只传递形状而不是下限和上限。假设下限是1,除非你覆盖它,如kemiisto的回答所示。如果下限未修复,则可以传递参数以用作下限。

后来添加:如果编译时不知道较低维度的代码示例:

subroutine example (low, array)
   integer, intent (in) :: low
   real, dimension (low:), intent (out) :: array

答案 1 :(得分:3)

有两种常见的选择:

  • 正如kemisto所写,你传递了第二个论点。这在F77风格的代码中很常见。你不能使用LBOUND技巧!它必须作为整数传递。
  • 您将参数声明为指针,其中包含整个数组描述符。然后子例程中数组的边界与调用范围中的相同。当然,你可能会失去优化方式。

答案 2 :(得分:2)

  

如何指示编译器在条形例程中,数组的编号必须与调用者的编号相同?

不确定但是根据标准,您可以指定假定形状数组的下限。

subroutine bar(a)
      integer, intent(out) :: a(-5:)