[Gambas-user] Referencing an array element with boolean

Tobias Boege taboege at ...626...
Sat Jun 21 12:28:28 CEST 2014


On Sat, 21 Jun 2014, Patrik Karlsson wrote:
> Many years ago when I was programming in Delphi I used to have object
> arrays of size 2 and referencing to the element index with true and false.
> This was very very useful.
> 
> It was possible since false=0 and true=+1.
> In Gambas we have false=0 and true=-1.
> 
> So now I came up with:
>   Dim sMoods As String[] = ["Sad", "Happy"]
>   Dim bHappiness As Boolean
> 
>   Debug CInt(True), Abs(True), Abs(CInt(True))
>   Debug CInt(False), Abs(False), Abs(CInt(False))
> 
>   bHappiness = False
>   Debug "bHappiness= "; bHappiness; ": " & sMoods[Abs(CInt(bHappiness))]
>   Debug "bHappiness= "; bHappiness; ": " & sMoods[If(bHappiness, 1, 0)]
> 
>   bHappiness = True
>   Debug "bHappiness= "; bHappiness; ": " & sMoods[Abs(CInt(bHappiness))]
>   Debug "bHappiness= "; bHappiness; ": " & sMoods[If(bHappiness, 1, 0)]
> 
> 1. Why is Abs(True) True?
> 

Because the mapping Integer -> Boolean is not injective. The rule is: 0 maps
to False, everything else maps to True. To be able to map Boolean -> Integer
the convention used in Gambas is False maps to zero (of course) and True maps
to -1, which makes actually sense if you don't look into the array index but
into the bit flags direction (True means "all bits set" in Gambas, which is
what -1 is in two's complement). So what happens is:

Abs(True) becomes Abs(CInt(True)) on the fly which is Abs(-1) = 1 which is
non-zero and thus True again.

> 2. Which is fastest, Abs(CInt(... or If(... ? I guess that If(... is more
> future proof.
> 

IIf() (or If() for short) is likely to be more expensive because it needs to
evaluate both expressions, the true and the false one, before it decides
which to use. Since these are only numbers in your use case, it's really
hard to say - and I bet even harder to measure anyways.

> 3. I have a "BoolToIndex" function in a library module but I was thinking
> if it should not be part of the language, to be able to reference in
> a _simple_ way to an array element with a boolean.
> 

I don't know.

If I have to do what you want, I skip the array indirection and simply do:

  Debug IIf(bHappiness, ("Happy"), ("Sad"))

Since you want only Boolean indices, it's never going to be more code to
type...

Regards,
Tobi

-- 
"There's an old saying: Don't change anything... ever!" -- Mr. Monk




More information about the User mailing list