这是设置所有指针,记录和内容的代码。
type BSTNode;
type BSTNodePtr is access BSTNode;
type BSTNode is record
key: Key_Type;
data: Item_Type;
left, right: BSTNodePtr;
end record;
type BSTree is record
root: BSTNodePtr;
end record;
我有一个函数是
function contains(key: Key_Type; t: BSTree) return Boolean is
temp_node : BSTNodePtr := t.root;
right : boolean;
left : boolean;
temp_tree : BSTree;
begin
if temp_node.all.key = key then --error occurs
return true;
elsif temp_node.all.left /= null and
temp_node.all.right /= null then
temp_tree.root := temp_node.all.left;
left := contains(key, temp_tree);
temp_tree.root := temp_node.all.right;
right := contains(key, temp_tree);
if left = true or right = true then
return true;
else
return false;
end if;
else
return false;
end if;
end contains;
每次尝试执行.all时,都会出现约束错误,访问检查失败。我知道这是因为它不知道是否分配了该代码,但是我不知道我需要做些什么才能能够访问它或使其完全执行而不给出错误。如果有人可以帮助或知道我做错了什么,那将不胜感激。谢谢!
答案 0 :(得分:2)
很高兴得知您能够找到解决方案!只是提示:您还可以拆分函数并将代码简化为:
function Contains (Key : Key_Type; N : BSTNode) return Boolean is
begin
return (N.Key = Key)
or else ((N.Left /= null) and then Contains (Key, N.Left.all))
or else ((N.Right /= null) and then Contains (Key, N.Right.all));
end Contains;
function Contains (Key : Key_Type; T : BSTree) return Boolean is
begin
return (T.Root /= null) and then Contains (Key, T.Root.all);
end Contains;
在这里,short-circuit binary operator and then
的行为用于防止对指针null
的取消引用。
答案 1 :(得分:1)
我想我明白了。在使用.access之前,我需要先进行检查以确保其不为null。因此,我只是在大多数代码之前添加了if语句。这很有道理,idk为什么我花了这么长时间才想到哈哈。