comp.lang.ada
 help / color / mirror / Atom feed
From: Michael Carman <mjcarman@home.com>
Subject: Array access via pointer?
Date: 2000/08/01
Date: 2000-08-01T00:00:00+00:00	[thread overview]
Message-ID: <398721AD.CAEE3A51@home.com> (raw)

First, a warning: my knowledge of Ada is pretty rudimentary, and I tend
to use the terms I'm familiar with from other languages. If words like
"pointer" and "reference" betray that background, oh well.

Quick overview:
I have several arrays, each holding the same type of data (system 
addresses) but the arrays are of different sizes. I want to have a 
single procedure to process the data in these arrays. (For various 
reasons, the numbers/sizes of arrays are necessary, so no paradigm 
shifts allowed there!) In order to do this I pass my procedure a
pointer to an array and an index into it. It looks something like
this:

type Addr_Table is array (Natural range <>) of System.Address;

Arr1 : Addr_Table (0 .. 100);
Arr2 : Addr_Table (0 .. 20);

procedure Foo (Addr : in System.Address;
               I    : in Integer) is
begin
    -- Do something with index I of the array at Addr
end Foo;

A call to it might look like Foo (Arr2'Address, 7). Inside Foo, I tried 
to get at the array data in this manner:

    Data := Addr_To_Ptr(Addr).all (Idx);

where 

    type Addr_Table_Ptr is access Addr_Table;
    function Addr_To_Ptr is new Unchecked_Conversion
        (System.Address, Addr_Table_Ptr);

but that gave me a constraint error, apparently because type Addr_Table 
is unconstrained and the instantiaions of it are not. Yes, if Addr_Table
had a definate size this would be easy, but it doesn't and (for me) it's
not.

The only way I've been able to make it work is with this:

    Data := Addr_To_Ptr(Addr + Idx * Size_In_Words).all;

where

    type Addr_Ptr is access System.Address;
    function Addr_To_Ptr is new Unchecked_Conversion
        (System.Address, Addr_Ptr);
    Size_In_Words := System.Word_Size / System.Storage_Unit;

but that seems unnecessarily messy. Well, it looks like C, which 
wouldn't really bother me but I'm not writing C at the moment. It 
seems to me that there should be a way to do this without having to 
fight against the language. So, what's the canonical way of doing 
this in Ada?

-mjc




             reply	other threads:[~2000-08-01  0:00 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2000-08-01  0:00 Michael Carman [this message]
2000-08-01  0:00 ` Array access via pointer? Ted Dennison
2000-08-02  0:00   ` Michael Carman
2000-08-03  0:00     ` Ken Garlington
2000-08-03  0:00       ` Robert A Duff
2000-08-03  0:00         ` Ken Garlington
2000-08-04  0:00           ` Robert I. Eachus
2000-08-04  0:00             ` Ken Garlington
2000-08-02  0:00 ` Markku Kotiaho
2000-08-02  0:00 ` tmoran
2000-08-02  0:00   ` Michael Carman
2000-08-02  0:00     ` tmoran
replies disabled

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