2016-05-07 4 views
1

Ich muss ein Programm erstellen, das eine aktive Wartezeit von 1000 Millisekunden hat und dann eine Variable während dieser Zeit innerhalb einer While-Schleife inkrementiert. Und dann muss diese Variable in jedem Zyklus auf 0 initialisiert werden.Inkrementiere alle 1000 Millisekunden mit Ada.Real_Time

Kann mir jemand einen Hinweis geben, wie das geht? Ich habe diesen Code, aber es funktioniert überhaupt nicht, nur Übersetzungsfehler.

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

Ada, Ada, Ada, Ada - ich müde von Menschen nicht wissen, wie Namen zu schreiben. Du hättest die Fehler, die du bekommst, haben lassen können - würde dir viel einfacher und schneller helfen. – darkestkhan

+1

Normalerweise ist es am besten zu sagen, was die Fehlermeldung eigentlich ist, anstatt zu erwarten, dass wir Ihren Code herunterladen, eine Paketspezifikation schreiben und den Compiler selbst ausführen. –

+0

Was bedeutet "Und dann muss diese Variable in jedem Zyklus auf 0 initialisiert werden." Bedeuten? –

Antwort

-1

Hier schrieb ich einen Beispielcode für Sie: http://www.filedropper.com/ada-periodic. Sie können diese also in Unix-Terminal kompilieren von * gnatmake .adb und betrieben von ./main

Es gibt drei Dateien: main.adb, periodic.ads und periodic.adb In main.adb Es gibt eine Prozedur, die das Programm startet. Diese Prozedur hat eine Endlosschleife. Und diese Datei enthält periodisches Paket (von mit Periodic in Code)

In periodic.ads gibt es Erklärung Paket. Es gibt nur eine Aufgabe in diesem Paket, die automatisch mit Haupt Prozedur gestartet wird.

In periodic.adb gibt es eine Definition von Paket. Es gibt eine Aufgabendefinition, die eine Endlosschleife mit Verzögerung bis Struktur enthält. Sie müssen die aktuelle Uhrzeit abrufen und sie um die gewünschte Zeit erhöhen. Dank dieser Operation warten Sie die Zeit, machen Sie etwas und stellen Sie das nächste Mal auf warten.

2

mit einem (OK, offensichtlich) Paket spec geschrieben, mit -gnatfl Kompilieren gibt

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; 

Der Fehler in Zeile 16 ist, dass Put_Line ein String erwartet; Ada führt keine Conversions im laufenden Betrieb durch. Sie könnten eine Zeichenfolgendarstellung erzeugen, indem Sie Natural’Image (Waitvar) sagen, was Standard-Ada ist, oder die GNAT-Erweiterung Waitvar’Img.

Der Fehler in Zeile 14 ist einfach zu beheben.

Der Fehler in Zeile 8 erklärt, was es will, aber um es zu beheben erfordert eine weitere Änderung. Ich glaube, Sie sollten

  1. initialisieren mit Ada.Real_Time.Clock
  2. Swap-Linien 13 und 14