比较两个指针

PVi*_*itt 4 fortran pointers fortran90

我最近遇到了如何比较Fortran中的两个指针的问题.在C中,可以比较两个指针(pA == pB)(带pApB指针),因为它们只是地址.但是fortran指针不仅仅是纯内存地址.代码if(pa.ne.pb)(带有papb是同一类型的指针)给了我一个错误

比较运算符'.ne.'的操作数 at(1)是TYPE(sometype)/ TYPE(sometype)

其中sometype是指针指向的类型.

有没有办法比较两个指针是否指向同一个目标?或者我是否必须为.ne.指向的类型创建一个-operator?

fra*_*lus 11

作为高性能马克评论associated内在部分可以做你想做的:

if (.not.ASSOCIATED(pa, pb)) ...
Run Code Online (Sandbox Code Playgroud)

在许多情况下,使用associated两个指针参数将告诉您两个目标是否"占用相同的存储单元".在某些意义上,当指针指向同一目标时就是这种情况.

integer, target :: a
integer, pointer :: pa, pb
pa=>a; pb=>a

print*, ASSOCIATED(pa, pb)
Run Code Online (Sandbox Code Playgroud)

唉,事情并非如此简单.

标量目标的另一个限制是它们不是零大小的存储.采取以下案例

type t
end type t

type(t), target :: a
type(t), pointer :: pa, pb
pa=>a; pb=>a

print*, ASSOCIATED(pa, pb)
Run Code Online (Sandbox Code Playgroud)

如果类型的变量t具有零大小的存储,则其输出必须是.FALSE.,即使它们肯定是相同的目标.类型对象的存储大小t是实现细节.

对于零大小的数组也是如此,尽管很明显这里的结果是.FALSE.:

integer, target :: a(0)
integer, pointer :: pa(:), pb(:)
pa=>a; pb=>a

print*, ASSOCIATED(pa, pb)
Run Code Online (Sandbox Code Playgroud)

如果你有第一种你关心的病态病例,可能会考虑使用C地址和Fortran 2003 C互操作性.

c_associated函数比较由C确定的C地址c_loc.用type(t)目标继续上面的代码,

print*, C_ASSOCIATED(C_LOC(pa), C_LOC(pb))
Run Code Online (Sandbox Code Playgroud)

可能会更宽容.同样,它是否有效取决于实施.

对于零长度字符串或零大小的数组,这种使用C地址的方法无济于事:c_loc在这些情况下禁止使用.

总而言之,通常情况是ASSOCIATED(pa, pb)返回.TRUE.if且仅当if papb指向同一目标,但两个方向都有例外.