comp.lang.ada
 help / color / mirror / Atom feed
From: "Robert I. Eachus" <rieachus@comcast.net>
Subject: Re: C array to Ada pointer to unconstrained array without copying memory
Date: Wed, 08 Oct 2003 22:43:39 GMT
Date: 2003-10-08T22:43:39+00:00	[thread overview]
Message-ID: <3F849301.8090804@comcast.net> (raw)
In-Reply-To: mailman.50.1065605164.25614.comp.lang.ada@ada-france.org

Duncan Sands wrote:
> On Wednesday 08 October 2003 04:14, Robert I. Eachus wrote:
> 
>>Duncan Sands wrote:
>>
>>>So far so good.  Now suppose I do:
>>>
>>>Y : Array_Pointer := new Array_Type' (X);  -- (*)
>>>
>>>The object I want is Y.  What is the problem?  The problem
>>>is that line (*) involves allocating memory and copying the
>>>data from X to that memory.  I would like to end up with Y
>>>without performing the copy (and without reallocating
>>>memory for the array data).
>>
>>What is wrong with:
>>
>>Y: Array_Type;
>>for Y'Address use X'Address;
>>
>>..if you want X and Y to be two different views of the same memory.
>>Notice that there is no need for an explicit pointer here, but if X is a
>>  pointer as in your example, you may want to do:
>>
>>Y: Array_Type;
>>for Y'Address use X.all'Address;
>>
>>Oh, and if there is initialization for the elements of Array_Type you
>>may want to add a pragma Import; to turn off initialization.
> 
> 
> Hi Robert, maybe I can explain it like this.  The data I have is on
> the heap.  I want the array bounds on the heap as well.

Then put them there!  I'll leave the details to you, since you know what 
you are trying to do.  But I'll explain what you seem to want.

You have an object, in C, that you "know" the bounds of.  You want to 
write a procedure that can accept a (C) pointer to the data on the heap, 
and construct an Ada object that you can work with.  You also don't seem 
to want to move the data.  (If you are willing to do so, this all gets a 
lot easier.)

Now define an Ada record type, probably in a (library) package spec, 
since you want to be able to pass objects of the type around.  The 
package will be implementing what is referred to as an abstract data 
type.  You can make the type private and put the implementation details 
in the private part of the spec, or even in the body if you really want 
to.  But easiest is to let other units see the implementation at first.

The record type will contain the bounds, and a pointer to the data.  For 
example:

     type Some_Data is record
        First, Last: Integer;
        Data: Some_Pointer;
        -- may be from an instantiation of Interfaces.C.Pointers.
     end record;

Now add your own access type:

    type My_Pointer is access Some_Data;

Next go off and write all the code that passes objects of type Some_Data 
around.  As you do so, you may want to "reach into" your data.  Resist 
the temptation, and write inquiry functions such as:

    function First_Element(P: My_Pointer) return Data_Element;

and put them in your package body.  You probably also want a create 
function that calls the C routine, creates an object on the heap, and 
returns a pointer.  (Notice that the data is also on the heap but it 
doesn't get moved around.  The object you create only contains the bounds.)

It sounds like a lot of work, and it will be for you at first.  But when 
you get used to it, this is a very useful design pattern in Ada.  Of 
course, if you didn't insist on putting the data on the heap, you could 
just pass objects of type Some_Data around.  In Ada you will soon find 
that this is easier than creating access types all over the place.


-- 
                                    Robert I. Eachus

"Quality is the Buddha. Quality is scientific reality. Quality is the 
goal of Art. It remains to work these concepts into a practical, 
down-to-earth context, and for this there is nothing more practical or 
down-to-earth than what I have been talking about all along...the repair 
of an old motorcycle."  -- from Zen and the Art of Motorcycle 
Maintenance by Robert Pirsig




  reply	other threads:[~2003-10-08 22:43 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
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 [this message]
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