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