2015-09-21 92 views
1

我不明白为什么下面的代码失败。我有我自己的版本的相同的脚本返回相同的错误。在这两种情况下,我都搞不清楚为什么错误依然存在。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; 
+0

“i”在“temp'range”之外,或者“loop_high”在“arange”之外。 –

+0

我想我很困惑,因为上面不是我的代码。我只是编辑它,并期望它正常运行。在我的代码中,我在同一区域得到相同的错误 [链接到原始代码](http://www.ada95.ch/doc/tut1/Recursion/merge_sort.html) – cpd1

+0

是的原始代码是越野车。你可能想告诉作者这件事;网页底部有一个电子邮件地址。 –

回答

3

我推荐使用-gnateE进行编译,它会为编译器生成的异常提供更多信息。在这个特定情况下,它应该告诉你哪个值超出了范围

+3

好的提示。在这种情况下,它说'引发CONSTRAINT_ERROR:andd.adb:33:22索引检查失败'并且索引6不在1..5中; '33:22'意味着第33行第22列,它是'loop_high'这就是问题所在。 –

+0

谢谢!它只是gna​​tmake -gnatE main2?我试过,但结果相同 – cpd1

+0

我现在明白为什么它失败,所以欣赏帮助家伙!我没有考虑索引的增量,这些索引很快会导致尝试访问数组之外​​的某些内容。如果知道我在编译时遇到了什么错误,虽然可以获取您提到的信息,但这非常棒。 – cpd1