Ask the MultiValued Visual Basic Expert - #13B

(as published in Spectrum magazine Jan/Feb 1999)

To email your questions to "Ask the MultiValued VB Expert", click here.
Copyright 1996-98 Caduceus Consulting. All rights reserved.

The True/False Trap

I read your column on your web site since I don't get the Spectrum magazine. Thanks for all the tips and sample code. This question may not rate publishing, but I would really appreciate some help.

I wrote my own VB function called APIndex that works like the old INDEX function, but while converting some Data/Basic code to VB, I encountered a problem. My original code read: "IF NOT(INDEX(CMD,"/",1)) THEN". My new VB code reads: "If Not APIndex(Cmd$,"/",1) Then". The problem is that the Else clause never runs, regardless of whether Cmd$ has a "/" or not. I rewrote the code to make it work, but I don't understand why my first attempt did not. Can you explain it? - Jennifer C., N.S.W., Australia

G'day Jennifer! No worries - your question fits perfectly, especially because the problem, which I call the True/False Trap, specifically targets experienced MultiValue programmers. There is probably nothing wrong with your APIndex function. If Cmd$ is "ABC", then APIndex returns 0, and your "If" statement is True (because Not 0 is True). If Cmd$ is "A/C", then APIndex returns 2, but your "If" statement is still True (because Not 2 evaluates to -3 which qualifies as True)! The catch is with the Not operator.

The MultiValue NOT function is a Boolean function: If the expression is 0 (false), it returns a 1 (true); if the expression is non-zero (true) it returns a 0 (false). The VB Not operator is a bitwise operator: The expression is treated as an integer, and every bit in that integer is flipped (0 to 1, 1 to 0). 2 is stored as 0000000000000010, so Not 2 becomes 1111111111111101. Given that the first bit is the sign bit (positive/negative) and that negative numbers count downwards, 1111111111111101 is really -3. (This also explains why the VB concept of True is -1.)

Your red flag is the Not operator. Always ensure that the Not operator is only applied to expressions that can only be True or False, not other integers. This line would work correctly for you: "If Not APIndex(Cmd$,"/",1) <> 0 Then".

Note that the same warning applies to the VB "And" operator. Consider the statement: "Flag = (APosn% And BCode%)". If APosn% is 1 (true) and BCode% is -2 (true), then Flag will be False (1 And -2 equals 0)! In other words, your code will work fine until the day that you And a value 'n' with '-(n+1)'. Be careful!

To email your questions to "Ask the MultiValued VB Expert", click here.
Copyright 1996-98 Caduceus Consulting. All rights reserved.
Revised: November 10, 1998.

Return to Caduceus Consulting Home Page

Copyright 2006 intellact
Last modified: Thursday May 25, 2006