Ada条目和语句使用时间

Ahm*_*kin 8 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;
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

T.E*_*.D. 7

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

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

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

不过,您尝试做的事情有一种可能性:入境家庭.您应该能够在警卫中使用入口家庭索引.

规范将改为:

entry track_req(track_part_type); 
entry track_rel(track_part_type); 
Run Code Online (Sandbox Code Playgroud)

身体会改变

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;
Run Code Online (Sandbox Code Playgroud)