比较两个指针

Compare two pointers

提问人:PVitt 提问时间:10/23/2015 更新时间:10/24/2015 访问量:1881

问:

我最近遇到了如何在 Fortran 中比较两个指针的问题。在 C 语言中,可以将两个指针与(with 和 being 指针)进行比较,因为它们只是地址。但在 fortran 中,指针不仅仅是纯粹的内存地址。代码(具有相同类型的指针)给了我一个错误(pA == pB)pApBif(pa.ne.pb)papb

比较运算符 '.ne.' 在 (1) 处的操作数为 类型(某种类型)/类型(某种类型)

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

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

指针 Fortran Fortran90

评论

1赞 francescalus 10/23/2015
[这不是一个答案,但是]对于示例,这不是指针的比较,而是指针目标的比较。为此类型创建一个朴素定义的运算符无助于解决查看目标是否为相同变量(而不是具有相同值)的问题。if(pa.ne.pb)
3赞 High Performance Mark 10/23/2015
您可能正在寻找内在函数,请参阅您最喜欢的参考资料以获取解释。associated

答:

15赞 francescalus 10/23/2015 #1

正如 High Performance Mark 所评论的那样,内在可以部分地做你想做的事: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 地址。使用目标继续上述代码,c_associatedc_loctype(t)

print*, C_ASSOCIATED(C_LOC(pa), C_LOC(pb))

可能更宽容。同样,它是否有效取决于实现。

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

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

评论

0赞 PVitt 10/24/2015
感谢您的详细回答。我有点惭愧,我不知道自己有能力做到这一点。但无论如何,我不会知道你提供的细节。associated
4赞 Vladimir F Героям слава #2

associated() 函数采用第二个可选的指针参数。然后,您可以测试两个指针是否与同一目标相关联:

if (associated(pA, pB)