comp.lang.ada
 help / color / mirror / Atom feed
From: cis.ohio-state.edu!magnus.acs.ohio-state.edu!usenet.ins.cwru.edu!agate!do
Subject: Re: Data Overlays
Date: 18 Aug 93 02:11:59 GMT	[thread overview]
Message-ID: <CBxnFz.CD5@irvine.com> (raw)

In article <1993Aug18.003940.2208@leeweyr.sccsi.com> bill@leeweyr.sccsi.com 
(Bill Lee) writes:

>   O.k., Here's my problem:
>
>   I have a system which receives "messages" from a number of other
>   systems. The messages come via POSIX queues. On any one queue, I
>   can receive a number of different messages, mostly with record
>   structures defined by the C code where the message originated.
>
>   I do not know a priori what the next message will be. I have to
>   "receive" the message into a Byte_Array. Once I have the message,
>   I can access a standard header and extract a message identifier,
>   which then tells me what kind of message I've just received.
>   Once I have a message in a Byte_Array, and once I know what kind
>   of message it is, I can then convert the message to an Ada record
>   which has the right structure for the message.
>
>   I've considered both methods above. Certainly, Unchecked_Conversion
>   is one alternative. But I have used another method which seems to
>   work, seems to be portable, and, moreover, SEEMS to be in line with
>   what the language designers intended. To wit:
>
>   Given an Ada type, Messages:
>
>   generic
>     type Byte_Arrays is private;
>   function Extract_Message ( A_Message : in Byte_Arrays ) return Messages;
>
>   where the body looks like
>
>   function Extract_Message ( A_Message : in Byte_Arrays ) return Messages is
>     Temp_Message : Messages;
>     for Temp_Message use at A_Message'address;
>   begin
>     return Temp_Message;
>   end Extract_Message;
>
>   In many cases, I have actually created a more "Ada-like" message
>   type, and I do far more than just return the C structure.
>
>   I like the "feel" of this method. It uses the representation
>   specification which allows a structure to be placed "at" an address.
>   If this usage is not what the language designers had in mind, then
>   what was the purpose of the rep spec?

I believe the purpose of the "for...use at" clause is to allow you to
declare data whose address is fixed by, say, the processor
architecture or the operating system.

>   Is there any inherent danger or "wrongness" in this technique? And
>   yes, I have read the "for the purpose of overlaying....erroneous"
>   section in the LRM. Is this overlaying? Is it erroneous?

Yep, it's overlaying, since you have two Ada objects (A_Message and
Temp_Message) that you've declared to be at the same location.

>   Incidently, I use this same technique in bindings where I have to
>   deal with structures created in C. The C code malloc's the memory
>   and places structs in it, and then just passes back the C pointer.
>   I make the assumption (possibly in error in some cases) that a C
>   pointer and a System.Address are coincident. Then I can calculate
>   the address in the malloc'ed memory where a specific C structure
>   exists, and I can assign an Ada record "at" that address in order
>   to extract the information from it.

I'm assuming here that you're using PRAGMA IMPORT_FUNCTION or
something to get at your C code.  If that's the case, why not just
make the Ada function declaration return an ACCESS type to the desired
Ada structure?  (Unless, of course, you don't know beforehand which
Ada type the C function result will point to.)  You shouldn't even
have to worry about possible differences in representation between a C
pointer and an Ada access object; DEC Ada is good at taking care of
those things for you.

                                -- Adam

             reply	other threads:[~1993-08-18  2:11 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
1993-08-18  2:11 cis.ohio-state.edu!magnus.acs.ohio-state.edu!usenet.ins.cwru.edu!agate!do [this message]
  -- strict thread matches above, loose matches on Subject: below --
1993-09-01 14:36 Data Overlays David Emery
1993-09-01  4:23 Jim Lonjers
1993-08-31 20:36 dog.ee.lbl.gov!agate!howland.reston.ans.net!math.ohio-state.edu!magnus.ac
1993-08-31  3:51 Jim Lonjers
1993-08-23 14:17 Bob Crispen
1993-08-23 14:11 Alex Blakemore
1993-08-19 13:16 cs.utexas.edu!mars.tsd.arlut.utexas.edu!gardner
1993-08-19  2:18 portal!cup.portal.com!R_Tim_Coslet
1993-08-18 16:40 cis.ohio-state.edu!magnus.acs.ohio-state.edu!csn!news.den.mmc.com!iplmail
1993-08-18 16:27 Charles H. Sampson
1993-08-18 16:04 Charles H. Sampson
1993-08-18 12:55 cis.ohio-state.edu!magnus.acs.ohio-state.edu!csn!news.den.mmc.com!iplmail
1993-08-18 12:50 cis.ohio-state.edu!math.ohio-state.edu!howland.reston.ans.net!europa.eng.gtefsd.com!fs7.ece.cmu.edu!news.sei.cmu.edu!firth
1993-08-18  1:53 cis.ohio-state.edu!magnus.acs.ohio-state.edu!math.ohio-state.edu!howland.
1993-08-18  0:39 cis.ohio-state.edu!magnus.acs.ohio-state.edu!math.ohio-state.edu!cs.utexa
1993-08-17 15:16 Charles H. Sampson
1993-08-13 17:57 cgl!sgiblab!darwin.sura.net!mlb.semi.harris.com!x102a!scook
1993-08-13 12:48 Bob Gilbert
replies disabled

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