2013-05-05 16 views
9

Vengo da C/C++ su sistemi embedded e tutto il tempo all'interno di una funzione viene utilizzata una variabile statica in modo che il valore venga mantenuto per tutte le chiamate.Ada equivalente della variabile statica locale da C/C++

In Ada, sembra che questo viene fatto solo con l'equivalente di variabili statiche a livello di file. Esiste un equivalente Ada.

C++:

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

Ada: ??

risposta

10

Variabili a livello di pacchetto.

Si noti che i pacchetti non sono necessariamente a livello di file; puoi anche creare e utilizzare un pacchetto locale per un sottoprogramma, se lo desideri. Un uso di un pacchetto è creare un oggetto e tutti i metodi che agiscono su di esso (modello singleton); mantenendo tutti i dettagli dell'oggetto privato.

Se la mia comprensione del C++ non è troppo arrugginito, una stretta equivalente sarebbe:

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; 

e questo è tutto del cliente del pacchetto ha bisogno di vedere.

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; 

e l'uso sarebbe tipicamente

C := HW_Counter.get_next; 
+0

È possibile creare un pacchetto locale a un sottoprogramma, ma otterrà elaborato su ogni voce (in modo che qualsiasi variabili verranno reinizializzati). –

+0

In realtà, rileggendo la domanda, penso che siano esattamente l'equivalente delle variabili statiche a livello di file. Quindi no, non credo che ci sia un equivalente Ada della C. Ma non è difficile ottenere lo stesso effetto, se un po 'più faticoso. –

+0

In Ada 2012 non è nemmeno necessario un corpo del pacchetto, è possibile utilizzare una funzione di espressione nella sezione privata per implementare l'accessor. – Shark8