Как предотвратить сбой проверки доступа при использовании .all на записи / указатели? - PullRequest
1 голос
/ 05 мая 2019

Это код, который устанавливает все мои указатели, записи и прочее.

     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 ]

2 голосов
/ 05 мая 2019

Рад слышать, что вы смогли найти решение!Как подсказка: вы также можете разделить функцию и несколько упростить код до:

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;

Здесь поведение двоичного оператора короткого замыкания and then используется дляпредотвратить разыменование указателя, если он null.

1 голос
/ 05 мая 2019

Думаю, я понял это.Мне нужно было проверить его, чтобы убедиться, что он не был нулевым, прежде чем я смог использовать .access.Итак, я просто добавил оператор if перед большей частью кода.В этом есть смысл, почему я так долго думал о хаха.

...