我正在尝试编写一个过程,该过程存储用户数组的地址以供进一步处理。问题被封装在这个测试程序中:
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)创建单独的指针。我试图制作通用和紧凑的解决方案,并有一个指针用于不同类型的数据。有可能吗?
答案 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中很方便。