在记录/指针上使用.all时,如何防止访问检查失败?

时间:2019-05-05 00:11:22

标签: ada

这是设置所有指针,记录和内容的代码。

     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时,都会出现约束错误,访问检查失败。我知道这是因为它不知道是否分配了该代码,但是我不知道我需要做些什么才能能够访问它或使其完全执行而不给出错误。如果有人可以帮助或知道我做错了什么,那将不胜感激。谢谢!

2 个答案:

答案 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为什么我花了这么长时间才想到哈哈。