1

我正在 Ada 中为我们必须自学代码的课程编写此代码。我了解堆排序,但 Ada 语法确实让我感到困惑。我不明白为什么我在这个排序函数中遇到约束错误。本质上,我们必须将数组“A”传递给这个过程,它应该组织它。我在 siftDown(A(Start...A'Last)); 处得到约束错误

先感谢您

Procedure sort_3(A : in out array_type) is

  procedure swap(Left : in out Integer; Right : in out Integer) is
     temp : Integer;
  begin
     temp := Left;
     Left := Right;
     Right := Temp;
  end swap;
  
  procedure siftDown(A : in out array_type) is
     Count : Integer := 1;
     root : Integer := Integer'Pos(A'First);
     child : Integer := Integer'Pos(A'Last);
     last : Integer := Integer'Pos(A'Last);
  begin
     while root * 2 + 1 <= last loop
        child := root * 2 + 1;
        if child + 1 <= last and then A(Integer'Val(child)) < A(Integer'Val(child + 1)) then
           child := child + 1;
        end if;
        if A(Integer'Val(root)) < A(Integer'Val(child)) then
           swap(A(Integer'Val(root)), A(Integer'Val(child)));
           root := child;
        else
           exit;
        end if;
     end loop;
  end siftDown;

  procedure heapify(A : in out array_type) is
     Count : Integer := 0;
     First_Pos : Integer;
     Last_Pos  : Integer;
     Start     : Integer;
  begin
     First_Pos := A'First;
     Last_Pos  := A'Last;
     Start     := Integer'Val((Last_Pos - First_Pos + 1) / 2);
      loop
       siftDown(A(Start...A'Last));
        if Start > Integer'First then
           Start := Integer'Pred(Start);
       else
           exit;
        end if;
     end loop;
  end heapify;
  Last_Index : Integer := Integer'Last;
  
   begin
  heapify(A);
  while Last_Index > Integer'First loop
     swap(A(Last_Index), A(A'First));
     Last_Index := Integer'Pred(Last_Index);
     siftDown(A(A'First..Last_Index));
  end loop;
 
end sort_3;
4

2 回答 2

4

代码中有语法错误 - A(Start...A'Last).

语法A(Start..A'Last)表示切片,从开始到最后一个元素的数组的一部分。这Constraint_Error意味着Start不在数组范围内。尝试添加

Ada.Text_IO.Put_Line (Start'Image);

在该行之前,您将看到 Start 值以及它何时超出 A'Range。

于 2021-03-26T18:00:44.273 回答
4

您的代码有一些对 Integer'First 和 Integer'Last 的引用,它们是与数组 A 及其值无关的巨大值。我很确定您应该改用 A'First 和 A'Last。

另请注意样式:对于本地(内部,嵌套)过程的参数与包含(外部)过程的参数“A”使用相同的标识符“A”,当这些数组可以不同时,邀请混乱和错误。最好使用不同的标识符。

于 2021-03-26T21:20:59.147 回答