views:

53

answers:

1

I'm trying to do a short simulation where i needed a small bit array, and I chose System.Collections.Specialized.BitVector32.

I'm running it inside a single-threaded object, in a single-threaded loop about 1,000,000 times, each time for indexes {0,1,2}.

Here is the code:

private System.Collections.Specialized.BitVector32 currentCalc 
    = new System.Collections.Specialized.BitVector32();

private void storeInCurrent(int idx, bool val)
{
    currentCalc[idx] = val;
    if (currentCalc[idx] != val)
    {
        throw new Exception("Inconceivable!");
    }
}

To my understanding, the exception should not be thrown, but sometimes it does! An exception is not thrown every time, but in a fair percent - a CONSTANT 1/6 of the time! (which is even stranger)

What am I doing wrong?

+2  A: 

Look at MSDN; the indexer takes the mask, not the index. So that is:

int mask = 1 << idx;

then use currentCalc[mask]

This is odd though; if you are happy enough to use masks - why would one be using BitVector32, rather than just an int. I also assumed the indexer would take the index. VERY odd design decision.

Marc Gravell
same OS I'm using. same output.but your repro makes me think it's even weirder than i thought...
Kaneti
@Kaneti - revised; see edit.
Marc Gravell
done. my bad...
Kaneti
still, there should be some consistency between GET and SET...thanks.
Kaneti
The documentation does refer to the `bit` parameter as a *mask*. Basically it sets or clears the bits in the mask. But it's certainly not the clearest doc in the world... nor does this explain the OP's problem (I *think*).
Jon Skeet
When all else fails, read the docs! Reminds me of the "select is broken" story...
codekaizen
@Kaneti - there is also `BitVector32.CreateMask(index);` that might be of interest.
Marc Gravell
@Jon - well, it does. Setting a mask on zero does nothing. And getting a mask from 0 and comparing to the mask (0) will always be true, regardless of the value.
Marc Gravell
@Kaneti - see my reply to Jon re get/set not "agreeing". This only applies with mask 0.
Marc Gravell
@Marc: Yup, I was more referring to your sample code. Sorry for not being clear.
Jon Skeet
@!codekaizen: "select is broken" = http://www.codinghorror.com/blog/2008/03/the-first-rule-of-programming-its-always-your-fault.html
Kaneti