comp.lang.ada
 help / color / mirror / Atom feed
From: "JMS" <Muriel.Servais@wanadoo.fr>
Subject: Re: Generic Packages in Ada
Date: 2000/08/10
Date: 2000-08-10T19:37:03+00:00	[thread overview]
Message-ID: <8mv08v$m4d$2@wanadoo.fr> (raw)
In-Reply-To: 39926569@newsserver1.picknowl.com.au

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 19554 bytes --]

Hi

Here is what I wrote which worked with Aonix compiler (I am sorry I am
french as you willl note...). If you need any translation help don't
hesitate asking me.:


 with unchecked_deallocation;

generic

 type Contenu is private;

package Pile is
 type Element is limited private;
 type AccesElement is access Element;

 pileAlteree: exception;
 pileVide: exception;
 indexNul: exception;
 indexTropGrand: exception;
 indexHorsPile: exception;

procedure AjouterElementEnDebut( enregistrement: in Contenu);
procedure EnleverElementEnDebut( enregistrement: out Contenu);
procedure AjouterElementEnFin( enregistrement: in Contenu);
procedure EnleverElementEnFin( enregistrement: out Contenu);
procedure ExtraireElement( enregistrement: out Contenu;
       index: in Integer);
procedure SupprimerElement( index: in Integer);
procedure InsererAvantElement( enregistrement: in Contenu;
        indexDeReference: in Integer);
procedure InsererApresElement( enregistrement: in Contenu;
        indexDeReference: in Integer);
function NombreDElements return Integer;
function ContenuElement(index: integer) return Contenu;

private

 type Element is
  record
   predecesseur: AccesElement:= null;
   successeur: AccesElement:= null;
   contenuElement: Contenu;
   index: Integer:= 0;
  end record;

 pointeurPremierElement: AccesElement:= null;
 pointeurDernierElement: AccesElement:= null;

end Pile;




 with Espionnage;

package body Pile is
procedure AjouterElementEnDebut( enregistrement: in Contenu) is
 pointeur: AccesElement:= null;
begin
 if Espionnage.espionnage then
  Espionnage.MarquerEntree("AjouterElementEnDebut");
 end if;
 pointeur:= new Element'(null,null,enregistrement,0);

 if pointeurPremierElement = null then
  if pointeurDernierElement = null then
   pointeurPremierElement:= pointeur;
   pointeurDernierElement:= pointeur;
   pointeur.index:= 1;
   if Espionnage.espionnage then
    Espionnage.EspionnerEntier(pointeur.index,"Index initial: ");
   end if;
  else
   Espionnage.Commenter("Pile alteree: pas de premier element mais un
dernier element existe!");
   raise pileAlteree;
  end if;
 else
  declare
   pointeurCourant: AccesElement:= pointeurPremierElement;
  begin
   pointeurPremierElement:= pointeur;
   pointeur.index:= 1;
   pointeur.successeur:= pointeurCourant;
   pointeur.successeur.predecesseur:= pointeur;
   while pointeurCourant /= null loop
           pointeurCourant.index:= pointeurCourant.index + 1;
    if Espionnage.espionnage then
     Espionnage.EspionnerEntier(pointeurCourant.index,"Mise � jour des
index: ");
    end if;
    pointeurCourant:= pointeurCourant.successeur;
   end loop;
  end;
 end if;
 if Espionnage.espionnage then
  Espionnage.MarquerSortie("AjouterElementEnDebut");
 end if;
end AjouterElementEnDebut;

procedure EnleverElementEnDebut(enregistrement: out Contenu) is
pointeur: AccesElement:= null;
 procedure Liberer is new unchecked_deallocation(Element,AccesElement);
begin
 if Espionnage.espionnage then
  Espionnage.MarquerEntree("EnleverElementEnDebut");
 end if;
 if pointeurPremierElement = null then
  if pointeurDernierElement = null then
   Espionnage.Commenter("Pile vide!");
         raise pileVide;
  else
   Espionnage.Commenter("Pile alteree: pas de premier element mais un
dernier element existe!");
   raise pileAlteree;
  end if;
 else
  declare
   pointeurCourant: AccesElement:= pointeurPremierElement;
  begin
   pointeur:= pointeurCourant;
   pointeurCourant:= pointeurCourant.successeur;
   pointeurPremierElement:= pointeurCourant;
   enregistrement:= pointeur.contenuElement;
   pointeur.successeur:= null;
   pointeur.predecesseur:= null;
   pointeur.index:= 0;
   if pointeurCourant /= null then
    pointeurCourant.predecesseur:= null;
   end if;
   while pointeurCourant /= null loop
    if Espionnage.espionnage then
     Espionnage.EspionnerEntier(pointeurCourant.index,"Index initial: ");
    end if;
            pointeurCourant.index:= pointeurCourant.index - 1;
    if Espionnage.espionnage then
     Espionnage.EspionnerEntier(pointeurCourant.index,"Index final: ");
    end if;
    pointeurCourant:= pointeurCourant.successeur;
   end loop;
   if pointeur = pointeurDernierElement then
    pointeurDernierElement:= null;
   end if;
   Liberer(pointeur);
  end;
 end if;
 if Espionnage.espionnage then
  Espionnage.MarquerSortie("EnleverElementEnDebut");
 end if;
end EnleverElementEnDebut;

procedure AjouterElementEnFin( enregistrement: in Contenu) is
 pointeur: AccesElement:= null;
begin
 if Espionnage.espionnage then
  Espionnage.MarquerEntree("AjouterElementEnFin");
 end if;
 pointeur:= new Element'(null,null,enregistrement,0);
 if pointeurDernierElement = null then
  if pointeurPremierElement = null then
   pointeurPremierElement:= pointeur;
   pointeurDernierElement:= pointeur;
   pointeur.index:= 1;
   if Espionnage.espionnage then
    Espionnage.EspionnerEntier(pointeur.index,"Index final: ");
   end if;
  else
   Espionnage.Commenter("Pile alteree: pas de dernier element mais un
premier element existe!");
   raise pileAlteree;
  end if;
 else
  declare
   pointeurCourant: AccesElement:= pointeurDernierElement;
  begin
   pointeurDernierElement:= pointeur;
   pointeur.index:= pointeurCourant.index + 1;
   if Espionnage.espionnage then
    Espionnage.EspionnerEntier(pointeur.index,"Index final: ");
   end if;
   pointeur.predecesseur:= pointeurCourant;
   pointeur.predecesseur.successeur:= pointeur;
  end;
 end if;
 if Espionnage.espionnage then
  Espionnage.MarquerSortie("AjouterElementEnFin");
 end if;
end AjouterElementEnFin;

procedure EnleverElementEnFin(enregistrement: out Contenu) is
 pointeur: AccesElement:= null;
 procedure Liberer is new unchecked_deallocation(Element,AccesElement);
begin
 if Espionnage.espionnage then
  Espionnage.MarquerEntree("EnleverElementEnFin");
 end if;
 if pointeurDernierElement = null then
  if pointeurPremierElement = null then
   Espionnage.Commenter("Pile vide!");
         raise pileVide;
  else
   Espionnage.Commenter("Pile alteree: pas de dernier element mais un
premier element existe!");
   raise pileAlteree;
  end if;
 else
  declare
   pointeurCourant: AccesElement:= pointeurDernierElement;
  begin
   pointeur:= pointeurCourant;
   pointeurCourant:= pointeurCourant.predecesseur;
   pointeurDernierElement:= pointeurCourant;
   enregistrement:= pointeur.contenuElement;
   pointeur.successeur:= null;
   pointeur.predecesseur:= null;
   pointeur.index:= 0;
    if pointeurCourant /= null then
    pointeurCourant.successeur:= null;
   end if;
   if pointeur = pointeurPremierElement then
    pointeurPremierElement:= null;
   end if;
   Liberer(pointeur);
  end;
 end if;
 if Espionnage.espionnage then
  Espionnage.MarquerSortie("EnleverElementEnFin");
 end if;
end EnleverElementEnFin;

procedure ExtraireElement( enregistrement: out Contenu;
       index: in Integer) is
begin
 if Espionnage.espionnage then
  Espionnage.MarquerEntree("ExtraireElement");
 end if;
 if index = 0 then
  Espionnage.Commenter("Extraction impossible, index de l'element a extraire
nul!");
  raise indexNul;
 else
     if index > pointeurDernierElement.index then
   Espionnage.Commenter("Extraction impossible, index de l'element a
extraire trop grand!");
   raise indexTropGrand;
  else
   if index = 1 then
    EnleverElementEnDebut(enregistrement);
   else
    if index = pointeurDernierElement.index then
     EnleverElementEnfin(enregistrement);
    else
     declare
      pointeurCourant: AccesElement:= pointeurPremierElement;
      indexTrouve: Boolean:= false;
      procedure Liberer is new unchecked_deallocation(Element,AccesElement);
     begin
      while pointeurCourant /= null loop
       if index = pointeurCourant.index then
        indexTrouve:= true;
        enregistrement:= pointeurCourant.contenuElement;
        pointeurCourant.index:= 0;
        pointeurCourant.predecesseur.successeur:=
pointeurCourant.successeur;
        pointeurCourant.successeur.predecesseur:=
pointeurCourant.predecesseur;
        declare
         pointeurCourantInterne: AccesElement:= pointeurCourant.successeur;
        begin
         while pointeurCourantInterne /= null loop
          pointeurCourantInterne.index:= pointeurCourantInterne.index - 1;
          pointeurCourantInterne:= pointeurCourantInterne.successeur;
         end loop;
        end;
        pointeurCourant.predecesseur:= null;
        pointeurCourant.successeur:= null;
        Liberer(pointeurCourant);
        exit;
       end if;
       pointeurCourant:= pointeurCourant.successeur;
      end loop;
      if not(indexTrouve) then
       raise indexHorsPile;
      end if;
     end;
    end if;
   end if;
  end if;
 end if;
 if Espionnage.espionnage then
  Espionnage.MarquerSortie("ExtraireElement");
 end if;
end ExtraireElement;

procedure SupprimerElement(index: in Integer) is
begin
 if Espionnage.espionnage then
  Espionnage.MarquerEntree("SupprimerElement");
 end if;
 if index = 0 then
  Espionnage.Commenter("Suppression impossible, index de l'element a
supprimer nul!");
  raise indexNul;
 else
     if index > pointeurDernierElement.index then
   Espionnage.Commenter("Suppression impossible, index de l'element a
supprimer trop grand!");
   raise indexTropGrand;
  else
   if index = 1 then
    declare
     enregistrement: Contenu;
    begin
     EnleverElementEnDebut(enregistrement);
    end;
   else
    if index = pointeurDernierElement.index then
     declare
      enregistrement: Contenu;
     begin
      EnleverElementEnfin(enregistrement);
     end;
    else
     declare
      pointeurCourant: AccesElement:= pointeurPremierElement;
      indexTrouve: Boolean:= false;
      procedure Liberer is new unchecked_deallocation(Element,AccesElement);
     begin
      while pointeurCourant /= null loop
       if index = pointeurCourant.index then
        indexTrouve:= true;
        pointeurCourant.index:= 0;
        pointeurCourant.predecesseur.successeur:=
pointeurCourant.successeur;
        pointeurCourant.successeur.predecesseur:=
pointeurCourant.predecesseur;
        declare
         pointeurCourantInterne: AccesElement:= pointeurCourant.successeur;
        begin
         while pointeurCourantInterne /= null loop
          pointeurCourantInterne.index:= pointeurCourantInterne.index - 1;
          pointeurCourantInterne:= pointeurCourantInterne.successeur;
         end loop;
        end;
        pointeurCourant.predecesseur:= null;
        pointeurCourant.successeur:= null;
        Liberer(pointeurCourant);
        exit;
       end if;
       pointeurCourant:= pointeurCourant.successeur;
      end loop;
      if not(indexTrouve) then
       raise indexHorsPile;
      end if;
     end;
    end if;
   end if;
  end if;
 end if;
 if Espionnage.espionnage then
  Espionnage.MarquerSortie("SupprimerElement");
 end if;
end SupprimerElement;

procedure InsererAvantElement( enregistrement: in Contenu;
        indexDeReference: in Integer) is
begin
 if Espionnage.espionnage then
  Espionnage.MarquerEntree("InsererAvantElement");
 end if;
 if indexDeReference = 0 then
  Espionnage.Commenter("Insertion impossible, index de l'element de
reference nul!");
  raise indexNul;
 else
  if indexDeReference > pointeurDernierElement.index then
   Espionnage.Commenter("Insertion impossible, index de l'element de
reference trop grand!");
   raise indexTropGrand;
  else
   if indexDeReference = 1 then
    AjouterElementEnDebut(enregistrement);
   else
    declare
     pointeurCourant: AccesElement:= pointeurPremierElement;
     indexTrouve: Boolean:= false;
    begin
     while pointeurCourant /= null loop
      if Espionnage.espionnage then
        Espionnage.EspionnerEntier(pointeurCourant.index,"Index courant: ");
        Espionnage.EspionnerEntier(indexDeReference,"Reference: ");
      end if;
              if pointeurCourant.index = indexDeReference then
       declare
        pointeur: AccesElement:= null;
        pointeurCourantInterne: AccesElement:= pointeurCourant;
       begin
        indexTrouve:= true;
        pointeur:= new
Element'(pointeurCourant.predecesseur,pointeurCourant,enregistrement,indexDe
Reference);
        pointeurCourant.predecesseur.successeur:= pointeur;
        pointeurCourant.predecesseur:= pointeur;
        while pointeurCourantInterne /= null loop
         if Espionnage.espionnage then
           Espionnage.EspionnerEntier(pointeurCourantInterne.index,"Ancien
index courant: ");
           Espionnage.EspionnerEntier(indexDeReference,"Reference: ");
         end if;
         pointeurCourantInterne.index:= pointeurCourantInterne.index + 1;
         if Espionnage.espionnage then
           Espionnage.EspionnerEntier(pointeurCourantInterne.index,"Nouvel
index courant: ");
           Espionnage.EspionnerEntier(indexDeReference,"Reference: ");
         end if;
         pointeurCourantInterne:= pointeurCourantInterne.successeur;
        end loop;
        exit;
       end;
      else
       pointeurCourant:= pointeurCourant.successeur;
      end if;
     end loop;
     if not(indexTrouve) then
      raise indexHorsPile;
     end if;
    end;
   end if;
  end if;
 end if;
 if Espionnage.espionnage then
  Espionnage.MarquerSortie("InsererAvantElement");
 end if;
end InsererAvantElement;

procedure InsererApresElement( enregistrement: in Contenu;
        indexDeReference: in Integer) is
begin
 if Espionnage.espionnage then
  Espionnage.MarquerEntree("InsererApresElement");
 end if;
 if indexDeReference = 0 then
  Espionnage.Commenter("Insertion impossible, index de l'element de
reference nul!");
  raise indexNul;
 else
  if indexDeReference > pointeurDernierElement.index then
   Espionnage.Commenter("Insertion impossible, index de l'element de
reference trop grand!");
   raise indexTropGrand;
  else
   if indexDeReference = pointeurDernierElement.index then
    AjouterElementEnFin(enregistrement);
   else
    declare
     pointeurCourant: AccesElement:= pointeurDernierElement;
     indexTrouve: Boolean:= false;
    begin
     while pointeurCourant /= null loop
      if Espionnage.espionnage then
        Espionnage.EspionnerEntier(pointeurCourant.index,"Index courant: ");
        Espionnage.EspionnerEntier(indexDeReference,"Reference: ");
      end if;
      if pointeurCourant.index = indexDeReference then
       declare
        pointeur: AccesElement:= null;
        pointeurCourantInterne: AccesElement:= null;
       begin
        indexTrouve:= true;
        pointeur:= new
Element'(pointeurCourant,pointeurCourant.successeur,enregistrement,indexDeRe
ference +1);
        pointeurCourant.successeur.predecesseur:= pointeur;
        pointeurCourant.successeur:= pointeur;
        pointeurCourantInterne:= pointeur.successeur;
        while pointeurCourantInterne /= null loop
         if Espionnage.espionnage then
           Espionnage.EspionnerEntier(pointeurCourantInterne.index,"Ancien
index courant: ");
           Espionnage.EspionnerEntier(indexDeReference,"Reference: ");
         end if;
         pointeurCourantInterne.index:= pointeurCourantInterne.index + 1;
         if Espionnage.espionnage then
           Espionnage.EspionnerEntier(pointeurCourantInterne.index,"Nouvel
index courant: ");
           Espionnage.EspionnerEntier(indexDeReference,"Reference: ");
         end if;
         pointeurCourantInterne:= pointeurCourantInterne.successeur;
        end loop;
        exit;
       end;
      else
       pointeurCourant:= pointeurCourant.predecesseur;
      end if;
     end loop;
     if not(indexTrouve) then
      raise indexHorsPile;
     end if;
    end;
   end if;
  end if;
 end if;
 if Espionnage.espionnage then
  Espionnage.MarquerSortie("InsererApresElement");
 end if;
end InsererApresElement;

function NombreDElements return Integer is
begin
 if Espionnage.espionnage then
  Espionnage.MarquerEntree("NombreDElements");
 end if;
 if pointeurDernierElement /= null then
  if Espionnage.espionnage then
   Espionnage.EspionnerEntier(pointeurDernierElement.index,"Nombre : ");
   Espionnage.MarquerSortie("NombreDElements");
  end if;
  return pointeurDernierElement.index;
 else
  if Espionnage.espionnage then
   Espionnage.Commenter("Nombre : 0");
   Espionnage.MarquerSortie("NombreDElements");
  end if;
  return 0;
 end if;
end NombreDElements;

function ContenuElement(index: Integer) return Contenu is
begin
 if Espionnage.espionnage then
  Espionnage.MarquerEntree("ContenuElement");
 end if;
 if(index = 0) then
  Espionnage.Commenter("Recherche de contenu impossible, index de l'element
a lire nul!");
  raise indexNul;
 else
     if(index > pointeurDernierElement.index) then
   Espionnage.Commenter("Recherche de contenu impossible, index de l'element
a lire trop grand!");
   raise indexTropGrand;
  else
   if index = 1 then
    if Espionnage.espionnage then
     Espionnage.EspionnerEntier(index,"Index : ");
     Espionnage.MarquerSortie("ContenuElement");
    end if;
    return pointeurPremierElement.contenuElement;
   else
    if index = pointeurDernierElement.index then
     if Espionnage.espionnage then
      Espionnage.EspionnerEntier(index,"Index : ");
      Espionnage.MarquerSortie("ContenuElement");
     end if;
     return pointeurDernierElement.contenuElement;
    else
     declare
      pointeurCourant: AccesElement:= pointeurPremierElement;
      indexTrouve: Boolean:= false;
     begin
      while pointeurCourant /= null loop
       if index = pointeurCourant.index then
        indexTrouve:= true;
        if Espionnage.espionnage then
         Espionnage.EspionnerEntier(index,"Index : ");
         Espionnage.MarquerSortie("ContenuElement");
        end if;
        return pointeurCourant.contenuElement;
       end if;
       pointeurCourant:= pointeurCourant.successeur;
      end loop;
      if not(indexTrouve) then
       raise indexHorsPile;
      end if;
     end;
    end if;
   end if;
  end if;
 end if;
end ContenuElement;

end Pile;

@+
JMS

--
http://perso.wanadoo.fr/muriel.servais/muriel.servais/
Ashley Manos <atm@picknowl.com.au> a �crit dans le message :
39926569@newsserver1.picknowl.com.au...
> Hi - can anyone help me with this:
>
> I'm attempting to write a generic package for linked lists in Ada.
> The data structure I'm looking to make generic is the element
> ie each element in the list is composed of 2 parts: the elemtn and a
pointer
> to the next element.
>
> So my package spec looks something like this:
>
> generic
>     type Node is private;            -- here's the list element
>     type List is access Node;    -- here's the pointer to the next element
> in the list
>
> package Lists is
>     function CreateList(N:in Node) return List;
>     procedure AddToRear(N:in Node; L:in out List);
>     procedure RemoveFirst(N:in Node; L:in out List);
> end Lists;
>
> However, the compiler is complaining (and rightly so!) about my package
> body, the start of which looks like this:
>
> package body Lists is
>
>     function CreateList(N:in Node) return List is
>         L:List;
>     begin
>         L:= new Node;
>         L.Next:= Null;    ***
>         return L;
>     end CreateList;
>
>     ............... etc ..................
>
> The compiler is saying "invalid prefix in selected component L" about the
> line ***.
> I can see why the compiler is raising this error, but I need my function
to
> refer to the "Next" component of the element, as it will be of type "List"
> ie the pointer to the next element.
>
> If this makes absolutely any sense to anybody that might be able to help,
> could you PLEASE reply.
>
> Thanks
> Ashley (atm@picknowl.com.au)
>
>






      parent reply	other threads:[~2000-08-10  0:00 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2000-08-10  0:00 Generic Packages in Ada Ashley Manos
2000-08-10  0:00 ` David C. Hoos, Sr.
2000-08-10  0:00 ` Samuel T. Harris
2000-08-11  0:00   ` Martin Dowie
2000-08-14  0:00     ` Samuel T. Harris
2000-08-14  0:00       ` Ada 83 Booch [was Generic Packages in Ada] Vincent Marciante
2000-08-10  0:00 ` JMS [this message]
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox