比较两个指针

时间:2015-10-23 12:49:35

标签: pointers fortran fortran90

我最近遇到了如何比较Fortran中两个指针的问题。在C中,可以将两个指针与<?php date_default_timezone_set('Europe/Lisbon'); $hoje = date("Y/m/d"); $data_mudanca = date("Y")."-10-24"; echo 'Today: '.$hoje.'<br>'; echo 'ChangeDay: '.$data_mudanca.'<br>'; if($hoje > $data_mudanca){ echo 'Today is bigger'; }else{ echo 'ChangeDay is bigger'; } ?> (pA == pB)pA指针)进行比较,因为它们只是地址。但是fortran指针不仅仅是纯内存地址。代码pBif(pa.ne.pb)pa是同一类型的指针)给我一个错误

  

比较运算符的操作数&#39; .ne。&#39;在(1)是   TYPE(sometype。这时候)/ TYPE(sometype。这时候)

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

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

2 个答案:

答案 0 :(得分:11)

作为High Performance Mark commentsassociated内在函数可以部分地执行您想要的操作:

if (.not.ASSOCIATED(pa, pb)) ...

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

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_loc确定的C地址。使用type(t)目标继续上述代码,

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

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

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

总而言之,ASSOCIATED(pa, pb)通常会出现.TRUE.返回pa的情况,当且仅当pbbyte[] bytes = Encoding.BigEndianUnicode.GetBytes(sendMsg.Text); 指向相同的目标时,两者都有例外情况方向。

答案 1 :(得分:3)

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

if (associated(pA, pB)