通过指针引用重叠数组

时间:2015-07-08 13:02:13

标签: arrays pointers fortran overlap

我需要使用调整到重叠数组的指针执行memmove()样式操作。更准确地说,我需要将b(:)复制到a(:)

Pointers aliasing illustration

在C编程语言中,我会调用memmove(a, b, N)。但是,据我所知,Fortran Standard在指针别名方面非常严格。

因此,以下三个选项中的哪一个是安全的(根据标准),哪些会导致未定义的行为:

  • 带有别名指针的矢量语法(选项1),
  • 使用别名指针显式执行do-loop(选项2),
  • 调用以重叠数组作为参数的例程(选项3)

program ptr
  implicit none
  integer, parameter :: ARRAY_SIZE = 10, N = 6
  integer, target :: array(ARRAY_SIZE)
  integer, dimension(:), pointer :: a, b
  integer :: i

  a => array(1: N)
  b => array(3: N+2)

  ! Option 1
  a(1: N) = b(1: N)

  ! Option 2
  do i = 1, N
    a(i) = b(i)
  end do

  ! Option 3
  call foobar(a, b, N)

  contains

    subroutine foobar(a, b, length)
      integer, dimension(:), intent(out) :: a
      integer, dimension(:), intent(in) :: b
      integer, intent(in) :: length

      a(1: length) = b(1: length)
    end subroutine foobar
end program ptr

1 个答案:

答案 0 :(得分:3)

选项1和2都可以,编译器知道指针可以别名。

子程序本身是正常的,但你不能传递两个别名参数,这确实违反标准(未定义的行为是C术语)。您可以创建参数pointer,然后可以进行别名,并且程序将符合标准。

  integer, dimension(:), pointer :: a
  integer, dimension(:), pointer :: b

我也删除了意图,因为它们与指针关联状态有关,而与IanH评论的目标值有关。此外,还需要Fortran2003。