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]