TEAM-ADA Archives

Team Ada: Ada Programming Language Advocacy

TEAM-ADA@LISTSERV.ACM.ORG

Options: Use Forum View

Use Monospaced Font
Show HTML Part by Default
Condense Mail Headers

Message: [<< First] [< Prev] [Next >] [Last >>]
Topic: [<< First] [< Prev] [Next >] [Last >>]
Author: [<< First] [< Prev] [Next >] [Last >>]

Print Reply
Sender:
"Team Ada: Ada Advocacy Issues (83 & 95)" <[log in to unmask]>
Subject:
From:
Daniel GAUDRY <[log in to unmask]>
Date:
Mon, 10 Aug 1998 09:56:18 +0200
Content-Type:
multipart/alternative; boundary="----=_NextPart_000_0006_01BDC445.1EA10AE0"
MIME-Version:
1.0
Reply-To:
Daniel GAUDRY <[log in to unmask]>
Parts/Attachments:
text/plain (12 kB) , text/html (36 kB)
  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]


ATOM RSS1 RSS2