我真的花了很多时间在这个问题上工作并四处寻找解决方案,但我似乎无法找到错误。
我正在学习如何编码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文件。
有谁知道如何从编译器获取更详细的信息?
对此的任何帮助将不胜感激。
由于
答案 0 :(得分: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
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?)