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

Re: User selectable lower array bound?



David Fanning wrote:
> 
> Ben Tupper writes:
> 
> > I just whipped up an object to allow you to do just this kind of
> > pseudo-indexing for 1d vectors.
> 
> Oh, sure, you can do it with objects. But
> isn't that, like, cheating? In any case,
> scientists are too busy to learn yet one
> more useful programming practice.

Mostly, yes, :o) but, with all due respect to Ben and his rather natty and cool code
snippet (I'm facing north towards Maine, bowing :o),  I would rephrase it more like:

"some scientists would like variable-bounds indexing to be indistinguishable from current
command line vector/matrix operations without having to learn :


;--------START HERE
; EXAMPLE
;       IDL> x = obj_new('findgen', 11, lower = -5)
;       IDL> print, x->GetData([-4, 0, 5])
;      1.00000      5.00000      10.0000
;       IDL> obj_destroy, x
;------
;       GetData
;------
FUNCTION FINDGEN::GetData, Indices
Return, (*Self.Data) [Indices - Self.Lower]
END; GetData
;------
;       SetProperty
;------
PRO FINDGEN::SetProperty, N = N, Lower = Lower
If n_elements(Data) NE 0 Then *Self.Data = Data
If n_elements(N) NE 0 Then Begin
                ;1d vectors only
        Self.N = N[0]           
                ;either 'redefine' the variable or 'undefine' it
        If Self.N GT 0 Then *Self.Data = Findgen(Self.N) Else $ 
                Dummy = Size(Temporary(*Self.Data))  
EndIf
If n_elements(Lower) NE 0 Then Self.Lower = Lower[0]
END     ;SetProperty
;------
;       GetProperty
;------
PRO FINDGEN::GetProperty, Data = Data, N = N, Lower = Lower
If Arg_present(Data) Then Data =  *Self.Data
N = Self.N
Lower = Self.Lower
END     ;GetProperty
;------
;       Initialization
;------
FUNCTION FINDGEN::INIT, N, LOWER = lower
If n_elements(N) EQ 0 Then Self.N = 0L Else Self.N = 0L > N[0]
If n_elements(lower) EQ 0 Then Self.Lower = 0L Else Self.Lower = Lower[0]
If Self.N GT 0 Then Self.Data = Ptr_NEW(Findgen(Self.N))        Else $
        Self.Data = Ptr_NEW(/Allocate)
Return, 1
END     ;Init
;-----
; CleanUp
;-----
PRO FINDGEN::CleanUp
If Ptr_Valid(Self.Data) Then Ptr_Free, Self.Data
END     ;CleanUp
;-----
;       Definiton
;------
PRO FINDGEN__DEFINE
Struct = {FINDGEN, $
        Data: ptr_new(), $      ; the data array
        N: 0L, $                        ;this handles only 1d arrays right now
        Lower: 0L}                      ;the indexed address of the lower bound 
END
;--------END HERE"


-- 
Paul van Delst           A little learning is a dangerous thing;
CIMSS @ NOAA/NCEP        Drink deep, or taste not the Pierian spring;
Ph: (301)763-8000 x7274  There shallow draughts intoxicate the brain,
Fax:(301)763-8545        And drinking largely sobers us again.
                                         Alexander Pope.