我最近遇到了如何比较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指针不仅仅是纯内存地址。代码pB
(if(pa.ne.pb)
和pa
是同一类型的指针)给我一个错误
比较运算符的操作数&#39; .ne。&#39;在(1)是 TYPE(sometype。这时候)/ TYPE(sometype。这时候)
其中sometype是指针指向的类型。
有没有办法比较两个指针是否指向同一个目标?或者我是否必须为指向的类型创建pb
- 运算符?
答案 0 :(得分:11)
作为High Performance Mark comments,associated
内在函数可以部分地执行您想要的操作:
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
的情况,当且仅当pb
和byte[] bytes = Encoding.BigEndianUnicode.GetBytes(sendMsg.Text);
指向相同的目标时,两者都有例外情况方向。
答案 1 :(得分:3)
associated()函数接受第二个可选指针参数。然后,您可以测试两个指针是否与同一目标相关联:
if (associated(pA, pB)