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)
>
>
prev 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