Het meest fundamentele verschil is het bereik.
In het eerste geval declareert u een globale variabele. Het is een variabele die na de definitie in elke scope toegankelijk is.
void setup () {Serial.begin (9600);} void inc (); int count = 0; void loop ( ) {Serial.println (aantal); tel ++; inc (); delay (500);} void inc () // Kan de waarde van count {count = count + 1;};
bewerken In het tweede geval declareert u een statische variabele met lokaal bereik. De variabele blijft gedurende de hele programma-run behouden, vergelijkbaar met globale variabelen, maar is alleen toegankelijk in het codeblok waarin het is gedeclareerd. Dit is hetzelfde voorbeeld, met slechts één wijziging. count
is nu gedeclareerd als een statische variabele binnen loop
.
void inc (); void loop () {static int count = 0 ; Serial.println (aantal); tel ++; inc (); delay (500);}
Dit zal niet compileren aangezien de functie inc ()
geen toegang heeft tot count
.
Globale variabelen, hoe nuttig ze ook lijken, hebben enkele valkuilen. Deze kunnen zelfs schade aanrichten als het gaat om het schrijven van programma's die kunnen interageren met de fysieke omgeving. Dit is een heel eenvoudig voorbeeld van iets dat zeer waarschijnlijk zal gebeuren zodra programma's groter worden. Een functie kan onbedoeld de status van een globale variabele wijzigen.
void setup () {Serial.begin (9600);} void another_function (); int state = 0; void loop () { // Blijf wisselen tussen de staat Serial.println (state); vertraging (250); state = state? 0: 1; // Sommige niet-gerelateerde functies roepen another_function ();} void another_function () {// Verandert onbedoeld state state = 1;}
Dergelijke gevallen zijn erg moeilijk te debuggen. Dit type probleem kan echter gemakkelijk worden gedetecteerd door simpelweg een statische variabele te gebruiken.
void setup () {Serial.begin (9600);} void another_function (); void loop () {statische int state = 0; // Blijf wisselen tussen de staat Serial.println (state);
vertraging (250); state = state? 0: 1; // Een niet-gerelateerde functie roept another_function ();} void another_function () {// Resulteert in een compilatietijdfout. Bespaart tijd. state = 1;}