Please find a program that compiles ans links with GNAT but crashes when run the qsort routine gave me loyal service for the last 10 years on various applications I am sure i am making an obvious mistake, but when it is your own code you just can't see it Many thanks With Ada.Strings.Unbounded; With Ada.Text_Io; with qsort; Use Type Ada.Strings.Unbounded.Unbounded_String; Procedure tsort is Type Line_Array_Type Is Array (integer Range <>) Of Ada.Strings.Unbounded.Unbounded_String; Line_Array : Line_Array_Type(1 .. 20) := (Others => Ada.Strings.Unbounded.Null_Unbounded_String); procedure Sort is new Qsort (Elem => Ada.Strings.Unbounded.Unbounded_String, Elem_Vector => Codegraphlib.Line_Array_type); begin line_Array(1) :=Ada.Strings.Unbounded.To_Unbounded_String(" Package Iio Is New Ada.Text_Io.Integer_Io(Integer);"); line_Array(2) :=Ada.Strings.Unbounded.To_Unbounded_String(" package body Parse_Tools is"); line_Array(3) :=Ada.Strings.Unbounded.To_Unbounded_String(" package Parse_Tools is"); line_Array(4) :=Ada.Strings.Unbounded.To_Unbounded_String(" procedure Erase_Part_Of_Screeen (Tab : in Integer := 0) is"); line_Array(5) :=Ada.Strings.Unbounded.To_Unbounded_String(" proc := 1;"); line_Array(6) :=Ada.Strings.Unbounded.To_Unbounded_String(" procedure Erase_Part_Of_Screeen (Tab : in Integer := 0);"); line_Array(7) :=Ada.Strings.Unbounded.To_Unbounded_String(" procedure Put_Screen_Background is"); line_Array(8) :=Ada.Strings.Unbounded.To_Unbounded_String(" procedure Get_Main_Command;"); line_Array(9) :=Ada.Strings.Unbounded.To_Unbounded_String(" procedure Get_Main_Command is new abcd (Command : in out CodeGraphLib.Command_Record_Type );"); line_Array(10):=Ada.Strings.Unbounded.To_Unbounded_String(" function Erase_Part_Of_Screeen (Tab : in Integer := 0) return sss is"); line_Array(11):=Ada.Strings.Unbounded.To_Unbounded_String(" function Erase_Part_Of_Screeen (Tab : in Integer := 0);"); line_Array(12):=Ada.Strings.Unbounded.To_Unbounded_String(" funk := 1;"); line_Array(13):=Ada.Strings.Unbounded.To_Unbounded_String(" function Put_Screen_Background return aaa is"); line_Array(14):=Ada.Strings.Unbounded.To_Unbounded_String(" function Get_Main_Command return zzz;"); line_Array(15):=Ada.Strings.Unbounded.To_Unbounded_String(" function Get_Main_Command is new abcd (Command : in out CodeGraphLib.Command_Record_Type );"); sort (line_array,15); End tsort; ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ -- -- D.GAUDRY AUGUST 1988 -- -- -- Q S O R T . L I B -- ------------------------------------------------------------------------------ --VERY FAST SORTING ROUTINE ADAPTED FROM THE --TQSORT.PKG PROVIDED WITH THE COMPILER --------------------------------------------------------------- -- GENERIC SORTING ROUTINE FOR ANY TYPE OF VARIABLE --------------------------------------------------------------- -- EXAMPLES OF INSTANTIATION: -- -=-==-=-=-=-=-=-=-=-=-=-=- -- -- INSTANTIATION OF FOR LONG_FLOAT SORT -- --PROCEDURE FSORT IS NEW QSORT ( ELEM=>LONG_FLOAT , -- ELEM_VECTOR=>FLOAT_ARRAY_TYPE ) ; -- -- INSTANTIATION FOR integer SORT -- with integer index -- --PROCEDURE ISORT IS NEW QSORT(ELEM=>INTEGER, -- ELEM_VECTOR=>INTEGER_ARRAY_TYPE); -- generic type ELEM is private; type ELEM_VECTOR is array (INTEGER range <>) of ELEM; with function ">" (X : ELEM; Y : ELEM) return BOOLEAN is <>; with function "<" ( X : ELEM; Y : ELEM) return BOOLEAN is <>; ------------------------------------------------------------------------------ procedure QSORT (X : in out ELEM_VECTOR; N_DATA : in INTEGER); ------------------------------------------------------------------------------- -- UNIT_NAME | QSORT.PKG -- CSCI_NAME -- UNIT_DESCRIPTION -- -- UNIT_SPS_REFERENCE -- UNIT_CALLING_SEQUENCE -- EXTERNAL_UNITS_CALLED -- INPUTS -- OUTPUTS -- CREATED | 30 OCTOBER 1989 -- AUTHOR | DANIEL -- -- DATE ------------ AUTHOR -------- REVISION # -- PR # -----TITLE ------------ ------------------------------------------------------------------------------- --------------------------------------------------------------- -- GENERIC SORTING ROUTINE FOR ANY TYPE OF VARIABLE --------------------------------------------------------------- -- EXAMPLES OF INSTANTIATION: -- -=-==-=-=-=-=-=-=-=-=-=-=- -- -- INSTANTIATION OF FOR LONG_FLOAT SORT -- --PROCEDURE FSORT IS NEW QSORT ( ELEM=>LONG_FLOAT , -- ELEM_VECTOR=>FLOAT_ARRAY_TYPE ) ; -- -- INSTANTIATION FOR integer SORT -- with integer index -- --PROCEDURE ISORT IS NEW QSORT(ELEM=>INTEGER, -- ELEM_VECTOR=>INTEGEr_ARRAY_TYPE); -- procedure Qsort (X : in out Elem_Vector; N_Data : in Integer) is Too_Big : exception; Zero : constant := 0; Numrecs : constant := 1000; type Drecord is array (Zero .. Numrecs) of Elem; Datrec : Drecord; Total : Integer; -- total number of records --------------------------- --------------------------- --------------------------- procedure Getrecs (Filrec : in out Drecord; Sum : in out Integer; X : in Elem_Vector) is begin for I in 1 .. N_Data loop Filrec(I) := X(I); end loop; Sum := N_Data; end Getrecs; --------------------------- --------------------------- --------------------------- procedure Fileout( Outfil : in Drecord; Send : in Integer; X : out Elem_Vector) is Tot : Integer; begin Tot := Zero; while Tot /= Send loop Tot := Tot + 1; X(Tot) := Outfil(Tot); end loop; end Fileout; -- fileout --------------------------- --------------------------- --------------------------- procedure Quicksort (List : in out Drecord; Numb : in Integer) is Maxsub : constant := 21; -- smallest subfile allowed in qsort Stackdep : constant := 1000; -- stack size type Indices is record -- records of partions for stack Beginning, Ending : Integer; end record; Stk : Integer; I : Integer; J : Integer; Left : Integer; Righ : Integer; T1rec : Elem; -- temp records T2rec : Elem; -- temp records subtype Stackptr is Integer range 1 .. Stackdep; type Temparr is array (Stackptr) of Indices; Stack : Temparr; --------------------------- --------------------------- --------------------------- function Median (Listnam : in Drecord; Lef : in Integer; Rit : in Integer) return Integer is Med : Integer; begin Med := (Lef + Rit) / 2; if (Listnam(Rit) > Listnam(Med)) then if Listnam(Med) > Listnam(Lef) then return (Med); elsif (Listnam(Rit) > Listnam(Lef)) then return (Lef); else return (Rit); end if; elsif Listnam(Med) < Listnam(Lef) then return (Med); elsif Listnam(Rit) < Listnam(Lef) then return (Lef); else return (Rit); end if; end Median; --------------------------- --------------------------- --------------------------- procedure Stinsertsort (Newrec : in out Drecord; M : Integer; N : Integer) is -- 'm' has starting position,'n' has ending position -- straight insertion for number of records < 21 is -- more efficent Lft : Integer; -- left sorting stop Savrec, Xrec : Elem; -- temporary records begin Savrec := Newrec(M - 1); -- save the record before the sorting area for Rgt in (M + 1) .. N loop -- Right sorting stop Xrec := Newrec(Rgt); Newrec(M - 1) := Xrec; Lft := Rgt - 1; while Xrec < Newrec(Lft) loop -- switch records Newrec(Lft + 1) := Newrec(Lft); Lft := Lft - 1; end loop; Newrec(Lft + 1) := Xrec; end loop; Newrec(M - 1) := Savrec; -- restore that saved record end Stinsertsort; --------------------------- --------------------------- --------------------------- begin if Numb < Maxsub then Stinsertsort(List, 1, Numb); else -- file is larger than minimum subfile size Stk := 1; Stack(1).Beginning := 1; Stack(1).Ending := Numb; loop -- take top request from stack Left := Stack(Stk).Beginning; Righ := Stack(Stk).Ending; Stk := Stk - 1; -- sort subfiles less than maxsub -- by straight insertion sort if (Righ - Left) < Maxsub then Stinsertsort(List, Left, Righ); else loop -- split intervals I := Left; J := Righ; T1rec := List(Median(List, Left, Righ)); loop while List(I) < T1rec loop I := I + 1; end loop; while T1rec < List(J) loop J := J - 1; end loop; if I <= J then T2rec := List(I); List(I) := List(J); List(J) := T2rec; I := I + 1; J := J - 1; end if; exit when I > J; end loop; -- Repeat Loop if (J - Left) < (Righ - I) then if I < Righ then -- stack right partion req. Stk := Stk + 1; Stack(Stk).Beginning := I; Stack(Stk).Ending := Righ; end if; Righ := J; -- continue sorting left partion else if Left < J then -- stack left partion req. Stk := Stk + 1; Stack(Stk).Beginning := Left; Stack(Stk).Ending := J; end if; Left := I; -- continue sorting right partion end if; exit when Left >= Righ; end loop; end if; exit when Stk = Zero; end loop; -- Repeat Loop end if; end Quicksort; ------------------------------------------------------------------------- ------------------------------------------------------------------------- -- MAIN ------------------------------------------------------------------------- ------------------------------------------------------------------------- ------------------------------------------------------------------------- begin if N_Data > Numrecs then raise Too_Big; end if; Getrecs(Datrec, Total, X); Quicksort(Datrec, Total); Fileout(Datrec, Total, X); end Qsort; Daniel.Gaudry 9 Av CALMELS 92270 Bois Colombes France +33147862234 [log in to unmask]