2011-01-11 82 views
0

我真的花了很多时间在这个问题上工作,并使用Google搜索寻找解决方案,但我似乎无法找到问题所在。真的不明白为什么我的程序不能正常工作

我学习如何编写奥卡姆并具有以下程序:

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 ö C)编译得到的错误信息是:

Error at lift.occ:11 
Program failed, state = e, eflags = 00000000 

这是light.on = 1线。

据我所看到的,lightPROC会等待一些输入其light.changechannel,并随后将其分配给它的light.onvariable。该程序然后将进行条件语句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的

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?) 
+0

谢谢你的回答。我很感激。我将不得不等到明天再试一试。 – Joe 2011-01-11 21:41:56