我目前正在尝试学习如何使用VST。我使用的是VST 1.5。我有这个小C程序( private void updateView(int index){
View v = yourListView.getChildAt(index -
yourListView.getFirstVisiblePosition());
if(v == null)
return;
TextView someText = (TextView) v.findViewById(R.id.sometextview);
someText.setText("Hi! I updated you manually!");
}
):
backref.c
我的Coq代码(具有微不足道的前后条件)是
char* rbr (char* out, int length, int dist) {
while (length-- > 0) { out[0] = out[-dist]; out++; }
return out;
}
作为前提条件,我想说Require Import floyd.proofauto.
Require Import backref.
Local Open Scope logic.
Local Open Scope Z.
Definition rbr_spec :=
DECLARE _rbr
WITH sh : share, contents : Z -> int
PRE [ _out OF (tptr tuchar), _length OF tint, _dist OF tint ]
PROP ()
LOCAL ()
SEP ()
POST [tptr tuchar] local(fun _ => True).
到out[-dist]
是可读的,out[-1]
到out[0]
是可写的。 PLCC第210页告诉条件out[length-1]
,但它似乎在VST 1.5中不可用。我怎么能这样做?
答案 0 :(得分:1)
您可以使用array_at。 但是因为阵列的两个不同部分有所不同 所有权份额,你必须将它们描述为两种不同的 数组段。
类似的东西:
p: val (* base address of array *)
v1: list val (* contents of array segment 1 *)
v2: list val (* contents of array segment 2 *)
sh: share (* readable *)
sh': share (* writable *)
SEP (`(array_at sh tint nil (-dist) (-1) v1 p);
`(array_at sh' tint nil 0 (length-1) v2 p))
但它比这更复杂,因为这样就不见了 以下部分(-dist)及以上(length-1)的描述。
也许你不需要不同所有权的完整普遍性 分享您阵列的各个部分;你能想到为什么吗? 你的函数的客户端需要这个吗?在这种情况下, 只有一个数组段更容易,其值为"值" 是几个列表的串联。这在图中说明 示例progs / verif_revarray.v;特别注意 到该文件中的reverse_Inv。