我正在使用VDM ++ Toolbox v9.0.2附带的Tree定义,并且在尝试使用addRoot()函数(使用解释器)时,在第一次使用时,我总是得到错误:“运行 - 时间错误266:操作或功能不在范围内“。如果我再次运行该功能,它的工作原理。 为什么会有这种行为?
我正在添加VDM ++ Toolbox附带的Tree代码。 (请忽略类型和语法错误,因为我已经修复了所有错误,但它仍然无效)
- 开始代码 - 树类
class Tree
types
protected
tree = <Empty> | node;
public
node :: lt: Tree
nval : int
rt : Tree
instance variables
protected
root: tree := <Empty>;
operations
protected
nodes : () ==> set of int
nodes () ==
cases root:
<Empty> -> return ({}),
mk_node(lt,v,rt) -> return(lt.nodes() union {v} union rt.nodes())
end ;
protected
addRoot : int ==> ()
addRoot (x) ==
root := mk_node(new Tree(),x,new Tree());
protected
rootval : () ==> int
rootval () == return root.nval
pre root <> <Empty>;
protected
gettree : () ==> tree
gettree () == return root;
protected
leftBranch : () ==> Tree
leftBranch () == return root.lt
pre not isEmpty();
protected
rightBranch : () ==> Tree
rightBranch () == return root.rt
pre not isEmpty();
protected
isEmpty : () ==> bool
isEmpty () == return (root = <Empty>);
end Tree
- 结束代码 -
答案 0 :(得分:1)
我很高兴你设法解决了这个问题。操作受到保护是无益的(用于测试) - 尽管我担心它是否适用于第二次尝试!
我使用Overture而不是VDMTools尝试了规范,看看是否有任何不同。当然,它与受保护的方法有同样的问题(你不能选择它们进行测试)。但它也指出了一些类型检查错误:“nodes”case语句需要一个“others”子句(如“others - &gt; error”),否则操作可能返回一个void值;并且调用isEmpty()的前提条件实际上不应该这样做 - 您可以从前提条件调用函数,但不能操作,因为它们可能会更改模型的状态。所以我用“root =&lt; Empty&gt;”替换了这些调用。那很好。