comp.lang.ada
 help / color / mirror / Atom feed
From: David C. Hoos, Sr. <david.c.hoos.sr@ada95.com>
To: bernd.rinn@uni-konstanz.de
Subject: Re: A question to the "access-type lifetime rule"
Date: 2000/04/03
Date: 2000-04-03T00:00:00+00:00	[thread overview]
Message-ID: <8cail1$c33$1@nnrp1.deja.com> (raw)
In-Reply-To: 38E89AB9.7D33E88C@hamilton.physik.uni-konstanz.de

In article <38E89AB9.7D33E88C@hamilton.physik.uni-konstanz.de>,
bernd.rinn@uni-konstanz.de wrote:
> Hi,
>
> I am new to Ada and I am looking for an elegant way to get around a
> restriction posed by the "access-type lifetime rule" for
> access-to-subprogram types. First of all: does anyone know, why the
> access-type lifetime matters and not the access-variable lifetime?
(This
> should prevent dangling pointers as well, I guess.)
>
> I want to write an numerical integration function, that is defined in
a
> separate package as
>
> type Integrand_Type is access function ( X : Long_Float ) return
> Long_Float;
> function Integrate(Integrand : Integrand_Type; Lower_Bound,
Upper_Bound
> : Long_Float) return Long_Float;
>
> Now I would like to call this from a main procedure and pass an access
> attribute of a nested function of the main procedure as `Integrand'.
Is
> there a way to reach this? (Unchecked_Access is not an allowed
attribute
> for subprograms and I do not want to generate a package of it's own
for
> the integrand function.)
>
> Thank you for your help.
>
> Best regards,
>
> Bernd
>
The fundamental problem here is that the compiler has no way of knowing
that your main procedure is the "main" procedure -- i.e. that your main
procedure will not return before the program ends -- and that therefore
your integrand function could have gone out of scope while a pointer
to it is still retained by your numerical integration package.
I believe the best way to deal with this is to make the integrand
function itself a library-level function -- i.e.., not encapsulated in
a package. It will therefore have the same lifetime as the program,
and the compiler will allow the 'Access attribute to be used anywhere
in the program.
A non-portable alternative (if you're using GNAT) is to use the
'Unrestricted_Access attribute -- which is jus that -- unrestricted.


Sent via Deja.com http://www.deja.com/
Before you buy.




  parent reply	other threads:[~2000-04-03  0:00 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2000-04-03  0:00 A question to the "access-type lifetime rule" Bernd Rinn
2000-04-03  0:00 ` Robert Dewar
2000-04-03  0:00 ` Jean-Marc Bourguet
2000-04-03  0:00 ` David [this message]
2000-04-03  0:00 ` Gautier
2000-04-04  0:00 ` John English
replies disabled

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