我是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个索引是真还是假.我怎样才能克服这个问题?
谢谢.
您实际上无法在自己的后卫中使用条目的参数.你收到了那么多,我收集.
警卫的工作方式,所有这些都在等待开始之前进行评估,只有当时处于活动状态的人才可用.它们不会定期重新评估或动态阅读或任何其他内容.
这意味着很难为你的警卫获得正确的逻辑,除非你编写代码以便只有受保护对象中的其他条目才能修改警卫.如果要使用受保护对象外部的某些数据来控制其行为,则可能需要使用除守卫之外的某些机制来执行此操作.就像在入口和出口内立即检查或其他东西.
不过,您尝试做的事情有一种可能性:入境家庭.您应该能够在警卫中使用入口家庭索引.
规范将改为:
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)