Go Down

Topic: Hoe en wanneer de Brackets geberuiken { & } (Read 3057 times) previous topic - next topic

Hallo,



Ik zit toch nog steeds in conflict hoe de brackets te gebruiken  ( {  en }  )

Wie kan mij dit nu eens duidelijk maken  ,
wanneer ik de ene keer de bracket {  zo toe pas en de andere keer de bracket } zo toe pas

Als ik het volgende voorbeeld ook laat zien zie je de brackets ook weer anders staan ???

Code: [Select]

#include <Servo.h>

//Define Pins
int servoPin = 9;

//Create Servo Object
Servo myServo;

void setup()
{
//Attaches the Servo to our object
 myServo.attach(servoPin);
}

void loop()
{
//We can Turn a Servo to 180 degrees
 for (int i = 0; i <=180; i=i+20)
 {                                              [font=Verdana]<<<<<< ik dacht dat deze er niet tussen hoefde ?? [/font]
   myServo.write(i);
   delay(1000);
 }                                              [font=Verdana]<<<<<<< En dat ik deze weer de andere kant op moest zetten[/font]
 for (int i = 180; i >=1; i=i-20)
 {
  myServo.write(i);
   delay(1000);
 }  
}



Ik hoor graag eens een duidelijk antwoord hierover.

Gr, Pat.
Patrick ,The Netherlands

MAS3

#1
Sep 06, 2014, 09:30 pm Last Edit: Sep 06, 2014, 09:37 pm by MAS3 Reason: 1
Hoi.

Lees { als "sectie openen" en } als "sectie sluiten".
Zo'n sectie is een stukje code dat je als geheel laat afhandelen.
Dat houdt dus in dat je altijd een sectie moet openen en sluiten.
Als je dat niet doet krijg je ook een foutmelding van de IDE.
Wanneer je dus twee keer een { ziet staan, dan heb je dus een sectie binnen een sectie.
Om het overzicht te kunnen houden van die secties, is het gebruikelijk om elke { op een eigen regel te zetten, en extra in te springen gedurende die sectie.
In jouw code zie je dat ook gebeuren.

Verder zie je in jouw code dat wat ik eerder sectie noemde, iets is dat onder voorwaarden word uitgevoerd.
Dus zolang de voorwaarde geldig is, word datgene gedaan dat tussen de {} staat.
En dat komt omdat dat stukje uit meerder regels bestaat, de IDE(of eigenlijk de compiler) kan niet weten hoe groot een blok code zou zijn als je dat niet op een of andere manier kan aangeven, en dit is dus de manier om dat te doen.
Wanneer dat niet uit meerdere regels zou bestaan, zou je ook de {} kunnen weglaten.
Die voorwaarden zijn dat de servo aansturing op moet lopen )met 20 graden per stap), en het eindpunt nog niet bereikt is, en de volgende voorwaarde is dus dat ie weer af moet lopen.

De IDE helpt je ook hiermee.
Als je direct rechts van een { of } gaat staan, zie je de } of { die daarbij hoort in de code zoals je die tot dan toe hebt, doordat er een dun blauw kadertje omheen komt te staan.

Verder zie je ook dat de bbc codes van het forum niet werken binnen het [code] [/code] blok ;).

Ik hoop dat dit antwoord voldoende duidelijk is.
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

nicoverduin

Zoals MAS al aangaf, het is niet meer dan een indicator van een aantal instructies die achter elkaar uitgevoerd worden  en dus bij elkaar horen.  Verder geldt dat voor elke bracket "open" er ook een bracket "close" moet zijn.

De wijze van notatie kan verschillend zijn. Er zijn door de jaren heen verschillende manieren bedacht (K&R, Hungarian en anderen). De voorkeuren zijn voor een ieder voor zichzelf te bepalen. Zelf werk ik altijd met K&R. Wat dat allemaal inhoudt? probeer eens Google.

Maar als je bijvoorbeeld een if statement hebt, dan wil je dat er een bepaald aantal instructies uitgevoerd worden. Om aan te geven welke dat zijn zet je ze direct na de "if" tussen brackets. Dus in een wat simpeler voorbeeld:

Code: [Select]

ALS het regent DAN {
  dan trek ik mijn regen jas aan
} ANDERS {
  ALS de zon schijnt DAN {
      trek ik  mijn zwembroek aan
   }
}

idem bij  een "for".

Maar als je een functie schrijft moet die ook een begin en eind kennen. Wederom tussen brackets.

Wat ook van belang is, is te realiseren dat variabelen die tussen de brackets ook alleen maar bestaan binnen die brackets. Met andere woorden als de functie op dat moment niet uitgevoerd wordt, dan bestaan de daarin benoemde variabelen ook niet. Dat noemen ze de  "local" scope. Variabelen die boven in jouw programma benoemd worden, krijgen een zogenaamde "global" scope en zijn overal binnen het programma te benaderen.

Met vriendelijke groet / kindest regards
Nico Verduin
www.verelec.nl
Do not PM me for personal consultancy unless you are willing to pay for it.

Hallo MAS & Nico,

Dank voor beide uitleg , maar toch nog even een kleine vraag , waarom wordt dan de volgende regel niet appart tussen de brackets geplaatst ??

Code: [Select]
for (int i = 0; i <=180; i=i+20)


Ik zie dat er aan het begin een { en aan het eind van de gehele sketch } wordt afgesloten,
En tussen in wordt alleen dan weer de regel :

Code: [Select]
{
myServo.write(i);
    delay(1000);
}


met brackets geplaatst ?

Waarom dan deze regel dan weer niet tussen "apparte " brackets ?

Code: [Select]
for (int i = 180; i >=1; i=i-20)

Hier raak ik de weg in kwijt namelijk.

Alvast bedankt !!

Pat.
Patrick ,The Netherlands

MAS3

OK, dat betekent dus dat de uitleg toch niet was aangekomen.


Die regel die je aangeeft, is onderdeel van void loop(), das de hoofd lus van je sketch.
Die hoofd lus heeft dus een begin == { en een eind ==}.
Die had je al gezien.
Binnen die twee {} staat dus jouw for loop.
Das weer een lus, en in die lus ga je optellen met 20 tegelijk.
Wat je met dat opgetelde getal gaat doen, dat is wat er tussen diens {} staat, en das dus het aansturen van de servo, en vervolgens een seconde wachten.

Daarna ga je bijna hetzelfde doen, maar dan met aftellen met 20 tegelijk.
Ook dan heb je dus weer een setje {} nodig.

Wat je hier dus doet is een hoofd lus, die bestaat uit 2 andere lussen.
In de hoofd lus doe je het tellen, en tijdens het tellen doe je (tussen de {}) weer iets met de waarden die dat oplevert.



Als je verder niet afgeleid wil worden lees je onderstaande regel niet.
Maar die sketch is een extreem voorbeeld van blocking code en alleen nuttig voor de les die je ermee wil leren.

Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

nicoverduin

Omdat de taal zo gedefinieerd is door Kerningham & Richie. Waarom is de Nederlandse taal zoals deze is? logisch? nou ik dacht het niet. Vrijwel elke programmeertaal begint met het beschrijven van de syntax (structuur). Dus als je wilt weten waarom ze het toen (ergens begin 80'er jaren) het zo hebben gedefinieerd? Vraag het Kerningham zou ik zeggen (Richie is inmiddels overleden meen ik).
Met vriendelijke groet / kindest regards
Nico Verduin
www.verelec.nl
Do not PM me for personal consultancy unless you are willing to pay for it.

Beiden Hartelijk dank voor jullie uitleg,

@ Mas , De laatste uitleg is mij nu duidelijker geworden  :)
Ik had inderdaad de Void loop al in beeld , maar ik wist eigenlijk ook dat er in deze Void loop weer meerdere Loops tussen gezet kunnen worden , maar was iet duidelijk wanneer ik deze moest toepassen.

Ik begrijp hier nu uit dat wanneer je wat met het for command iets wil bereiken , je hier ook weer een loop van maakt waarin wordt aangegeven wat  de for moet gaan uitvoeren , zeg ik dat goed ???

Ook Nico , hartelijk dank voor jou input,
Ik ga mij er nog verder in verdiepen , zodat ik dan zelf "automatisch" het inzoich krijg om deze Brackets toe te passen


Groet,

Pat.

Patrick ,The Netherlands

nicoverduin

Wat dacht je van GOOGLE: "programmeertaal c"  eventueel met "inleiding" of "cursus"
Met vriendelijke groet / kindest regards
Nico Verduin
www.verelec.nl
Do not PM me for personal consultancy unless you are willing to pay for it.

Hallo Nico,


Ik heb inmiddels een link gevonden met duidelijke uitleg Programeren in C,

Groet,

Pat.
Patrick ,The Netherlands

Go Up