提问人:PVitt 提问时间:10/23/2015 更新时间:10/24/2015 访问量:1881
比较两个指针
Compare two pointers
问:
我最近遇到了如何在 Fortran 中比较两个指针的问题。在 C 语言中,可以将两个指针与(with 和 being 指针)进行比较,因为它们只是地址。但在 fortran 中,指针不仅仅是纯粹的内存地址。代码(具有相同类型的指针)给了我一个错误(pA == pB)
pA
pB
if(pa.ne.pb)
pa
pb
比较运算符 '.ne.' 在 (1) 处的操作数为 类型(某种类型)/类型(某种类型)
其中 sometype 是指针指向的类型。
有没有办法比较两个指针是否指向同一个目标?或者我是否必须为所指向的类型创建一个运算符?.ne.
答:
正如 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_associated
c_loc
type(t)
print*, C_ASSOCIATED(C_LOC(pa), C_LOC(pb))
可能更宽容。同样,它是否有效取决于实现。
对于长度为零的字符串或大小为零的数组,这种使用 C 地址的方法将无济于事:在这些情况下禁止使用。c_loc
总而言之,通常当且仅当 和 指向同一目标时返回的情况是,但在两个方向上都有例外。ASSOCIATED(pa, pb)
.TRUE.
pa
pb
评论
associated
associated() 函数采用第二个可选的指针参数。然后,您可以测试两个指针是否与同一目标相关联:
if (associated(pA, pB)
评论
if(pa.ne.pb)
associated