Thuis
Contacten

    Hoofdpagina


Programmeren in C++ voor beginners

Dovnload 5.04 Mb.

Programmeren in C++ voor beginners



Pagina21/49
Datum25.10.2017
Grootte5.04 Mb.

Dovnload 5.04 Mb.
1   ...   17   18   19   20   21   22   23   24   ...   49

assert

C++ kent 209 standaard functies (standaard van 2003), waaronder assert. assert is de eerste functie die we leren gebruiken en aanroepen.


assert wordt gebruikt voor het debuggen en het documenteren van code.
Bekijk wat er mis kan gaan in onderstaande functie:
double DeelDoor(double teller, double noemer)

{

return teller / noemer;



}
Wat er is mis kan gaan, is dat een deling door 0.0 onmogelijk is ('delen door nul is flauwekul').

Een niet-oplossing is commentaar:
double DeelDoor(double teller, double noemer)

{

//noemer moet nooit 0.0 zijn!!!



return teller / noemer;

}
Een if-statement kan ook een niet-oplossing bieden:


double DeelDoor(double teller, double noemer)

{

//noemer moet nooit 0.0 zijn!!!



//is deze dat wel, geef dan een groot getal terug

if (noemer == 0.0) return 100000.0;

return teller / noemer;

}
De functie is nu minder schoon: een deling door nul zou nooit voor moeten komen. Nu bepaald de functie wat er gebeurt bij een deling bij nul. Maar de aanroeper van de functie moet dit bepalen. Maar de functie moet aan kunnen geven wat 'ie wel en niet aankan.






Geef een eenheid, zoals een functie, een duidelijke verantwoordelijkheid.

assert kan aangeven wat een functie wel of niet kan:


double DeelDoor(double teller, double noemer)

{

assert(noemer != 0.0);



return teller / noemer;

}
Als de functie DeelDoor nu wordt aangeroepen met een noemer van 0.0, dan komt er een foutmelding op het scherm, die zegt wat er mis gaat en in welke regel in welk bestand.



Merk op dat als deze melding verschijnt er niet op OK moet worden geklikt, want soms laat dit Kylix hangen. Een 'Program Reset' (CTRL-F2) voorkomt dit probleem.




Maak vrijelijk gebruik van assert om aannames te documenteren.

assert is niet meteen beschikbaar. Er moet een header file voor worden ge-#include:


#include
Deze #include kan op meerdere plaatsen staan, maar moet zowieso 'boven' een assert aanroep staan. Een mooie plek is tussen de standaard #includes in Unit1.h en Unit1.cpp.
assert heeft nog een belangrijk voordeel. Immers, we hebben nog niet gezien wat assert nuttiger maakt dan een if statement. Onderstaande code zou ook kunnen werken, dat gebruik maakt van ShowMessage, een Kylix-specifieke functie.
double DeelDoor(double teller, double noemer)

{

if (noemer == 0.0) ShowMessage("Error!");



return teller / noemer;

}
Nu, laten we aannemen dat het programma af is: alle checks zijn met if en ShowMessage gedaan, en er komen nooit foutmeldingen. Nu het programma geen fouten heeft, dan kunnen alle vertragende if-statements eruit. Vaak wordt deze if dan commentaar gemaakt. Het probleem is nu, bij grote programma's heb je honderden if-statements. Dit is veel werk!


Om alle asserts 'weg te krijgen', ga naar 'Project | Options | Conditionals' en voeg bij 'Conditional Defines' het woord 'NDEBUG' toe. Alle asserts blijven staan in de code, maar worden 'inactief' (specifieker: de pre-compiler veranderd de asserts naar lege regels). Om de asserts weer te activeren, haal dan NDEBUG weg uit de 'Conditional Defines'.

Merk op dat dit ook met code kan, door de volgende regel code toe te voegen voor de #include van de header file cassert:
#define NDEBUG

1   ...   17   18   19   20   21   22   23   24   ...   49


Dovnload 5.04 Mb.