Ada约束误差

Ada约束误差,ada,Ada,我不明白为什么下面的代码失败了。我有自己版本的相同脚本,返回相同的错误。无论哪种情况,我都不明白为什么错误仍然存在 这就是错误: raised CONSTRAINT_ERROR : main2.adb:32 index check failed 这是哪一行: temp(i) := a(loop_high); 有人知道这是什么原因吗 with Text_IO; with Ada.Integer_Text_IO; procedure main2 is use Text_IO; use Ada

我不明白为什么下面的代码失败了。我有自己版本的相同脚本,返回相同的错误。无论哪种情况,我都不明白为什么错误仍然存在

这就是错误:

raised CONSTRAINT_ERROR : main2.adb:32 index check failed
这是哪一行:

temp(i) := a(loop_high);
有人知道这是什么原因吗

with Text_IO;
with Ada.Integer_Text_IO;

procedure main2 is

use Text_IO;
use Ada.Integer_Text_IO;

type int_array is array(1..5) of integer;
tosort:int_array;


procedure merge (a:in out int_array; low,mid,high:in integer) is
   temp: int_array;
   choose1: boolean;
   loop_low,loop_high:integer;

begin
   loop_low:=low;
   loop_high:=high;

   for i in low..high loop

      if (loop_low>mid) then choose1:=false;
      elsif (loop_high>high) then choose1:=true;
      else  choose1:= a(loop_low)<a(loop_high);
      end if;           -- choose which side

      if choose1 then       -- choose from low side
          temp(i):=a(loop_low);
          loop_low:=loop_low+1;
      else
          temp(i):=a(loop_high);    -- choose from high side
          loop_high:=loop_high+1;
      end if;
   end loop;
   a:=temp;
end merge;

procedure mergesort(a: in out int_array;low,high:integer) is
   mid:integer;
begin
   if low<high then
     mid:= (high+low)/2;
     mergesort(a,low,mid);
     mergesort(a,mid+1,high);
     merge(a,low,mid,high);
   end if;
end mergesort;

begin
   tosort := (171, 201, 397, 10, -381);
   mergesort(tosort,1,5);
end main2;
带有文本的
;
使用Ada.Integer\u Text\u IO;
程序main2是
使用文本输入法;
使用Ada.Integer\u Text\u IO;
int_数组类型是整数的数组(1..5);
tosort:int_数组;
过程合并(a:in-out int_数组;low、mid、high:in-integer)是
temp:int_数组;
选择1:布尔型;
loop_low,loop_high:整数;
开始
loop_low:=低;
回路_高:=高;
对于低..高循环中的i
如果(loop_low>mid),则选择1:=false;
elsif(loop_high>high)然后选择1:=true;

否则选择1:=a(loop_low)我建议使用-gnateE进行编译,这将为编译器生成的异常提供更多信息。在这种特定情况下,它应该告诉您哪个值超出了哪个范围

i
超出了
temp'范围
,或者
loop\u high
超出了
a'范围
。我想我很困惑,因为上面的代码不是我的代码。我刚刚编辑了它,希望它能正常运行。在我的代码中,我在同一个区域得到相同的错误是的,原始代码有缺陷。你可能想把这件事告诉作者;网页底部有一个电子邮件地址。好的。我想我希望这可能是其他原因,如果我理解的话,当你调用
merge
时,你的数组被分割成两个部分,两个部分都被排序,你正在合并它们并将合并的结果留在数组中。我很抱歉,但我不认为在不改变元素序列的情况下进行“就地合并”是可能的,我认为这意味着它不再是一种O(n)算法。(请参阅)您需要创建一个新数组来保存合并的结果,然后将其复制回来。好提示。在这种情况下,它表示
引发的约束_错误:和d.adb:33:22索引检查失败
索引6不在1..5中
33:22
表示第33行的第22列,这就是问题所在。谢谢!它只是在啃咬吗?我试过了,但同样的结果我现在明白为什么失败了,所以感谢大家的帮助!我没有考虑索引的增量,这将很快导致尝试访问数组之外的内容。如果能知道我在编译时做错了什么,以获得你们提到的信息,那就太好了。也许你们应该先删除.o和.ali,然后重新编译。您的文件可能已编译。另一种方法是使用-s进行编译,以便在编译器开关为changedAh ok时重新编译。我对其中一个文件做了一个小改动,并假设它会重新编译所有文件。我以后再试试。