comp.lang.ada
 help / color / mirror / Atom feed
From: "Steve" <nospam_steved94@comcast.net>
Subject: Re: copying data between memory locations
Date: Mon, 3 Sep 2007 09:26:29 -0700
Date: 2007-09-03T09:26:29-07:00	[thread overview]
Message-ID: <ZYqdnaImj8-gqEHbnZ2dnUVZ_hOdnZ2d@comcast.com> (raw)
In-Reply-To: 1188809968.217323.145640@r29g2000hsg.googlegroups.com

Your statement of the problem and your approach to the problem shows a "C" 
way of thinking.  In C you tend to think of the computer hardware you are 
manipulating.  In Ada you should tend to think more in the problem space.

You start out:
(1)    "In our current design, we have a package that maintains a list of 
descriptors of various buffers in the application."

A nice language independent statement.  Then you go on:
(2)    "We don't want to know their datatypes or how to write data into 
them."

With this statement you are implying "untyped" data.  In the C way of 
thinking a block of memory has no associated type, and you can store 
anything in that memory.

Then you continue:
(3)    "We only want to maintain a physical address of them and use that 
address to directly write data into these buffers (this data comes out 
incoming packets over the network)."

Here you have really locked things down as a C approach, using the term 
physical address.

Another way to approach the problem is:
  In our current design, whe have a package that maintains a list of 
discriptors of various buffers in the application.  The data contained in 
these buffers consists of a stream of bytes of incoming packets over the 
network.  There must be a systematic way of accessing the data contained in 
these buffers.

  Now for you buffer I suggest:

type byte is range 0..255;
for byte'size use 8;

type byte_array is array( <> ) of byte;

type BUFFER_DETAILS_RECORD( num_bytes : Integer ) is
record
  data : byte_array( 1 .. num_bytes);
end record;

  You can create a series of unchecked conversion functions for retrieving 
data from slices in the data buffers.

Regards,
Steve

<jef.mangelschots@gmail.com> wrote in message 
news:1188809968.217323.145640@r29g2000hsg.googlegroups.com...
> In our current design, we have a package that maintains a list of
> descriptors of various buffers in the application. We don't want to
> know their datatypes or how to write data into them. We only want to
> maintain a physical address of them and use that address to directly
> write data into these buffers (this data comes out incoming packets
> over the network).
>
> In C, this is very straightforward and use the address as a pointer
> and simply copy the packet into the memory location.
> I can't figure out a way to do this in Ada (at least not Ada83).
>
> suppose the following:
>
> type BUFFER_DETAILS_RECORD is
> record
>    num_bytes : integer;
>    start_address : system.address;
> end record;
> type BUFFER_DETAILS_ARRAY_TYPE is array(1..2) of
> BUFFER_DETAILS_RECORD;
> BUFFER_DETAILS : constant BUFFER_DETAILS_ARRAY_TYPE :=
> BUFFER_DETAILS_ARRAY_TYPE'(1 => (num_bytes => 100, start_address =>
> 16#123# ),  1 => (num_bytes => 200, start_address => 16#456# ));
>
> procedure insert_block(idx : in integer; num_bytes : in integer;
> offset : in integer; data : BYTE_ARRAY_TYPE) is
> begin
>   ??? how do I copy the content of data into the memory pointed to by
> BUFFER_DETAILS(idx).start_address + offset
> end;
> 





  parent reply	other threads:[~2007-09-03 16:26 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-09-03  8:59 copying data between memory locations jef.mangelschots
2007-09-03 10:38 ` Martin Krischik
2007-09-04 15:57   ` Adam Beneschan
2007-09-04 18:16     ` jef.mangelschots
2007-09-04 20:12       ` Jeffrey R. Carter
2007-09-03 11:09 ` Niklas Holsti
2007-09-03 16:26 ` Steve [this message]
2007-09-03 17:22 ` Jeffrey R. Carter
2007-09-04 11:31 ` Stephen Leake
2007-09-05  4:39 ` anon
replies disabled

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