如何通过判别式ada的持续时间?

时间:2016-09-07 10:31:02

标签: ada access duration

我正在和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

3 个答案:

答案 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