На самом деле не могу понять, почему моя программа не работает
Я действительно потратил много времени, работая над этой проблемой и пытаясь найти решение, но не могу понять, в чем дело.
Я учусь кодировать occam и имею следующую программу:
PROC light (CHAN OF BYTE screen, CHAN OF INT light.change)
INT light.on :
WHILE TRUE
SEQ
light.change ? light.on
IF
light.on = 1
screen ! 'y'
TRUE
SKIP
:
PROC test(CHAN OF BYTE keyboard, scr)
CHAN OF INT to.light :
INITIAL INT on IS 1(INT) :
BYTE b :
SEQ
light(scr, to.light)
WHILE TRUE
SEQ
keyboard ? b
IF
b = 'o'
to.light ! on
TRUE
SKIP
:
Все, что я пытаюсь сделать, это общаться от одного процесса к другому, когда я нажимаю o
ключ
Сообщение об ошибке, которое я получаю от (KR o C) компилятора:
Error at lift.occ:11
Program failed, state = e, eflags = 00000000
какой light.on = 1
линия.
Насколько я вижу, light
PROC
будет ждать некоторого ввода на его light.change
channel
и затем назначит его light.on
variable
, Затем программа перейдет к условному утверждению IF
, где light.on = 1
линия должна в этом случае оценить true
, Но вместо этого я получаю эту ошибку.
Я пытался использовать -verbose
флаг, но компилятор говорит, что вы не можете использовать его для файлов.occ.
Кто-нибудь знает, как или если я могу получить более подробную информацию от компилятора?
Любая помощь по этому вопросу будет принята с благодарностью.
Спасибо
1 ответ
Приведенный выше код компилируется для меня, и когда запуск достигает тупика
james:conc$ occbuild --program light.occ
james:conc$ light
KRoC: deadlock: no valid processes found in workspace(s)
KRoC: program deadlocked (no processes to run)
Я также могу заставить его работать в подробном режиме, как показано ниже
occbuild -v --program light.occ
На другой ноте вы можете изменить свою структуру. Попробуйте три ПРОЦЕССА
PROC is.light.on(CHAN BYTE screen! , CHAN INT light.control)
WHILE TRUE
...output to terminal if light is on or off
PROC light.switch(CHAN BYTE keyboard? , CHAN INT light.control)
WHILE TRUE
...use the keyboard to turn light on and off
PROC light(CHAN BYTE keyboard? , screen!)
CHAN INT light.control:--0 for light on;1 for light off
PAR
light.switch(keyboard? , light.control!)
is.light.on(screen! , light.control?)