From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: *** X-Spam-Status: No, score=3.8 required=5.0 tests=BAYES_00,INVALID_MSGID, RATWARE_MS_HASH,RATWARE_OUTLOOK_NONAME autolearn=no autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,cf493b045fffb8e4 X-Google-Attributes: gid103376,public From: "David C. Hoos, Sr." Subject: Re: How to supply pointer to C? Date: 1996/08/27 Message-ID: <01bb9464$de525a00$3b8371a5@dhoossr.iquest.com>#1/1 X-Deja-AN: 176842771 distribution: world references: <85ybj1zcdu.fsf@walleroo.rp.CSIRO.AU> content-type: text/plain; charset=ISO-8859-1 organization: DBH Enterprises, Inc. mime-version: 1.0 newsgroups: comp.lang.ada Date: 1996-08-27T00:00:00+00:00 List-Id: 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 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. >