Announcement

Collapse
No announcement yet.

Request for new function "Array Scan"

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Request for new function "Array Scan"

    I have not seen request for this.
    If it is already on the wish-list, please tick it once more.

    I frequently need to scan arrays in 'reverse' direction to ensure that
    my first hit is the 'latest insert' in the array

    ARRAY SCAN REVERSE A()....
    or
    ARRAY SCAN A(Ubound(A)),FOR -200,......


    ------------------
    Fred
    mailto:[email protected][email protected]</A>
    http://www.oxenby.se

    Fred
    mailto:[email protected][email protected]</A>
    http://www.oxenby.se

  • #2
    Fred, are you a mind reader? Thought about the exact same thing
    only a couple of days ago. I fully support this wish..

    ------------------

    Comment


    • #3
      Hi guys

      You could SORT DESCENDING on a TAGARRAY and then do the ARRAY
      SCAN...

      As in:
      Code:
      #COMPILE EXE
      
      FUNCTION PBMAIN() AS LONG
          DIM i AS LONG
          DIM a(0:26) AS STRING
          DIM b(0:26) AS LONG
          
          FOR i = 1 TO 27
              a(i-1) = CHR$(i+47) + "Hello there" + CHR$(i+47)
              b(i-1) = i
          NEXT
          
          ARRAY SORT a(0), TAGARRAY b(), DESCEND
      
          ARRAY SCAN a(), = "JHello thereJ", TO i
          PRINT a(i-1)
          
          WAITKEY$
      END FUNCTION

      But I agree it would be a useful short cut...

      Cheers

      Florent

      ------------------

      Comment


      • #4
        Yes, if the array can be manipulated, but we usually want to
        keep it intact, plus, in time critical code, it makes things a
        lot slower, especially with large arrays. Backwards SCAN would
        enable us to speed up many things quite a bit.

        For purpose of quickly finding latest inserted item, one could use
        a tagged array of Longs though, where you set UBOUND(tArray) to
        matching array item each time one is inserted and then use,
        ARRAY SCAN tArray(), = UBOUND(tArray) - 1

        But if items only are added to an array, Array(UBOUND(Array) - 1)
        will of course do the same thing much faster..


        ------------------

        Comment


        • #5
          If you are trying to determine if "my first hit is the 'latest insert' in the array"
          why not examine the last subscript and not do an array scan?

          I know it must not be this simple but it appears to be.


          ------------------
          Ron

          Comment


          • #6
            Florent, My need is unsorted array of UDT's with >100,000 elements
            I have tried your way, but you have to create (or maintain) the
            array of element-numbers and make two Array Sort on this, one before and one
            after the Array Scan. Just one word -ItIsNotFastEnogh
            ----
            There is a way to 'sort'. If you have a Udt like this:
            Code:
            Type MyUdt
             ElementNr    as long
             OtherElement as string 
             Date         as Double
             etc
            End Type
            
            When you add new elements you do it this way
            -----
            Dim Udt as MyUdt
              .... 
              NewRec& = Ubound(Array)+1
              Redim Preserve Array(NewRec&)
              ceRweN$ = Peek$(VarPtr(NewRec&),4)
              ceRweN$ = StrReverse$(ceRweN$)
              Poke$ VarPtr(Udt.ElementNr),ceRweN$
              Array(NewRec&) = Udt
                 
              Array Sort Array(),From 1 To 3,DESCEND
              ....
              Now the Array element is in 'reverse' order
            Just a thought
            ---------
            Ron, I am scanning for the last inserted item matching the search-criteria,
            not the last inserted item...


            ------------------
            Fred
            mailto:[email protected][email protected]</A>
            http://www.oxenby.se



            [This message has been edited by Fred Oxenby (edited January 08, 2001).]
            Fred
            mailto:[email protected][email protected]</A>
            http://www.oxenby.se

            Comment


            • #7
              Great idea guys... I've passed it on to R&D.


              ------------------
              Lance
              PowerBASIC Support
              mailto:[email protected][email protected]</A>
              Lance
              mailto:[email protected]

              Comment


              • #8
                Ron, I am scanning for the last inserted item matching the search-criteria,
                not the last inserted item...
                A couple of things...

                A. If you are looking for the last inserted item meeting a criteria, why bother sorting the array at all?
                B. Doing a REDIM PRESERVE for *every* insert takes time; better perhaps to allocate new "block" of elements (maybe 100 at a time, using something like REDIM PRESERVE FooArray (1: UBOUND(FooArray) + 100) and keep trak of the number of valid elements.)
                C. If "entry sequence" is important to you, it should be part your sort key.
                D. If none of these methods floats your boat, I published a linked-list method of keeping a list of UDTs in sorted order by three keys at once. This code is public domain, available at the IMS web site. The December, 1998 issue of "BASICally Speaking" included MS-DOS code along with a detailed explanation of what I was doing in an article entitled, "Make Haste,Not Waste." The April, 1999 issue contained the migration of that code to PB/Win32 in an article entitled, "Dynamic Allocation and Linked Lists: Porting from PB/DOS to PB/CC"
                Since the code is public domain it may be posted in the source code forum by anyone. The article texts are copyright; reprints are available from IMS at http://www.infoms.com, follow the links to Basically Speaking.

                Bottom line: ARRAY SCAN BACKWARDS may be a neat feature, but just looking at you application I think you have a number of things to try to speed it up without waiting for a new feature.




                ------------------
                Michael Mattias
                Racine WI USA
                [email protected]
                Michael Mattias
                Tal Systems (retired)
                Port Washington WI USA
                [email protected]
                http://www.talsystems.com

                Comment

                Working...
                X