info-mindstorms

nxc tutorial



inleiding
het eerste programma
commentaar
constanten
repeat
variabelen
while
if-else
random
sensoren
nxt display
nxt knoppen
sub taken
meedere taken

sub taken


met een sub taak kun je een stukje van een programma meerdere keren gebruiken. sub taken kunnen we op 3 manieren maken.


we laten het autotje een rondje rijden.

sub

sub vooruit()
{
OnFwd(OUT_BC,100);
Wait(1500);
}
sub links()
{
OnFwd(OUT_C,100);
OnRev(OUT_B,100);
Wait(1500);
}
sub rechts()
{
OnFwd(OUT_B,100);
OnRev(OUT_C,100);
Wait(1500);
}
task main()
{
vooruit();
links();
vooruit();
rechts();
rechts();
vooruit();
links();
vooruit();
}

een sub zet je altijd onder de task neer deze geef je een naam en eigenlijk heb je een eigen commando gemaakt, let op: vanuit een sub mag je geen andere sub gebruiken.


een sub zet je altijd onder de task neer deze geef je een naam en eigenlijk heb je een eigen commando gemaakt, vergeet niet de haakjes neer te zetten.


we gaan nu gebruik maken van parameters, hiermee kan je waardes meegeven aan de sub.


sub vooruit(int snelheid, int wacht_tijd)
{
OnFwd(OUT_BC,snelheid);
Wait(wacht_tijd);
}
sub links(int snelheid, int wacht_tijd)
{
OnFwd(OUT_C,snelheid);
OnRev(OUT_B,snelheid);
Wait(wacht_tijd);
}
sub rechts(int snelheid, int wacht_tijd)
{
OnFwd(OUT_B,snelheid);
OnRev(OUT_C,snelheid);
Wait(wacht_tijd);
}
task main()
{
vooruit(100, 1500);
links(100, 1500);
vooruit(100, 1500);
rechts(100, 1500);
rechts(100, 1500);
vooruit(100, 1500);
links(100, 1500);
vooruit(100, 1500);
}

een parrometer maken we door de waarde een naam te geven, daarna voeren we in wat de naam in tussen de haakjes met int ervoor, dan zetten we de getallen neer in het commando tussen de haakjes gescheiden door comma"s in de juiste volgorde.


alleen heeft een sub een probleem: hij functioneerd niet goed in verschillende taken, daarvoor is een hele simpele oplossing, we vervangen het woord sub door inline void.

inline void vooruit(int snelheid, int wacht_tijd)
{
OnFwd(OUT_BC,snelheid);
Wait(wacht_tijd);
}
inline void links(int snelheid, int wacht_tijd)
{
OnFwd(OUT_C,snelheid);
OnRev(OUT_B,snelheid);
Wait(wacht_tijd);
}
inline void rechts(int snelheid, int wacht_tijd)
{
OnFwd(OUT_B,snelheid);
OnRev(OUT_C,snelheid);
Wait(wacht_tijd);
}
task main()
{
vooruit(100, 1500);
links(100, 1500);
vooruit(100, 1500);
rechts(100, 1500);
rechts(100, 1500);
vooruit(100, 1500);
links(100, 1500);
vooruit(100, 1500);
}

nu gaan we de 3e manier probeeren: de macro. hij lijkt erg veel op een constante.

#define vooruit \
OnFwd(OUT_BC,100);Wait(1500);
#define links \
OnFwd(OUT_C,100);OnRev(OUT_B,100);Wait(1500);
#define rechts \
OnFwd(OUT_B,100);OnRev(OUT_C,100);Wait(1500);


task main()
{
vooruit;
links;
vooruit;
rechts;
rechts;
vooruit;
links;
vooruit;
}

een macro maak je zo: eerst #define en dan de naam, dan een spatie en een backslash, een enter en heel het programmatje op de zelfde regel, let op in het programma hoeven geen haaakjes neer gezet te woorden.


in een macro kunnen ook parrometers.

#define vooruit(snelheid, wacht_tijd) \
OnFwd(OUT_BC,snelheid);Wait(wacht_tijd);
#define links(snelheid, wacht_tijd) \
OnFwd(OUT_C,snelheid);OnRev(OUT_B,snelheid);Wait(wacht_tijd);
#define rechts(snelheid, wacht_tijd) \
OnFwd(OUT_B,snelheid);OnRev(OUT_C,snelheid);Wait(wacht_tijd);


task main()
{
vooruit(100, 1500);
links(100, 1500);
vooruit(100, 1500);
rechts(100, 1500);
rechts(100, 1500);
vooruit(100, 1500);
links(100, 1500);
vooruit(100, 1500);
}