2015-09-21 101 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