Given an input device (basically a keyboard) that reports keyup and keydown, how may I most efficiently store and retrieve information about which keys are currently depressed? My first thought was a dynamic array, but maintaining and searching a dynamic array seems like a serious drain on resources.

john: well, an array of undefined length + searching it every time to see if a particular button is depressed seems like a good way to waste resources and slow down the program. Maybe I'm not understanding something correctly (always a possibility :)).
–
jamessonFeb 17 '13 at 15:02

@jamesson Sorry, here is an interesting explanation for C++ but they exists for any major language. cplusplus.com/forum/general/1590 . I will try to write up a nice explanation as an answer if I can in a bit (or anyone else) but I think this is a great solution for you. I have used bit flags for enumerating input types on embedded devices a fair bit as they are fast and memory efficient.
–
Akira71Feb 17 '13 at 15:04

1 Answer
1

A fixed-length array will work just fine, since the number of keys can't change.
So, make an array, call it depressed, of length N, where N is the number of keys on your input device.
When key X is depressed, set depressed[X] to True.
When key X is released, set depressed[X] to False.
To report the True/False state of any given key, you'll need a mapping from user-/API-level names, to indices into your array.
e.g. MOTOR_REVERSE_TOGGLE -> position 6 in your array.

As for efficiency, an array should be adequate for space, unless you've got very tight memory restrictions on whatever device you're programming. In that case, you'd use a bitfield to store the data. Basically, it's the same as your array, except instead of words being set to True or False (which would end up a some magic numbers, say for example 11111111 and 00000000), you set individual bits in a word to 1 or 0.