一个指针用于不同类型的Fortran

时间:2014-03-28 17:12:11

标签: pointers fortran

我正在尝试编写一个过程,该过程存储用户数组的地址以供进一步处理。问题被封装在这个测试程序中:

program test_ptr
    real(4), target, allocatable :: i4(:,:)
    real(8), target, allocatable :: i8(:,:)
    real(4), pointer :: p(:,:)

    allocate(i4(2,2))
    allocate(i8(2,2))

    p => i4 ! ok
    p => i8 ! compile error
end 

编译器建议为不同类型制作不同的指针。 但我不想为real(4)和real(8)创建单独的指针。我试图制作通用和紧凑的解决方案,并有一个指针用于不同类型的数据。有可能吗?

2 个答案:

答案 0 :(得分:5)

可以使用p的<无限制>多态性来执行此操作。

program test_ptr
  implicit none

  real(kind(0.)), target :: r4(2,2)
  real(kind(0d0)), target :: r8(2,2)

  class(*), pointer :: p(:,:)

  ! some assignments, etc.

  if (...some crazy condition...) then
    p => r4
  else
    p => r8
  end if

  select type (p)
    type is (real(kind(0.)))
      print *, p
    type is (real(kind(0d0)))
      print *, p
  end select

end program

稍后使用select type时要特别注意p

答案 1 :(得分:2)

如果你真的想存储地址我会小心多态。指向多态变量的指针通常指向具有与实际数据不同的地址的描述符。考虑使用type(c_ptr)模块中定义的iso_c_binding和函数c_loc()来获取地址。它不必仅用于连接到C,有几个地方它在纯Fortran中很方便。