comp.lang.ada
 help / color / mirror / Atom feed
From: "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de>
Subject: Re: pointers and genericity
Date: Tue, 15 Feb 2005 14:12:21 +0100
Date: 2005-02-15T14:12:21+01:00	[thread overview]
Message-ID: <17cfosskqxdi0$.1ux9v3kndb9kr$.dlg@40tude.net> (raw)
In-Reply-To: 344d0fee.0502150410.740d5dbd@posting.google.com

On 15 Feb 2005 04:10:38 -0800, Xavier Serrand wrote:

> Hello cruel word,
> 
> I would like to use pointers to procedures in a generic package ... ok
> no problem
> But i want another generic package to use this... and i can't because
> the pointer type must be in the body of a generic package...
> 
> I KNOW that I can use genericity to bypass the problem... but is it
> possible to change the value of the generic parameters after the
> instanciation (as I can do with pointers variables)?
> 
> generic
>   type T_Elem is private
>   Null_Elem : in T_Elem;
> package Pk_DataSource is
>    type T_proc_Browse is access procedure (E : in out T_Record; S :
> out string);
>    type T_Record is
>       Data : T_Elem;
>       Next : T_Proc_Browse;
>       Prev : T_Proc_Browse;
>    end record;
> end Pk_DataSource;
> 
> generic
>   type T_Element is private
>   Null_Element : in T_Element;
>   with package Pk_DS is new Pk_DataSource (T_Elem => T_Element,
>                                            Null_Elem => Null_Element);
> package Pk_User is
>    type T_User is
>       Nom : string (1..33) := (others => ' ');
>       Rec : Pk_DS.T_Record := (Data => Null_Element, Next, Prev =>
> null);
>    end record;
>    procedure Assign (U : in out T_User; 
>                      S : in string; E : in T_Element;
>                      Proc_Next, Proc_Prev : in Pk_DS.T_Proc_Browse);
> end Pk_User;
> 
> --=========================================
> -- All is ok !!
> -- But i can't make this in Pk_User's body :
> --=========================================
> 
> package Pk_User body is
> 
>    procedure Assign (U : in out T_User; 
>                      S : in string; E : in T_Element;
>                      Proc_Next, Proc_Prev : in Pk_DS.T_Proc_Browse) is
>    begin
>       U.Nom(1..Min(U.Nom'Last, S'Last)) := S(1..Min(U.Nom'Last,
> S'Last));
>       U.Rec.Data := E;
>       -- and now some trouble !!
>       U.Rec.Next := Proc_Next;
>       U.Rec.Prev := Proc_Prev;

So far it is legal, (ignoring some minor errors with missing "record" after
"is", misplaced "body" and necessary forward declaration of "T_Record".

>    end;
> End Pk_User;

It is not clear what you want to achieve. Should Assign work with T_Record
from all possible instances of Pk_DataSource? If so, then you have to
switch to tagged types.

-- 
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de



  reply	other threads:[~2005-02-15 13:12 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-02-15 12:10 pointers and genericity Xavier Serrand
2005-02-15 13:12 ` Dmitry A. Kazakov [this message]
2005-02-16  9:27   ` Xavier Serrand
2005-02-16  9:35     ` Martin Dowie
2005-02-16  9:53     ` Egil H. H�vik
2005-02-16 15:00     ` Robert A Duff
2005-02-17 22:50       ` Xavier Serrand
2005-02-17 23:11       ` Randy Brukardt
replies disabled

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