comp.lang.ada
 help / color / mirror / Atom feed
From: Duncan Sands <duncan.sands@math.u-psud.fr>
To: tmoran@acm.org, comp.lang.ada@ada-france.org
Subject: Re: C array to Ada pointer to unconstrained array without copying memory
Date: Tue, 7 Oct 2003 21:24:03 +0200
Date: 2003-10-07T21:24:03+02:00	[thread overview]
Message-ID: <mailman.39.1065554578.25614.comp.lang.ada@ada-france.org> (raw)
In-Reply-To: <ADDgb.237922$mp.149596@rwcrnsc51.ops.asp.att.net>

On Tuesday 07 October 2003 20:30, tmoran@acm.org wrote:
> >subtype Array2 is Ada_Array (1 .. Length);
> >
> >X : Array2;
> >for X'Address use Ptr; -- ok, Ptr should be of type System'Address, but
> > hey!
> >
> >And then you can make use of X.  However being defined on the stack, it
> >can be quite awkward to use.
>
>    I don't understand.  Nothing is defined on, or off, the stack here.

The bounds of X are on the stack if this is in a procedure; sorry I wasn't
clear here (in my head X was declared as a local variable in a procedure,
and that leaked out into the email).

> You are saying that X is at location 12345 (or whatever) in RAM.

That has no meaning - since (GNAT) X has two parts: data and bounds.
The data is at location 12345, the bounds are somewhere else.

> Whether X happens to be in the same area as the stack depends on
> whether (System.Address_to_Access_Conversions .To_Address of) Ptr
> happens to point into the stack or not.
>
> >It would be nice to have the same thing but with X dynamically allocated.
>
>   If Ptr points into your program's heap memory, that's where X will be.
> Or do you mean C is allocating memory, and setting its memory allocation
> structures, and you want an Ada Access type, and Ada's memory allocation
> structures, to be set as if that memory was allocated by an Ada "new"?

Not really.  The fact the memory wasn't allocated by Ada will only be
problematic if it is deallocated by Ada.

> >The problem is the bounds of course.
>
>   If a call to C gave you an address and a length, then those, not a
> constrained array, are what you have to work with.  Just as in C,
> you'll have to write things like
>   if Index in 1 .. Length then
>     Y := X(Index);
>   else
>     raise Constraint_Error;
>   end if;

This may be what you should do - but I'm not asking that.  I'm asking
how to do something unwise, as in your next paragraph.

> >For example, GNAT usually uses
> >fat pointers, consisting of two normal pointers where one points to the
> >data, and the other to the bounds.  So the "clever stuff" will need to
> >allocate some memory to hold the bounds and set up the fat pointer
> >appropriately.
>
>   So you're talking about using embedded assembly language to fake out the
> compiler?  If it's the only way to get to the moon, someone will have to
> put themselves on top of an enormous can of explosives and light the
> outlets.  Most real problems, however, can be solved in less dangerous
> ways.  What's the real problem you are trying to solve here?

Exactly.  Well, there need be no assembly language, just some unchecked
conversions.  As to why, let's just say I enjoy living dangerously.  It seems to
me that such a trick is possible (if not desirable, and not portable between
compilers) - and the degree of danger is not clear to me.  If it can be done,
I would like to know - that doesn't mean I'm going to do it.  Anyway, someone
with a good knowledge of GNAT internals should be able to say if it would work
like a charm or the opposite.

Thanks for your help,

Duncan.



  reply	other threads:[~2003-10-07 19:24 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-10-07 14:43 C array to Ada pointer to unconstrained array without copying memory Duncan Sands
2003-10-07 18:30 ` tmoran
2003-10-07 19:24   ` Duncan Sands [this message]
2003-10-08  0:02   ` sk
     [not found]   ` <3F83540E.5000302@myob.com>
2003-10-08  9:18     ` Duncan Sands
2003-10-07 20:00 ` Jeffrey Carter
2003-10-07 20:39   ` Duncan Sands
2003-10-08  1:27     ` Jeffrey Carter
2003-10-07 20:53 ` Chad R. Meiners
2003-10-07 21:24   ` Duncan Sands
2003-10-07 22:44     ` C array to Ada pointer to unconstrained array without copyingmemory Chad R. Meiners
2003-10-07 22:52       ` Chad R. Meiners
2003-10-08  9:20         ` Duncan Sands
2003-10-08 16:16           ` C array to Ada pointer to unconstrained array withoutcopyingmemory Chad R. Meiners
2003-10-08 16:49             ` Duncan Sands
2003-10-08  2:14     ` C array to Ada pointer to unconstrained array without copying memory Robert I. Eachus
2003-10-08  9:27       ` Duncan Sands
2003-10-08 22:43         ` Robert I. Eachus
2003-10-09  9:31           ` Duncan Sands
2003-10-08 14:07 ` Steve Adams
2003-10-08 14:33   ` Preben Randhol
2003-10-09 23:04     ` Steve Adams
2003-10-09 23:11       ` Steve Adams
2003-10-08 16:30   ` Duncan Sands
2003-10-09 22:59     ` C array to Ada pointer to unconstrained array without copyingmemory Steve Adams
2003-10-10  7:02       ` Duncan Sands
2003-10-10 16:44         ` C array to Ada pointer to unconstrained array withoutcopyingmemory Steve Adams
2003-10-23 21:27   ` C array to Ada pointer to unconstrained array without copying memory Craig Carey
replies disabled

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