comp.lang.ada
 help / color / mirror / Atom feed
From: "David C. Hoos, Sr." <david.c.hoos.sr@ada95.com>
Subject: Re: How to supply pointer to C?
Date: 1996/08/27
Date: 1996-08-27T00:00:00+00:00	[thread overview]
Message-ID: <01bb9464$de525a00$3b8371a5@dhoossr.iquest.com> (raw)
In-Reply-To: 85ybj1zcdu.fsf@walleroo.rp.CSIRO.AU


Hi Greg,
This solution is a portable (i.e. Ada83/Ada95) solution, based on the
assumption that Ada's System.ADDRESS and C's pointer are the same size, and
have identical representations, and that Ada's INTEGER type and C's size_t
type are the same size, and have identical representations.  These
assumptions are usually true.
with System;
--The Ada record could be:
type WHATEVER is 
  record
    Data_Address : System.ADDRESS;
    Data_Size     : NATURAL;
end record;
-- A representation clause insures that the Ada compiler's representation
of the record
-- is the same as the C compiler's representation of the record.
-- Now, some may find fault with this "belt plus suspenders" approach, but
I've been burned
-- by so many compiler differences (even by variations between releases of
the
-- same compiler), that I feel this care is warranted.
for WHATEVER use
  record at mod 4;
    -- NOTE:  We make the assumption here that INTEGERs and ADDRESSes are
the same
    -- size, because in Ada 95, System.ADDRESS'SIZE is not a statuic
expression,
    -- hence can't be used in the record representation clause.
    Data_Address at 0 range 0 .. INTEGER'SIZE -1;
    Data_Size    at 0 range INTEGER'SIZE .. 2 * INTEGER'SIZE - 1;
  end record;

--Now, then if the data items are of some type, say, ITEM_TYPE, then
objects can be
--declared as
An_Item : ITEM_TYPE;
--and a record object can be declared as
A_Whatever : WHATEVER :=
--and the record can be initialized with the following aggregate expression
    (Data_Address => An_Item'ADDRESS, Data_Size => An_Item'SIZE /
System.STORAGE_UNIT);

Hope this helps.

David C. Hoos, Sr.,
http://www.dbhwww.com
http://www.ada95.com

Greg Baker <gbaker@walleroo.rp.csiro.au> wrote in article
<85ybj1zcdu.fsf@walleroo.rp.CSIRO.AU>...
> Interfaces.C.Pointers.Value can get you from a C array to an Ada
> array,  and Interfaces.C.To_C can get you from a String to a
> null-terminated block of chars,  but what if I want to get a block of
> ints,  for examples?
> 
> More generally, what if I have some object and I want to pass its
> address to some C function.  (The question arises as I am trying to
> write an Ada gdbm interface - gdbm_store takes as arguments structs of
> the form-
>   struct { char * dptr;   int data_size; }.
> (i.e. record 
>          dptr : Interfaces.C.Pointers.???
>          data_size : Interfaces.C.int
>       end;
> )
> 
> I'm kind of hoping to do something like
> 
>   x.dptr := Magical_Conversion_function ( object'Access ); 
>   x.data_size = object'Size;
> 
> Any suggestions?
> 
> -- 
> Gregory D. Baker        gbaker@rp.csiro.au         CSIRO Radiophysics 
>    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  
>    - predictions of the future - quantum computers - silly poetry  -
>    - the "langue musicale universale" (Solresol)  revival project  - 
>    - - - - - - - - http://www.rp.csiro.au/~gbaker  - - - - - - - - -
> I'm an eccentric mathematician/IT guru/communicator,  and I'm looking
>                for a new job in Sydney,  Australia.
> 




  reply	other threads:[~1996-08-27  0:00 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
1996-08-27  0:00 How to supply pointer to C? Greg Baker
1996-08-27  0:00 ` David C. Hoos, Sr. [this message]
1996-08-28  0:00   ` Robert Dewar
1996-08-28  0:00     ` Larry Kilgallen
replies disabled

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