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.
>
next prev parent 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