我是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个索引是真还是假。我怎样才能克服这个问题?
谢谢。
答案 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