Pointers 比较两个指针
我最近遇到了一个问题:如何在Fortran中比较两个指针。在C语言中,可以将两个指针与Pointers 比较两个指针,pointers,fortran,fortran90,Pointers,Fortran,Fortran90,我最近遇到了一个问题:如何在Fortran中比较两个指针。在C语言中,可以将两个指针与(pA==pB)(其中pA和pB作为指针)进行比较,因为它们只是地址。但在fortran中,指针不仅仅是纯内存地址。代码if(pa.ne.pb)(其中pa和pb是相同类型的指针)给了我一个错误 (1)处比较运算符“.ne.”的操作数为 类型(sometype)/类型(sometype) 其中sometype是指针指向的类型 有没有办法比较两个指针是否指向同一个目标?或者我必须为所指向的类型创建一个.ne.-运算
(pA==pB)
(其中pA
和pB
作为指针)进行比较,因为它们只是地址。但在fortran中,指针不仅仅是纯内存地址。代码if(pa.ne.pb)
(其中pa
和pb
是相同类型的指针)给了我一个错误
(1)处比较运算符“.ne.”的操作数为
类型(sometype)/类型(sometype)
其中sometype是指针指向的类型
有没有办法比较两个指针是否指向同一个目标?或者我必须为所指向的类型创建一个.ne.
-运算符吗?因为关联的内在函数可以部分实现您想要的功能:
if (.not.ASSOCIATED(pa, pb)) ...
在许多情况下,使用与两个指针参数关联的将告诉您两个目标是否“占用相同的存储单元”。在某些意义上,当指针指向同一个目标时就是这种情况
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地址。使用类型(t)
目标继续上述代码
print*, C_ASSOCIATED(C_LOC(pa), C_LOC(pb))
可能会更宽容。同样,它是否有效取决于实施情况
对于长度为零的字符串或大小为零的数组,这种使用C地址的方法没有帮助:在这些情况下禁止使用C_loc
总之,通常情况下,ASSOCIATED(pa,pb)
返回.TRUE。
当且仅当pa
和pb
指向同一目标,但在两个方向上都存在异常。函数采用第二个可选指针参数。然后,您可以测试两个指针是否与同一目标关联:
if (associated(pA, pB)
[这不是答案,但]对于示例if(pa.ne.pb)
而言,这不是指针的比较,而是指针目标的比较。为这种类型创建简单定义的运算符无助于解决查看目标是否为相同变量(而不是具有相同值)的问题。您可能正在查找相关的内在函数,
,请参阅您最喜欢的参考资料以获取解释。感谢您提供详细的答案。我有点惭愧,因为我不知道associated
能够做到这一点。但我无论如何都不知道你提供的细节。