如何通过区分ada的持续时间?

如何通过区分ada的持续时间?,ada,duration,Ada,Duration,我在和艾达玩,想抓住它。不过,我仍然很难弄清楚区别部分。我有一个带有一个判别式的任务,我试图给它传递一个持续时间。但它告诉我: 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; wi

我在和艾达玩,想抓住它。不过,我仍然很难弄清楚区别部分。我有一个带有一个判别式的任务,我试图给它传递一个持续时间。但它告诉我:

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
它给了我以下警告:

应为指定类型为“标准持续时间”的访问类型

发现型通用实数

我知道还有其他方法可以实现构造函数,比如创建入口点。但我想知道我做错了什么,并理解我所犯的错误。 到目前为止,我在谷歌上所做的工作并没有真正说明这一点,只是使用了看起来很好的真实类型。例如:

在您尝试的解决方案中,您试图为访问分配持续时间。如果这样做,正确的任务是:

task type WatchDog (Dur : access Duration := new Duration'(1.0)) is
代价是永远不会释放分配,也就是说,内存泄漏很小。如果在长期运行的程序中创建/销毁任务类型的多个实例,这可能是一个问题,但在这种情况下,您还必须注意获取任务(至少在Gnat中)


在本例中,我要么有第一个条目将持续时间值传递给任务,要么有一个以毫秒为单位的值(或任何合适的值),使用Natural作为判别式,并在任务内部对其进行转换。当然,这是语言中的一个难点。

我不确定这是否是歧视的预期用途。在这里,
duration
实际上是实例的配置,但不会影响内存中类型的布局。因此,我认为最好(当然也更常见)有一个
Configure
条目,可以调用该条目进行初始设置,或者如果在创建实例时确实需要提供该条目,您可以尝试使用一个正式的
Duration
参数创建一个
generic

无法将
1.0
分配给
dur
(访问判别符)的原因是
dur
是指针类型(匿名,访问
Duration
),而
1.0
是数字文本。简而言之,您不能为指针变量指定实数,只能为指针变量指定指针值。看看有没有一种方法可以得到一个

持续时间类型不是离散类型,即既不是整数类型,也不是枚举类型。但是,如果不是访问类型,则离散是鉴别器必须具备的条件,因为鉴别器的原始意图如所述

因此,要通过传递
dur
的值来初始化任务对象的某些方面,需要指针。下面的小重写不使用分配器(new),它使用名称作为持续时间值,然后使用
'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;
请注意将访问值指向可变持续时间而不是此处所示的恒定持续时间的含义

或者,执行一个计算,从某个整数判别式(例如,名为
dur\u in_msec
)生成
持续时间

task body Whatchdog is
   dur : constant Duration := Duration(Float(dur_in_msec) / 1_000.0);

感谢您提供的深入示例和解释!我知道创建一个入口点是更好的方法,但我正在尝试理解区别功能:)