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

Re: Structure field concatenation



Hello,

Geez, you post such great stuff.   Thank you for taking the time to do so.

I hadn't thought that the empty list method I lean on was awkward until you
mentioned it... now I'm all thumbs.   I can see the utility in each
method you
outline.

I don't know how David deals with emptied lists, but here's how I
usually do it.
In general, when a list must be emptied, I have employed the UNDEFINE procedure
(available from David's or Martin's website.)

    UNDEFINE, *myPtr

The UNDEFINE procedure calls the SIZE() function...

    Sz = SIZE(TEMPORARY(*myPtr))

I test the emptiness of a pointer with N_ELEMENTS() before adding to the list...

    If N_ELEMENTS(*Ptr) EQ 0 then *Ptr = NewValue Else *Ptr = [*Ptr, NewValue]


"J.D. Smith" wrote:

>
> Also, how is an undefined pointer created manually after the fact -- i.e., how
> do you "empty" am already filled list?  Something awkward like:
>
> ptr_free, theValue
> theValue=ptr_new(/alloc)
>
> where I would only need the first line.  To be fair to the advantages of the
> Undefined method... if changing the pointed-to value altogether, they need only:
>
> *theValue=newvalue
>
> whereas I require:
>
> if ptr_valid(theValue) then *theValue=newvalue else theValue=ptr_new(newvalue)
>

I was curious about the time it takes to run method 1 versus method 2.  
 Below is
a quick test of each method.
I did not use UNDEFINE procedure directly because it checks for
arguments which
slows things down.  I placed the Sz = SIZE(TEMPORARY(*myPtr)) statement
in its
stead.

There doesn't seem to be any time difference, which makes suspicious
that I don't
have a good test here.   (BTW, the ratio is 2.2 if I call UNDEFINE,
which I usually
do.)  Here are the results:

IDL> list_ptr
Elapsed time to empty/fill list using method #1
     0.066666603 seconds
Elapsed time to empty/fill list using method #2
     0.066666603 seconds
Ratio of #2 / #1
       1.0000000



Ben

;------START
PRO LIST_PTR

X = Findgen(100)

A = PTR_NEW(X)
B = PTR_NEW(X)

Start1 = SysTime(/Seconds)
For i = 0L, 10000 Do Begin
 Ptr_Free, B
 If NOT Ptr_Valid(B) Then B = Ptr_NEW(X) Else *B = [*B, X]
EndFor
Fini1= SysTime(/Seconds)

Print, 'Elapsed time to empty/fill list using method #1'
Print, Fini1-Start1, ' seconds'

Start2 = SysTime(/Seconds)
For i = 0L, 10000 Do begin
 tempvar = SIZE(TEMPORARY(*A))
 If N_elements(*A) EQ 0 Then *A = X Else *A = [*A,X]
EndFor
Fini2 = Systime(/Seconds)

Print, 'Elapsed time to empty/fill list using method #2'
Print, Fini2-Start2, ' seconds'


Print, 'Ratio of #2 / #1'
print, (Fini2-Start2)/(Fini1-Start1)

Ptr_Free, A, B
END
;----------END



--
Ben Tupper
Bigelow Laboratory for Ocean Science
West Boothbay Harbor, Maine
btupper@bigelow.org
     note: email address new as of 25JULY2000