UnderwareDESIGN

PlayBASIC => Resources => Source Codes => Topic started by: kevin on February 28, 2010, 08:02:00 AM

Title: Swapping Typed Cells In Arrays
Post by: kevin on February 28, 2010, 08:02:00 AM
 Swapping Typed Cells In Arrays

 This little example demo's how you can manually swap a pair of cells within a typed array.  
     


[pbcode]

   Type tObject
         Name$
         X#,y#      
   EndType

   Dim Stuff(10) as TObject


   // Swapping The Handles Safely
   //
   // Normally we'd swap using this type of logic
   //
   //  Temp  = Item1
   //  Item1 = Item2
   //  Item2 =Temp
   //
   //   This is fine for integers/floats and strings, but not typed banks
   // within type arrays/lists.  As if you write over an existng type, it'll get
   // freed..  
   //
   //   One way aroudn this is peek/poke the array list the function bellow does
  //  This removes any catch of the PB freeing the data, but it does mean you hve to
  //  to be a little more careful.  
  //         
   
   Stuff(1) = New TObject   
   Stuff(1).Name$   ="Joe"
   Stuff(1).x#      =100
   Stuff(1).Y#      =101


   Stuff(2) = New TObject   
   Stuff(2).Name$   ="Bill"
   Stuff(2).x#      =200
   Stuff(2).Y#      =201


   
   // Display the 'handle' of this cells
   Print "Handles of Both Banks"
   print Stuff(1)
   print Stuff(2)


   // Since cell 5 and 1 are point at the same data, if i delete one of them
   // the other is doomed
   print ""
   print "results before swap"
   print ""
   print Stuff(1).name$
   print Stuff(1).x#
   print Stuff(1).y#
   
   print Stuff(2).name$
   print Stuff(2).x#
   print Stuff(2).y#


   SwapCells(1,2)


   // Display the 'handle' of this cells
   print ""
   print ""

   print "results after Swap"
   print ""

   Print "Handles of Both Banks"
   print Stuff(1)
   print Stuff(2)
   print ""
   print Stuff(1).name$
   print Stuff(1).x#
   print Stuff(1).y#
   
   print Stuff(2).name$
   print Stuff(2).x#
   print Stuff(2).y#




   Sync
   Waitkey
      
      


Function SwapCells(Index1,Index2)
   Ptr=getArrayPtr(Stuff())
   // Here we really should sanity check the pointer, as the Array might not exist !
   
   CellZeroPtr=Ptr+PBArrayStruct_size
   
   // Here it should sanity check the users inputs,
   
   Index1*=4
   Index2*=4

   // Read the bank handles from both cells
   TypeBank1=PeekInt(CellZeroPtr+Index1)   
   TypeBank2=PeekInt(CellZeroPtr+Index2)   

   // write them back in the oppisite order
   PokeInt CellZeroPtr+Index1, TypeBank2
   PokeInt CellZeroPtr+Index2, TypeBank1
   
EndFunction



[/pbcode]


The same type of approach can also be used on Typed Variables / Type Lists