Ada条目和when语句的用法

Ada条目和when语句的用法,ada,Ada,我是Ada编程语言的新手,我正在进行并发编程,但我在一个实现上遇到了问题。这可能是一个非常愚蠢的问题。代码是: 类型状态为布尔型数组(1..6)--每个轨迹的布尔值 跟踪可用:状态:=(其他=>真)--如果轨道可用,则为true 受保护的跟踪处理器是 进入轨道要求(n:轨道部分类型)--n是音轨号 进入轨道相关(n:轨道部分类型)--n是音轨号 末端轨道装卸机; 受保护的身体轨迹\u处理程序是 --实现条目 当磁道可用(n)时,输入磁道请求(n:在磁道部分类型中)——此处发生错误 开始 请求(n

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

类型状态为布尔型数组(1..6)--每个轨迹的布尔值
跟踪可用:状态:=(其他=>真)--如果轨道可用,则为true
受保护的跟踪处理器是
进入轨道要求(n:轨道部分类型)--n是音轨号
进入轨道相关(n:轨道部分类型)--n是音轨号
末端轨道装卸机;
受保护的身体轨迹\u处理程序是
--实现条目
当磁道可用(n)时,输入磁道请求(n:在磁道部分类型中)——此处发生错误
开始
请求(n);
端轨要求;
当轨道可用(n)时,输入轨道rel(n:轨道零件类型中)
开始
rel(n);
末端轨道_rel;
末端轨道装卸机;
程序要求(编号:轨道零件类型)为
开始
--无效;
轨道可用(nr):=假;
结束请求;
程序rel(编号:轨道零件类型)为
开始
--无效;
可用轨道(nr):=真;
结束rel;
在这里,我得到一个编译错误“when track_available(n)”语句,表示“n未定义”。我认为变量n超出了范围,但我还需要检查数组的第n个索引是否为真。我怎样才能克服这个问题


谢谢。

在下面的代码中,您正在尝试使用可用的轨迹(n),但尚未完全由(n:轨迹中的零件类型)定义

另见


NWS

您不能在其自身的保护中实际使用条目的参数。我想你有那么多

根据防护装置的工作方式,在等待开始之前对所有防护装置进行评估,并且只有当时处于活动状态的防护装置可用。他们不会定期重新评估或动态阅读或其他任何东西

这意味着,除非编写代码,以便只有受保护对象中的其他条目修改保护,否则很难正确设置保护的逻辑。如果您想使用来自受保护对象外部的一些数据来控制其行为,那么可能需要使用防护以外的一些机制来实现。比如检查一下入口和出口,或者什么的

不过,您尝试做的事情有一种可能性:。您应该能够在保护中使用条目族索引

规范将更改为:

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;

好问题,顺便说一句!几年前,有人问我一个问题,把我追回科恩的《Ada》作为第二语言《实时系统》@Chalmers?:D@Andr埃拉兹洛:是的,我没有时间写示例代码。所以我把它贴了出来:)这里有一个关于入门家庭的参考资料,在这本书中:Burns,a.,Wellings,a.(2009)。实时系统和编程语言。英国埃塞克斯郡哈洛第四版:皮尔逊教育有限公司。谢谢你的回答。据我所知,上述代码贯穿所有轨道,如果有一条或多条轨道可用,则会对该特定轨道编号发出请求[req(n)/rel(n)]。这是正确的吗?@Ahmet Keskin——可以这样想:“我对
track\u part\u type
的每个值都有一个这样的条目,但这次只有
track\u aviable()
为真的条目可用。”实际上,这是一个非常好的提示。但这并不是我想要做的。假设有另一个任务随机请求不同的曲目编号。在您的实现中,条目将请求每个可用的曲目编号,而任务只希望请求一个特定的曲目编号。我想条目族就是我要寻找的。@Ahmet Keskin-我想我们两个中的一个很困惑。条目不是一个活跃的东西。它们只是受保护对象的“入口点”。除非其他代码尝试调用它们,否则它们不会执行任何操作。因此,上面没有提出任何请求,只是提供给其他人。是的,我知道。我的意思是当条目被其他代码调用时,条目调用req()或rel()过程。我只是意识到我在上面的评论中没有说清楚。
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;