[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: taming the shrew, a.k.a. structure

Todd Clements writes:

> Pointers 
> are fun and useful things, but that also means that you have to worry 
> about cleaning them up when you're done.
> myStruct = {myStruct, array1: ptr_new()}
> Then, in your code:
> myStruct.array1 = ptr_new( fltarr( startSize ) )

Too true. Although one could easily write a little
program to free structure pointers:

  PRO Free_Pointers, structure
  FOR j=0,N_Tags(structure)-1 DO BEGIN
      type = Size(structure.(j), /TName)
      IF type EQ 'POINTER' THEN Ptr_Free, structure.(j)

Extra credit for making this recursive. :-)

> Of course, if you need to shorten or lengthen this later, you have to 
> remember to dispose of the pointer that you made AFTER you make the new 
> one.

Not really. The nice thing about IDL pointers is that
IDL will take care of all the memory manipulation
for you. You don't have to worry about it at all.

> temp = myStruct.array1
> myStruct.array1 = ptr_new( (*myStruct.array1)[0:1024] )
> ptr_free, temp

This really becomes nothing more than this:

   *myStruct.array1 = (*myStruct.array1)[0:1024]

There is no need to free the old pointer, make
a new one etc. Pointers are like IDL variables
in this respect. They *always* point to the 
current thing you have pointed them too.
> It's sometimes a lot of work to use pointers, but they do exactly what 
> you describe you want to.

If by "a lot of work" you mean you have to use
more parentheses than normal, I would agree with
you. Sometimes that syntax drives me crazy! But
the benefits you gain far exceed the cost.



David Fanning, Ph.D.
Fanning Software Consulting
Phone: 970-221-0438 E-Mail: davidf@dfanning.com
Coyote's Guide to IDL Programming: http://www.dfanning.com/
Toll-Free IDL Book Orders: 1-888-461-0155