La differenza di base è di portata.
Nel primo caso, stai dichiarando una variabile globale. È una variabile accessibile in ogni ambito dopo la sua definizione.
void setup()
{
Serial.begin(9600);
}
void inc();
int count = 0;
void loop()
{
Serial.println(count);
count++;
inc();
delay(500);
}
void inc() //Can edit the value of count
{
count=count+1;
};
Nel secondo caso, stai dichiarando una variabile statica con ambito locale. La variabile persisterà per l'intero programma eseguito in modo simile alle variabili globali, ma sarà accessibile solo nel blocco di codice in cui è dichiarata. Questo è lo stesso esempio, con una sola modifica. count
è ora dichiarato come variabile statica all'interno loop
.
void inc();
void loop()
{
static int count = 0;
Serial.println(count);
count++;
inc();
delay(500);
}
Questo non verrà compilato in quanto la funzione inc()
non ha accesso count
.
Le variabili globali, per quanto apparentemente utili, presentano alcune insidie. Questi possono persino causare danni quando si tratta di scrivere programmi che possono interagire con l'ambiente fisico. Questo è un esempio molto semplice di qualcosa che è molto probabile che accada, non appena i programmi iniziano a diventare più grandi. Una funzione può inavvertitamente modificare lo stato di una variabile globale.
void setup()
{
Serial.begin(9600);
}
void another_function();
int state=0;
void loop()
{
//Keep toggling the state
Serial.println(state);
delay(250);
state=state?0:1;
//Some unrelated function call
another_function();
}
void another_function()
{
//Inadvertently changes state
state=1;
}
È molto difficile eseguire il debug di questi casi. Questo tipo di problema, tuttavia, può essere facilmente rilevato semplicemente usando una variabile statica.
void setup()
{
Serial.begin(9600);
}
void another_function();
void loop()
{
static int state=0;
//Keep toggling the state
Serial.println(state);
delay(250);
state=state?0:1;
//Some unrelated function call
another_function();
}
void another_function()
{
//Results in a compile time error. Saves time.
state=1;
}