2013-05-05 9 views
9

Ich komme aus C/C++ auf eingebetteten Systemen und die ganze Zeit innerhalb einer Funktion verwenden wir eine statische Variable, so dass der Wert während der gesamten Anrufe beibehalten wird.Ada-Äquivalent der lokalen statischen Variable von C/C++

In Ada scheint dies nur mit dem Äquivalent von statischen Variablen auf Dateiebene zu geschehen. Gibt es ein Ada-Äquivalent?

C++:

function Get_HW_Counter() { 
    static int count = 0; 
    return ++count; 
} 

Ada: ??

Antwort

10

Variablen auf Package-Ebene.

Beachten Sie, dass Pakete nicht unbedingt auf Dateiebene sind; Sie können sogar ein Paket lokal für ein Unterprogramm erstellen und verwenden, wenn Sie möchten. Eine Verwendung eines Pakets besteht darin, ein Objekt und alle darauf wirkenden Methoden zu erzeugen (Singleton-Muster); alle Details des Objekts privat halten.

Wenn mein Verständnis von C++ nicht zu rostig ist, ein enger Äquivalent wäre:

package HW_Counter is 
    function Get_Next; 
private 
    count : natural := 0; -- one way of initialising 
    -- or integer, allowing -ve counts for compatibility with C++ 
end HW_Counter; 

und das ist das ganze Paket des Kunden sehen muss.

package body HW_Counter is 

    function Get_Next return natural is 
    begin 
     count := count + 1; 
     return count; 
    end Get_Next; 

begin -- alternative package initialisation part 
    count := 0; 
end HW_Counter; 

Und Nutzung typischerweise

C := HW_Counter.get_next; 
+0

würden Sie ein Paket lokal zu einem Unterprogramm erstellen können, aber es wird auf jeden Eintrag erarbeitet bekommen (so werden alle Variablen neu initialisiert werden). –

+0

Eigentlich, wenn ich die Frage erneut lese, denke ich, dass dies genau das Äquivalent zu statischen Variablen auf Dateiebene ist. Also nein, ich glaube nicht, dass es ein Ada-Äquivalent des C gibt. Aber es ist nicht schwer, den gleichen Effekt zu erzielen, wenn auch ein bisschen lästiger. –

+0

In Ada 2012 brauchen Sie nicht einmal einen package-body, Sie könnten eine expression-Funktion im privaten Bereich verwenden, um den Accessor zu implementieren. – Shark8

Verwandte Themen