simpel declareren

algemene C code
Berichten: 76
Geregistreerd: 05 Nov 2016, 09:42

simpel declareren

Berichtdoor spaansebrabander » 12 Jan 2017, 21:25

Ik ben sinds kort bezig met zelfstandig programmeren. Nu kom ik iets vreemds tegen. Ik had gedacht dat je variabelen in void setup() moet declareren, bv int a=1; en dat deze a dan ook in de void loop bekend zou zijn. Dat is dus niet. Je moet blijkbaar int a=1; declareren vóór void setup()
Ik vraag dit omdat ik ergens in de theorie lees dat als je in void setup() const int a = 1; declareert, deze enkel geldig is in void setup() en niet in void loop(). Dat blijkt te kloppen, maar int a=1; gedeclareerd in void setup() ook niet/ Hoe zit dit?
Dat zou er eigenlijk op neerkomen dat men variabelen altijd moet declareren vóór void setup().

Advertisement

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: simpel declareren

Berichtdoor Koepel » 13 Jan 2017, 00:10

Hier heb ik al de term 'scope' laten vallen: http://arduinoforum.nl/viewtopic.php?f=8&t=2260#p16952.
De 'scope' is tot hoever die variabele zichtbaar is voor de compiler (of zo iets).

Boven de setup() staan de globale variabelen. Dat is dus eigenlijk iets speciaals, ze zijn overal bekend en te gebruiken.

Wanneer je een variabele declareert binnen een functie, dan is het een lokale variabele. De scope van die variabele is dan alleen binnen die functie. Je kunt die variabele niet ergens anders gebruiken.
Wanneer je een variabele declareert binnen een for-loop, dan is de scope alleen binnen die for-loop. Dus dan is het nog meer beperkt.

Wanneer je weet wat de compiler doet, dan is het best wel logisch. De globale variabelen krijgen een vaste plaats in het sram geheugen. Voor de locale variabelen wordt plaats gemaakt op de stack, en dat vervalt zodra de functie wordt verlaten.

Het gebruik van 'const' is een extraatje, dat mag je vergeten. Dan wordt de compiler verteld dat die waarde een constante is, en dat maakt het voor de compiler gemakkelijker. Het is ook veiliger, want als je later die variabele per ongeluk zou willen wijzigen dan zegt de compiler dat die variabele een constante is en dus niet kan wijzigen.

Berichten: 76
Geregistreerd: 05 Nov 2016, 09:42

Re: simpel declareren

Berichtdoor spaansebrabander » 13 Jan 2017, 13:56

Ja, ik ben er nu ook achter. Ik dacht dat je alles wat je nodig hebt in de set up declareert, maar er is een "vak" boven set up waar je zaken moet declareren die voor je hele programma van toepassing zijn. Hier wordt eigenlijk in cursussen weinig aandacht op gevestigd.
Bedankt

Berichten: 118
Geregistreerd: 28 Dec 2014, 23:20
Woonplaats: Bilzen BE

Re: simpel declareren

Berichtdoor Dries » 13 Jan 2017, 17:16

je kan ook met return werken, zo kan je bv een variabele gaan gebruien in de hele sketch

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: simpel declareren

Berichtdoor nicoverduin » 13 Jan 2017, 18:45

Het is eigenlijk een slechte vorm van programmeren om alle variabelen globaal te maken. De variabelen leggen beslag op het RAM geheugen gedurende de tijd dat het programma draait. Als een variabele lokaal (dus in een functie()) gemaakt wordt, verdwijnt deze gelijk weer na het beëindigen van de functie. Hierdoor ga je na denken en je zou het moeten nastreven om variabelen te maken waar je ze nodig hebt.
Zelfs in "if" of "loops" kunnen variabelen worden gedefinieerd. Bekend voorbeeld:
cpp code
for (uint8_t i = 0; i < 10; i++) {
}

i bestaat in bovenstaand voorbeeld alleen gedurende de for-loop. Wat mij betreft is het "globaal" alle variabelen declareren een vorm van "luiheid" en "gemakzucht" die je vanzelf een keer gaat opbreken als je door het RAM geheugen bent. En een slechte gewoonte afleren is moeilijker dan een goede gewoonte aanleren.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 45
Geregistreerd: 08 Jan 2020, 17:23

Re: simpel declareren

Berichtdoor RonalT » 12 Jan 2022, 21:23

Nog even een vraagje over 'globale' en 'lokale' variabelen.

Mijn molen-scetch, waarover ik al eerder in een ander topic schreef, is eigenlijk te groot voor een Arduino Uno. Ik krijg steeds deze melding:

cpp code
De schets gebruikt 11806 bytes (36%)  programma-opslagruimte. Maximum is 32256 bytes.
Globale variabelen gebruiken 1606 bytes (78%) van het dynamisch geheugen. Resteren 442 bytes voor lokale variabelen. Maximum is 2048 bytes.
Weinig geheugen beschikbaar, er kunnen zich stabiliteitsproblemen voordoen


Het probleem lijkt mij te zitten in: Globale variabelen gebruiken 1606 bytes (78%) van het dynamisch geheugen
Dit zijn alle globale variabelen:

cpp code
const int reedSchakTel = 2;                                                         // digital pin 2 reedswitch vooruit.
const int reedSchakReset = 4; // digital pin 4 reedswitch reset.
int buttonAState = 1; // status reedschakelaar teller.
int buttonAStateOld = 1; // vorige status reedschakelaar teller.
int buttonResetState = 1; // status reedschakelaar reset.
int buttonResetStateOld = 1; // vorige status reedschakelaar reset.
int buttonSureState = 0; // status 'zeker weten' reedschakelaar.
int buttonSureStateOld = 0; // vorige status 'zeker weten' reedschakelaar.
const int LED_red = 5; // rode LED.
const int LED_Forward = 6; // groene LED (telpuls).
const int LED_Still = 7; // blauwe LED (die stilstand meld).
long rotationTimeA; // tijdstip van de laatste telpuls.
long rotationTimeAOld; // tijdstip van de vorige telpuls.
unsigned long rotationStartToday = 0; // tijdstip van eerste omwenteling.
unsigned long RotationtimeMin = 0; // draaitijd in minuten.
float rotationSpeed; // tijd waarin het spoorwiel een omwenteling maakt.
float numberOfSails; // aantal enden (wieken) per minuut.
float maxNumberOfSails; // hoogste aantal enden per minuut deze dag.
const float bw = 71.0; // aantal kammen / staven bovenwiel van uw molen. Schrijf de waarde met .0 er achter.
const float sl = 37.0; // aantal kammen / staven schijfloop/wieg/bonkelaar van uw molen. Schrijf de waarde met .0 er achter.
const float conversion = 60.0/(15.0*(bw/sl)); // berekende tijd voor een omwenteling van het spoorwiel bij 60 enden per minuut.
unsigned long numberOfRevolutions; // aantal omwentelingen bovenas.
unsigned long numberOfRevToday; // aantal omwentelingen aan het begin van de dag.
unsigned long revolutionsSpurwheel = 1; // totaal aantal omwentelingen per jaar, van het spoorwiel.
unsigned long updateTime = millis(); // na deze tijd worden de gegevens naar het geheugen geschreven.
int jaartal = 2019; // variabele waarin het jaar vastgelegd wordt.
int opslagEEprom = 1; // variabele waarin het aantal malen dat er opgeslagen is wordt vastgelegd.
const int addresJaartal = 188; // adres in EEprom waar jaartal wordt gelezen en geschreven.
const int addresOmwenteling = 178; // adres in EEprom waar omwentelingen spoorwiel wordt gelezen en geschreven.
const int addresOpslag = 168; // adres waarin aantal malen dat er opgeslagen is wordt bewaard.



Nu snap ik niet welke globale variabele zo veel ruimte nodig hebben, want als ik alle 'int' 2 bytes, 'floats' 4 bytes bij elkaar tel kom ik aan ongeveer 100 bytes.
Maar ergens zit er iets verborgen voor mij want de scetch blijkt ruim 1600 bytes nodig te hebben.

Dit zou verkleind kunnen worden door globale - in lokale variabele te veranderen.... :roll:

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: simpel declareren

Berichtdoor shooter » 12 Jan 2022, 22:39

je kunt ze ook definieren in de software
#define pin_Led_red 5 dan staat dus overal waar je piledred gebruikt een 5 dat scheelt variabelen, dat kun je dus voor alle constanten doen zoals pinnummers en adressen.
en als je inderdaad ze in variabelen zet dan alles wat je boven setup en loop zet is global (er zijn nog andere manieren hoor, en alles wat je in een functie zet is locaal en kun je dus alleen maar in die functie gebruiken . setup en loop zijn ook gewoon functies.
loop is eigenlijk een do .. while (1).
wel ajb een nieuw onderwerp maken want deze is al 5 jaar oud.
paul deelen
shooter@home.nl

Berichten: 45
Geregistreerd: 08 Jan 2020, 17:23

Re: simpel declareren

Berichtdoor RonalT » 12 Jan 2022, 22:57

shooter schreef:...
wel ajb een nieuw onderwerp maken want deze is al 5 jaar oud.


Er is vast een moderator / beheerder die deze berichten van dit oude topic af kan splitsen....
De andere opmerking ga ik uitproberen.

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 6 gasten