0

我真的花了很多时间来解决这个问题并四处搜索以找到解决方案,但我似乎无法找到问题所在。

我正在学习如何编写 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 PROClight.change channellight.on variableIFlight.on = 1true

我曾尝试使用该-verbose标志,但编译器说您不能将其用于 .occ 文件。

有谁知道我如何或是否可以从编译器获得更详细的信息?

对此的任何帮助将不胜感激。

谢谢

4

1 回答 1

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?)
于 2011-01-11T14:46:45.827 回答