I think i found a bug with select case.
I'm using B4i V5.30 but this has been there from before, because i remember writing a workaround in a hurry many months ago.
I have a set of bytes that come from a bluetooth communication, i put the bytes in a byte array ("frame") and the byte array in a list.
So far so good.
Then the head of the frame (byte in position zero) is checked in a Select Case statement to select how to interpret the following data.
However, the app wasn't entering the required case and i had to work around it by doing an IF check in the "case else" statement.
This is the code i used to test (I apologize for not going up to 255 but this is enough, i had problems with value "144")
The behaviour is different in the two cases for values over 127.
for tstSingleByte the logs are
because in B4i bytes are signed (would have preferred unsigned bytes but whatever.)
for tstByte(0) instead
And here we see that the byte is interpreted as UNSIGNED and the comparison fails.
checking the byte with "if" instead works correctly.
the B4A version of the application doesn't have this issue
I'm using B4i V5.30 but this has been there from before, because i remember writing a workaround in a hurry many months ago.
I have a set of bytes that come from a bluetooth communication, i put the bytes in a byte array ("frame") and the byte array in a list.
So far so good.
Then the head of the frame (byte in position zero) is checked in a Select Case statement to select how to interpret the following data.
However, the app wasn't entering the required case and i had to work around it by doing an IF check in the "case else" statement.
This is the code i used to test (I apologize for not going up to 255 but this is enough, i had problems with value "144")
B4X:
'Test byte
Dim tstByte(6) As Byte
tstByte(0) = 0
For idx = 0 To 159
tstByte(0) = idx
Select Case tstByte(0)
Case 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49
Log(tstByte(0) & " Correct")
Case 50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99
Log(tstByte(0) & " Correct")
Case 100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129
Log(tstByte(0) & " Correct")
Case 130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159
Log(tstByte(0) & " Correct")
Case Else
Log(tstByte(0) & " Wrong")
End Select
Next
Dim tstSingleByte As Byte
tstSingleByte = 0
For idx = 0 To 159
tstSingleByte = idx
Select Case tstSingleByte
Case 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49
Log(tstSingleByte & " Correct")
Case 50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99
Log(tstSingleByte & " Correct")
Case 100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129
Log(tstSingleByte & " Correct")
Case 130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159
Log(tstSingleByte & " Correct")
Case Else
Log(tstSingleByte & " Wrong")
End Select
Next
The behaviour is different in the two cases for values over 127.
for tstSingleByte the logs are
B4X:
127 Correct
-128 Correct
for tstByte(0) instead
B4X:
127 Correct
128 Wrong
checking the byte with "if" instead works correctly.
the B4A version of the application doesn't have this issue