使用Ada.Real_Time每1000毫秒递增一次变量

时间:2016-05-07 23:41:55

标签: ada

我必须创建一个有效等待1000毫秒的程序,然后在while循环中增加一个变量。然后,每个周期都必须将此变量初始化为0。

有人能给我一个如何做到的线索吗?我有这个代码,但它根本不起作用,只是编译错误。

with Ada.Text_IO; use Ada.Text_IO;
with Ada.Real_Time; use Ada.Real_Time;
package body waittime is
    task body periodictime is   

        use type Time;
        use type Time_Span;

        Poll_Time : Ada.Real_Time.Time := 5; -- time to start polling
        WaitVar : Natural := 0;
        WaitTime : constant Time_Span := Milliseconds (1000);
    begin
        loop
            delay until Poll_Time;
            Poll_Time = Poll_Time + WaitTime;
            WaitVar := WaitVar+1;
            Put_Line (WaitVar);
        end loop;
    end periodictime;
end waittime;

2 个答案:

答案 0 :(得分:2)

编写了一个(好的,明显的)软件包规范,用-gnatfl进行编译得到了

 1. with Ada.Text_IO; use Ada.Text_IO;
 2. with Ada.Real_Time; use Ada.Real_Time;
 3. package body waittime is
 4.     task body periodictime is
 5.         use type Time;
 6.         use type Time_Span;
 7.
 8.         Poll_Time : Ada.Real_Time.Time := 5; -- time to start polling
                                              |
    >>> expected private type "Ada.Real_Time.Time"
    >>> found type universal integer

 9.         WaitVar : Natural := 0;
10.         WaitTime : constant Time_Span := Milliseconds (1000);
11.     begin
12.         loop
13.             delay until Poll_Time;
14.             Poll_Time = Poll_Time + WaitTime;
                          |
    >>> "=" should be ":="

15.             WaitVar := WaitVar+1;
16.             Put_Line (WaitVar);
                1         3
    >>> no candidate interpretations match the actuals:
    >>> missing argument for parameter "Item" in call to "put_line" declared at a-textio.ads:259
    >>> expected type "Standard.String"
    >>> found type "Standard.Integer"
    >>>   ==> in call to "Put_Line" at a-textio.ads:263

17.         end loop;
18.     end periodictime;
19. end waittime;

第16行的错误是Put_Line期望String; Ada不会动态转换。您可以通过说Natural’Image (Waitvar)(标准Ada或GNAT扩展Waitvar’Img)来生成字符串表示。

第14行的错误很容易解决。

第8行的错误解释了它想要什么,但修复它需要另一个改变。我想你应该

  1. 使用Ada.Real_Time.Clock
  2. 初始化
  3. 交换第13和14行。

答案 1 :(得分:-1)

在这里,我为您编写了一些示例代码:http://www.filedropper.com/ada-periodic。您可以通过* gnatmake .adb 在unix终端中编译它,并通过 ./ main

运行

有三个文件:main.adb,periodic.ads和periodic.adb 在 main.adb 中有启动程序的程序。此过程具有无限循环。此文件包含定期包(在代码中使用 with Periodic

periodic.ads 中有包的声明。此packge中只有一个任务,即使用 main 过程自动启动。

periodic.adb 中有一个包的定义。有一个任务定义包含延迟的无限循环,直到结构。您必须获得当前时钟时间并按照您想要等待的时间段增加时间。由于这个操作,你等待一段时间,做一些事情,并设置下一次等待。