If we need to use our keyed dictionary lookup functions for a purpose where we will change the values for any or all keys the string we save in dictionary$ will get larger each time we set a key and value. This is because the setValueByName subroutine sets a key and value by adding onto the front of the dictionary$ variable but it does not remove any preexisting value for that key. So if for example I set a key of "storeFolder" and a value of "c:\myStoreFolder" and then later I change the value to "c:\myOtherFolder" I will have two different entries for the key "storeFolder". Only the latest value will be returned by the getValue$() function.
So, how do we fix this? We implement a garbage collector. We can create a subroutine that makes a copy of dictionary$ that only has the latest value for each key.
Here is a first stab at a garbage collector subroutine.
sub collectGarbage
pointer = 1
while pointer > 0
'get the next key
pointer = instr(dictionary$, "~key~", pointer)
if pointer then
keyPointer = pointer + 5
pointer = instr(dictionary$, "~value~", pointer)
key$ = mid$(dictionary$, keyPointer, pointer - keyPointer)
if instr(keyList$, key$) = 0 then
value$ = getValue$(key$)
newDictionary$ = "~key~" + key$ + "~value~" + value$ + newDictionary$
keyList$ = keyList$ + key$
end if
end if
wend
dictionary$ = newDictionary$
end sub
Monday, July 11, 2016
Dictionary lookup - Garbage collection
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment