Hier zijn wat extra opdrachten de je niet per se hoeft te doen, maar die je wel wat meer inzicht geven. De laatste opdracht is een soort eindtoets waarin je alles wat je daarvoor hebt geleerd gebruikt om de fouten in een voorbeeld op te sporen. Veel succes!
Extra 1. Geen ruimte
Haal eens alle witruimte (whitespace) uit het programma. Met witruimte wordt bedoelt spaties, tabs (inspringen), en nieuwe regels. Houd spaties die de verschillende woorden scheiden er wel in. Wat je overhoudt zou er als volgt uit moeten zien:
program HalloWereld;begin writeln(‘Hallo Wereld’); readln; end.
Denk je dat het programma nog steeds zal werken? Waarom wel of niet? Test het maar eens!
En wat als je echt alle spaties verwijderd - ook die tussen de woorden? Dat zou er dan zo uitzien:
programHalloWereld;beginwriteln(‘Hallo Wereld’);readln;end.
Heb je het uitgeprobeerd? De eerste variant zou gewoon moeten werken. Als dit bij jou niet het geval is, kijk dan even of je niet per ongeluk iets te veel hebt weggehaald.
De tweede variant geeft een foutmelding:
Syntax error, “BEGIN” expected but “identifier PROGRAMHALLOWERELD” found
In het Nederlands: Syntaxfout, “BEGIN” verwacht, maar “naam PROGRAMHALLOWERELD” gevonden. Zie je wat er hier mis gaat? Hij ziet programHalloWereld als een geheel en niet als een combinatie van het sleutelwoord program met de naam (wat Free Pascal identifier noemt) HalloWereld.
Maar waarom zegt Free Pascal dan dat hij begin wil zien, en niet program? Omdat je die eerste regel met de programmanaam weg kunt laten. Je programma begint dan met begin, en het werkt nog steeds. Wij zullen echter altijd de programma’s een naam geven.
De broncode van de hierboven genoemde programma’s:
Extra 2. Een punt maken van puntkomma’s
Commando’s worden gescheiden met puntkomma’s. Wat denk je dat er gebeurt als je er een vergeet? Haal maar eens de puntkomma op het eind van de program regel weg. Wat gebeurt er?
program HalloWereld
begin
writeln(‘Hallo Wereld’);
readln;
end.
Wat als je de puntkomma op het eind van de writeln regel weglaat?
program HalloWereld;
begin
writeln(‘Hallo Wereld’)
readln;
end.
En de puntkomma na de readln?
program HalloWereld;
begin
writeln(‘Hallo Wereld’);
readln
end.
Als het goed is kreeg je bij de eerste twee testen een foutmelding:
Syntax error, “;” expected but … found
maar bij de laatste niet. Waarom denk je dat dat is? Bij de laatste opdracht scheidt de puntkomma niet twee commando’s! Waarom kan de puntkomma na de programmanaam dan niet ook weg? begin en end worden gebruikt een een serie commando’s te groeperen tot een opdracht - het telt dus wel als commando.
Broncode:
Wat als je de punt op het eind na end vergeet?
program HalloWereld;
begin
writeln(‘Hallo Wereld’);
readln;
end
Of als je een puntkomma doet op het eind van het programma in plaats van een punt?
program HalloWereld;
begin
writeln(‘Hallo Wereld’);
readln;
end;
Kun je al een beetje voorspellen wat voor foutmelding FP (Free Pascal) gaat geven? In het eerste geval is het:
Syntax error, “.” expected but “end of file” found.
En voor de laatste:
Syntax error, “.” expected but “;” found.
Als je nu zo’n foutmelding ziet weet je dus precies wat er aan de hand is. De compiler zegt zelfs waar hij ongeveer denkt dat de fout zit. De hele regel van een foutmelding bestaat namelijk uit:
bestandsnaam (regel, kolom) omschrijving van de fout.
In het geval van de laatste test die we hebben gedaan zijn staat er als regel en kolom (6,4). Dit moet je dus lezen als regel 6 en kolom 4. Regel 6 is end; en kolom 4 is het vierde teken ;. Je weet dus precies waar je moet kijken.
broncode:
Extra 3. Spellingtoets
Je weet nu al aardig wat foutmeldingen te herkennen en je weet wat je dan moet doen. Er is nog een soort foutmelding waar we nog niet naar hebben gekeken, namelijk: wat als je woorden verkeerd spelt?
Zoals writeline ipv writeln?
program HalloWereld;
begin
writeline(‘Hallo Wereld’);
readln;
end.
Of programma ipv program?
programma HalloWereld;
begin
writeln(‘Hallo Wereld’);
readln;
end.
En
eind in plaats van end?
program HalloWereld;
begin
writeln(‘Hallo Wereld’);
readln;
eind.
Als reactie op het eerste voorbeeld zegt FP: Identifier not found “writeline” waarmee hij bedoelt dat hij de naam writeline niet kent. De tweede foutmelding Illegal expression is daar een gevolg van.
Bij het tweede voorbeeld krijg je: “BEGIN” expected but “identifier PROGRAMMA” found. Deze lijkt veel op de foutmelding die je kreeg bij de tweede witruimte-opdracht. Je ziet dus dat hij aangeeft dat hij een bepaald woord wil zien, en nog niet verteld dat hij de naam programma niet kent.
De foutmelding bij voorbeeld 3 is weer makkelijk herkenbaar: Identifier not found “eind”.
Broncode:
Extra 4. Readln
Waarom staat die readln er voor het eind van het programma? Het is al kort genoemd in Les 1, maar laten we het eens testen.
program HalloWereld;
begin
writeln(‘Hallo Wereld’);
eind.
Waarschijnlijk je het scherm wel even flikkeren, maar je krijgt de uitvoer van je programma niet te zien. FP gaat namelijk meteen weer terug naar het typscherm. Hoewel het makkelijker is om die readln toe te voegen aan het eind van je programma, kun je de uitvoer nog steeds te zien krijgen. Ga hiervoor in het menu naar Debug, User screen (Alt+F5). Als je op <enter> drukt ga je weer terug naar FP.
Broncode: hallowereldwachtniet.pas
Extra 5. Debuggen
Debuggen komt uit het Engels en betekent: fouten uit een computerprogramma halen. Het kan gaan om allerlei verschillende soorten fouten: een missende puntkomma, een verkeerd gespeld woord, of misschien dat de opdrachten niet helemaal goed zijn zodat het programma niet doet wat je wilt.
Debug het volgende programma:
programmeWieDitLeest
begin
writelijn(‘Wie dit leest kan goed debuggen.’);
eind;
Als je meedere foutmeldingen tegelijk ziet, begin dan met het verbeteren van de eerste die je herkent. Kom je er niet helemaal uit? Kijk dan nog eens naar de opdrachten hierboven. Alles wat je nodig hebt is al verteld.
Broncode: wieditleest.pas
Volgende keer
Geweldig dat je al zover bent gekomen! Vanaf nu wordt het alleen maar leuker: volgende keer gaan we beginnen met variabelen en invoer. Hier is les 2.