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;
>
next prev 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