[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: accessing heap variable elements
On Sat, 12 May 2001, Ken Mankoff wrote:
> On Sat, 12 May 2001, Jared Crossley wrote:
>
> > Can any one explain this to me?
> > ------------------------------------
> > IDL> a=ptr_new( lonarr(2) )
> > IDL> help, a
> > A POINTER = <PtrHeapVar2229>
> > IDL> help, *a
> > <PtrHeapVar2229>
> > LONG = Array[2]
> > IDL> help, *a[0]
> > <PtrHeapVar2229>
> > LONG = Array[2]
> > IDL> help, *a[1]
> > % Attempt to subscript A with <INT ( 1)> is out of range.
> > ------------------------------------
> > I would expect that *a[0] and *a[1] would be long integers. How do I
> > access the elements in the long integer array heap variable?
> >
> > Thanks, Jared
>
> Hi Jared,
>
> last line should be (*a)[0]
>
> -k.
>
sorry, i realized i should include an explanation, as you requested.
its all about operator precedence. Now, "[" is *not* mentioned in the IDL
5.3 Online Help, but they have this:
Priority Operator
----------------------------------------------------------------------
First (highest) ( ) (parentheses, to group expressions)
Second * (pointer dereference)
^ (exponentiation)
Third * (multiplication)
# and ## (matrix multiplication)
etc.
I think its safe to assume that [ ] is parsed as ( ).
so:
( *a[ 0 ] EQ *(a[ 0 ]) )
which means "take subscript of 'a', then dereference it."
But 'a' is a pointer to an array, not an array of pointers. So you can't
subscript it, and even if you could, i'm not sure what you'd be
dereferenceing with your *.
You want the opposite order, or:
(*a)[ 0 ]
which means "dereference 'a', then take subscript."
-k.
--
Ken Mankoff
LASP://303.492.3264
http://lasp.colorado.edu/~mankoff/