Re: Moving to objects loses array functionality? [message #63305] |
Mon, 03 November 2008 15:18  |
Paul Van Delst[1]
Messages: 1157 Registered: April 2002
|
Senior Member |
|
|
Demitri wrote:
> Hi,
>
> I'm trying to implement some of my data as proper IDL objects, but I'm
> either missing some syntax or else am losing some array functionality in
> the process.
>
> Let's say I have the following structures:
>
> void = {BOOK, $
> author : '', $
> pChapters : PTR_NEW()}
>
> void = {CHAPTER, $
> title : '', $
> pageCount : 0}
>
> pChapters is a pointer to contain a variable number of chapters in the
> BOOK structure. If I create an array of BOOKs, I can do this:
>
> IDL> print, books.author
>
> ...and get a list of all of the authors. I can also use utilities like
> WHERE of course.
>
> What I'm wondering is if I can extract a list of, say, all of the
> chapter names as a list (perhaps my example doesn't seem useful, but
> ignore that!). I was hoping something like this would work:
>
> IDL> print, (*books.pChapters).title
>
> ...especially since "books.pChapters" does return an array of pointers.
>
> Is there something I can do here without resorting to FOR loops within
> methods in the BOOK object?
The IDL documentation specifically states the dereference operator requires a scalar operand:
<quote>
Dereferencing Pointer Arrays
Note that the dereference operator requires a scalar pointer operand. This means that if
you are dealing with a pointer array, you must specify which element to dereference. For
example, create a three-element pointer array, allocating a new heap variable for each
element:
ptarr = PTRARR(3, /ALLOCATE_HEAP)
To initialize this array such that the heap variable pointed at by the first pointer
contains the integer zero, the second the integer one, and the third the integer two, you
would use the following statement:
FOR I = 0,2 DO *ptarr[I] = I
</quote>
So it would appear the facile answer to your question is: no. The documentation itself
suggests the use of for-loops.
But, maybe some gun IDL guru out there may be able to conflate the histogram procedure and
pointer dereferencing to do what you want? (I'd like to see that :o)
cheers,
paulv
|
|
|
Re: Moving to objects loses array functionality? [message #63358 is a reply to message #63305] |
Tue, 04 November 2008 13:50  |
|
Originally posted by: Demitri
Hi Paul,
On 2008-11-03 18:18:18 -0500, Paul van Delst <Paul.vanDelst@noaa.gov> said:
>
The IDL documentation specifically states the dereference operator
requires a scalar operand:
>
> <quote>
> Dereferencing Pointer Arrays
>
> Note that the dereference operator requires a scalar pointer operand.
> This means that if you are dealing with a pointer array, you must
> specify which element to dereference. For example, create a
> three-element pointer array, allocating a new heap variable for each
> element:
>
> ptarr = PTRARR(3, /ALLOCATE_HEAP)
>
> To initialize this array such that the heap variable pointed at by the
> first pointer contains the integer zero, the second the integer one,
> and the third the integer two, you would use the following statement:
>
> FOR I = 0,2 DO *ptarr[I] = I
> </quote>
>
>
> So it would appear the facile answer to your question is: no. The
> documentation itself suggests the use of for-loops.
>
> But, maybe some gun IDL guru out there may be able to conflate the
> histogram procedure and pointer dereferencing to do what you want?
> (I'd like to see that :o)
>
> cheers,
>
> paulv
Thanks for pointing that out - I missed that in the documentation. I
can completely understand how assigning the values would require a FOR
loop, but I was hoping that IDL could dynamically send the "message" to
the (dereferenced) structure to read the value. I'll assume that this
cannot be done until someone can prove me wrong!
Cheers,
Demitri
|
|
|