Ada条目和语句使用时间

时间:2011-01-31 13:26:25

标签: ada

我是Ada编程语言的新手,我正在进行并发编程,但我遇到了一个实现的问题。这可能是一个非常虚拟的问题。代码是:

type status is array(1..6) of boolean; --boolean values for each track
track_available :status:=(others=>true); --true if track is available
protected track_handler is

entry track_req(n:in track_part_type); --n is track number
entry track_rel(n:in track_part_type); --n is track number

end track_handler;


protected body track_handler is
--implement entries
entry track_req(n: in track_part_type) when track_available(n) is --here where the error occurs
    begin
        req(n);
    end track_req;

entry track_rel(n: in track_part_type) when track_available(n) is
    begin
        rel(n);
    end track_rel;
end track_handler;

    procedure req(nr : track_part_type) is
    begin
        --null;
        track_available(nr):=false;
    end req;

    procedure rel(nr : track_part_type) is
    begin
        --null;
        track_available(nr):=true;
    end rel;

这里我收到“当track_available(n)”语句说“n未定义”时的编译错误。我认为变量n超出范围,但我还需要检查数组的第n个索引是真还是假。我怎样才能克服这个问题?

谢谢。

2 个答案:

答案 0 :(得分:7)

您无法在自己的后卫中实际使用条目参数。你收到了那么多,我收集。

守卫的工作方式,所有这些都在等待开始之前进行评估,只有当时处于活动状态的 才可用。它们不会定期重新评估或动态阅读或其他任何内容。

这意味着很难为你的警卫提供正确的逻辑,除非你编写代码,以便只有受保护对象中的其他条目才能修改警卫。如果要使用受保护对象外部的某些数据来控制其行为,则可能需要使用除守卫之外的某些机制来执行此操作。就像在入口和出口内立即检查一样。

您尝试做的事情有一种可能性:Entry families。您应该能够在警卫中使用入口家庭索引。

规范将改为:

entry track_req(track_part_type); 
entry track_rel(track_part_type); 

身体会改变为

entry track_req(for n in track_part_type) when track_available(n) is 
    begin
        req(n);
    end track_req;

entry track_rel(for n in track_part_type) when track_available(n) is
    begin
        rel(n);
    end track_rel;
end track_handler;

答案 1 :(得分:1)

在下面的代码中,您尝试使用track_available(n),然后由(n:在track_part_type中)完全定义。

entry track_req(n: in track_part_type) when track_available(n) is 

另见http://en.wikibooks.org/wiki/Ada_Programming/Tasking#Protected_types

NWS