Scope

De plaats binnen het programma waar de variabele gedefinieerd wordt is zeer belangrijk. Deze bepaalt immers de scope of het bereik van de variabele. De scope is de plaats binnen het programma waar de variabele bestaat.

Een variabele bestaat alleen binnen het codeblok waarin hij gedefinieerd werd. We kunnen dit visualiseren door gebruik te maken van het boxmodel.

Het programma vormt de hoofdbox. Binnen dit programma staan twee functies, setup() en loop(). Elk van deze functies vormen een subbox binnen het programma. Binnen deze functies kunnen weer andere functies gedefinieerd zijn, die dan weer een subbox van de subbox zijn.

Zelfs een enkelvoudige instructie van een subbox zijn.

Een variabele die binnen een subbox gedefinieerd werd, bestaat alleen in deze subbox. In de omvattende box van deze subbox bestaat de variabele niet meer.

Bekijken we even onderstaand voorbeeldprogramma.

Een variabele van het type integer, met als naam segA krijgt de waarde 4 toegekend binnen de functie setup. Wanneer we deze variabele gebruiken in de loop-functie krijgen we een foutmelding “segA was not declared in this scope”, mat andere woorden, binnen de loop-functie bestaat er geen variabele met als naam segA.

scope voorbeeld 1

Dit zorgt voor rare toestanden. In het volgend voorbeeldprogramma hebben we opnieuw een variabele segA gedefinieerd in de setup-functie en er de waarde 5 aan toegekend.
In de loop-functie definieren we segA opnieuw, maar deze keer geven we de 4 aan de variabele.

scope voorbeeld 2


Hoewel beide variabelen dezelfde naam hebben, gaat het toch om twee verschillende variabelen. Binnen de functie setup bestaat een variabele segA die de waarde 5 bevat, en binnen de loop-functie bestaat een tweede variabele met de naam segA met een waarde 4.
Als we heel exact willen zijn moeten we ook vermelden dat deze twee variabelen nooit tegelijkertijd zullen bestaan. De eerste segA zal bestaan zolang de setup-functie wordt uitgevoerd. Eenmaal de functie doorlopen is, wordt de eerste segA vernietigd. Bij het starten van de loop-functie wordt een nieuwe variabele aangemaakt met als naam segA.

scope voorbeeld 3


 

En het kan nog erger. In dit voorbeeld wordt een variabele segA gedefinieerd buiten de beide functies. Deze variabele behoort dus tot de hoofdbox, en zal ook bestaan binnen beide functies.
In de setup functie is er geen probleem. segA bestaat en heeft de waarde 5 zoals gedefinieerd in de hoofdbox.
Binnen de loop functie wordt een variabele met dezelfde naam gedefinieerd. Binnen loop zijn er nu dus twee variabelen met naam segA, de hoofd-segA en de sub-segA. In zo’n geval heeft de subvariabele (ook locale variabele genoemd) voorrang op de hoofdvariabele. Wanneer we segA gebruiken binnen de loop functie zal deze dus de waarde 4 hebben. Merk op dat de hoofdvariabele ook blijft bestaan en dat deze de waarde 5 houdt.

scope voorbeeld 4

 

Oefeningen

Wanneer we dit programma willen compileren krijgen we een foutmelding. Kun je voorspellen waar die foutmelding zal optreden?

Oplossing

Binnen de setup functie wordt een variabele i gebruikt in de for-lus. Deze wordt netjes als integer gedefinieerd.
Binnen de loop vinden we twee for-lussen terug. In de eerste wordt opnieuw netjes een integer i gedefinieerd. Deze i bestaat dus enkel binnen de for-lus.
Bij de tweede for-lus gaat het verkeerd. Daar wordt een variabele i gebruikt die niet voordien werd gedefinieerd. Daar zal dus een “i was not declared in this scope” fout optreden.