-
Notifications
You must be signed in to change notification settings - Fork 11
Open
Description
I have found that condition
if (x == 0x08) or (x == 0x04): # BUG is HERE!!
seed += 1
is always true
When I rewrite that condition to two simpler conditions, it works OK.
if x == 0x08:
seed += 1
elif x == 0x04:
seed += 1
A bug demo, "monkey piano" has two versions of simple pseudo-random generators rnd1() and rnd2(). These functions differ in condition, function rnd1() is buggy and always sets the lowest bit (seed +=1). Function rnd2() works, it generates sequence of 15 numbers.
#-------------Setup----------------
import Ed
Ed.EdisonVersion = Ed.V2
Ed.DistanceUnits = Ed.CM
Ed.Tempo = Ed.TEMPO_MEDIUM
#--------Your code below-----------
def rnd1():
global seed
if seed == 0:
seed = 1
x = seed & 0x0c
seed += seed
if (x == 0x08) or (x == 0x04): # BUG is HERE, condition is always TRUE
seed += 1
seed &= 0x0f
return seed
def rnd2():
global seed
if seed == 0:
seed = 1
x = seed & 0x0c
seed += seed
if x == 0x08:
seed += 1
elif x == 0x04:
seed += 1
seed &= 0x0f
return seed
def num2tone(x):
duration = Ed.NOTE_QUARTER
if x >= 8:
duration = Ed.NOTE_HALF
x %= 8
if x == 0:
t = Ed.NOTE_C_7
elif x == 1:
t = Ed.NOTE_D_7
elif x == 2:
t = Ed.NOTE_E_7
elif x == 3:
t = Ed.NOTE_F_7
elif x == 4:
t = Ed.NOTE_G_7
elif x == 5:
t = Ed.NOTE_A_7
elif x == 6:
t = Ed.NOTE_B_7
elif x == 7:
t = Ed.NOTE_C_8
Ed.PlayTone(t, duration)
while Ed.ReadMusicEnd() == Ed.MUSIC_NOT_FINISHED:
pass
## MAIN()
seed = 1
while True:
r = rnd1() # function with a bug # 0x03 0x07 0x0f 0x0f 0x0f 0x0f
#r = rnd2() # this works ok # 0x02 0x04 0x09 0x03 0x06 0x0d
Ed.SendIRData(seed)
Ed.TimeWait(100, Ed.TIME_MILLISECONDS)
num2tone(r)
Demo for python at PC, it works:
def rnd():
global seed
if seed == 0:
seed = 1
x = seed & 0x0c
seed += seed
if (x == 0x08) or (x == 0x04):
seed += 1
seed &= 0x0f
return seed
### MAIN()
seed = 1
for i in range(20):
print rnd()
Simpler bug demo for Edison robot, just play with LEDs:
#-------------Setup----------------
import Ed
Ed.EdisonVersion = Ed.V2
Ed.DistanceUnits = Ed.CM
Ed.Tempo = Ed.TEMPO_MEDIUM
#--------Your code below-----------
# a=0 b=0 => OK
# a=0 b=1 => BUG (Left LED is not activated)
# a=1 b=0 => BUG (Left LED is not activated)
# a=1 b=1 => BUG (Left LED is not activated)
a = 0
b = 1
if (a==1) or (b==1): # BUG is here, condition is always FALSE
Ed.LeftLed(Ed.ON)
if (a==1):
Ed.RightLed(Ed.ON)
elif (b==1):
Ed.RightLed(Ed.ON)
while True:
pass
and reference version for PC:
a = 0
b = 1
if (a==1) or (b==1):
print "LEFT"
if (a==1):
print "RIGHT"
elif (b==1):
print "RIGHT"
Metadata
Metadata
Assignees
Labels
No labels