我正在和ADA玩耍,试着抓住它。尽管如此,我仍然很难找出判别部分。我有一个判断任务,我试图通过一个持续时间。然而它告诉我:
package Procedures is
task type WhatchDog(dur : Duration := 1.0) is
entry Reset(start : in Time);
entry Sync(timedOut : out Boolean);
end WhatchDog;
end Procedures;
with Procedures;
procedure Main is
watch : Procedures.WhatchDog(dur => 0.5);
begin
null;
end Main;
判别者必须具有离散或访问类型。
当我将判别式类型更改为访问类型时,
task type WhatchDog(dur : access Duration := 1.0) is
它给了我以下警告:
预期具有指定类型"标准持续时间"
的访问类型找到类型通用真实
我知道还有其他方法可以实现构造函数,例如创建入口点。但我想知道我在这里做错了什么,并理解我所犯的错误。 到目前为止,我所做的谷歌工作并没有真正对此有所启发,只能使用似乎工作正常的真实类型。这里举例如下: http://www.adaic.org/resources/add_content/docs/95style/html/sec_6/6-1-3.html
答案 0 :(得分:3)
在您尝试的解决方法中,您尝试将持续时间分配给Access。如果采用这种方式,那么正确的任务就是:
task type WatchDog (Dur : access Duration := new Duration'(1.0)) is
以分配永不解除分配为代价,即一次轻微的内存泄漏。如果你在一个长期存在的程序中创建/销毁任务类型的许多实例,这可能是一个问题,但在这种情况下你还必须处理收获任务(至少在Gnat中)。
在这种情况下,我要么有第一个条目将持续时间值传递给任务,要么使用自然作为判别式以毫秒为单位(或任何适当的值),并在任务中转换它。当然,这是一种语言痒。
答案 1 :(得分:3)
我不确定这是判别法的用途。这里,duration
实际上是实例的配置,但不会影响内存中类型的布局。所以我认为有一个Configure
条目可以被调用来进行初始设置会更好(当然也更常见),或者如果真的需要在创建实例时给出,你可以试试使用正式generic
参数创建Duration
。
答案 2 :(得分:1)
您无法将1.0
分配给dur
(访问判别式)的原因是dur
是指针类型(匿名,访问Duration
)而{ {1}}是一个数字文字。简而言之,您不能为指针变量赋予实际值,只能将指针值赋给指针变量。有关获得一种方法的信息,请参阅Alex's answer。
类型1.0
不是离散类型,即既不是整数也不是枚举。但是,如果没有访问类型,则离散是必须的判别因为manuBriot概述的判别者的原始意图。
因此,要通过传递Duration
的值来初始化任务对象的某些方面,您需要指针。以下小重写不使用分配器( new ),它使用持续时间值的名称,然后使用dur
获取指针。
'Access
请注意将访问值指向可变持续时间的含义,而不是此处所示的常量持续时间。
或者,执行一个从某个整数判别式产生package Procedures is
Duration_By_Default : aliased constant Duration := 1.0;
task type Whatchdog
(dur : access constant Duration := Duration_By_Default'Access)
is
entry Reset(start : in Time);
entry Sync(timedOut : out Boolean);
end WhatchDog;
end Procedures;
with Procedures;
procedure Main is
Desired_Duration : aliased constant Duration := 0.5;
watch : Procedures.WhatchDog(dur => Desired_Duration'Access);
begin
null;
end Main;
值的计算,比如说Duration
。
dur_in_msec