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