PVi*_*itt 4 fortran pointers fortran90
我最近遇到了如何比较Fortran中的两个指针的问题.在C中,可以比较两个指针(pA == pB)(带pA和pB指针),因为它们只是地址.但是fortran指针不仅仅是纯内存地址.代码if(pa.ne.pb)(带有pa和pb是同一类型的指针)给了我一个错误
比较运算符'.ne.'的操作数 at(1)是TYPE(sometype)/ TYPE(sometype)
其中sometype是指针指向的类型.
有没有办法比较两个指针是否指向同一个目标?或者我是否必须为.ne.指向的类型创建一个-operator?
fra*_*lus 11
作为高性能马克评论的associated内在部分可以做你想做的:
if (.not.ASSOCIATED(pa, pb)) ...
在许多情况下,使用associated两个指针参数将告诉您两个目标是否"占用相同的存储单元".在某些意义上,当指针指向同一目标时就是这种情况.
integer, target :: a
integer, pointer :: pa, pb
pa=>a; pb=>a
print*, ASSOCIATED(pa, pb)
唉,事情并非如此简单.
标量目标的另一个限制是它们不是零大小的存储.采取以下案例
type t
end type t
type(t), target :: a
type(t), pointer :: pa, pb
pa=>a; pb=>a
print*, ASSOCIATED(pa, pb)
如果类型的变量t具有零大小的存储,则其输出必须是.FALSE.,即使它们肯定是相同的目标.类型对象的存储大小t是实现细节.
对于零大小的数组也是如此,尽管很明显这里的结果是.FALSE.:
integer, target :: a(0)
integer, pointer :: pa(:), pb(:)
pa=>a; pb=>a
print*, ASSOCIATED(pa, pb)
如果你有第一种你关心的病态病例,可能会考虑使用C地址和Fortran 2003 C互操作性.
该c_associated函数比较由C确定的C地址c_loc.用type(t)目标继续上面的代码,
print*, C_ASSOCIATED(C_LOC(pa), C_LOC(pb))
可能会更宽容.同样,它是否有效取决于实施.
对于零长度字符串或零大小的数组,这种使用C地址的方法无济于事:c_loc在这些情况下禁止使用.
总而言之,通常情况是ASSOCIATED(pa, pb)返回.TRUE.if且仅当if pa和pb指向同一目标,但两个方向都有例外.