We maken bij het C practicum gebruik van WxDev-C++. Er is echter ook een gratis alternatief Microsoft Visual C++ 2008 Express Edition. Het opsporen van logische fouten (debuggen) is eenvoudiger in Visual C++.
Prog1 van PROS1P1 met Visual C++ 2008.
Kies (klik op) Win32 en vervolgens Win32 Console Application. Type de naam van het programma in, bijvoorbeeld prog1
Kies (klik op) Code en vervolgens op C++ File. Type de naam van het sourcebestand in, bijvoorbeeld main.c
Let op! Het is heel belangrijk om de extensie .c te gebruiken zodat de compiler weet dat je een C programma wilt schrijven (en geen C++ programma). C++ is een veel uitgebreidere taal dan C. De programmeertaal C++ komt bij het tweede jaarsvak PROS3 aan de orde.
printf("Het product van %d en %d is: %d\n", a, b, product);
printf("\nSluit dit venster door op een toets te drukken");
Merk op dat Visual C++ je helpt bij het typen. Als je bijvoorbeeld printf( typt dan laat Visual C++ zien welke argumenten je aan deze functie moet meegeven.
Standaard C.
Als je zeker wilt weten dat een programma dat je ontwikkeld met Visual C++ ook werkt met andere compilers (bijvoorbeeld wxDev-C++) dan moet je geen gebruik maken de specifieke Microsoft extentions (uitbreidingen).
Deze debughandleiding is gedeeltelijk geschreven door Ruben Geluk (oud-student Elektrotechniek).
Als je daarna 4x op F10 drukt worden de eerste 4 regels van main uitgevoerd.
Je ziet de waarden van de variablen a, b en product.
Als er logische fouten in je programma zitten dan is het soms erg lastig om die fouten te vinden. We kunnen de debugger gebruiken om te kijken of het programma doet wat we verwachten. Hieronder staan een aantal eenvoudige programma's. Deze programma's bevatten logische fouten, die niet door de compiler worden gemeld. Het lijkt dus alsof het programma prima werkt (volgens de compiler), maar de uitvoer van de programma's zijn niet juist. Met behulp van de Debugger kan nagegaan worden in welke statement een logische fout zich heeft verstopt.
Voorbeeld 1 - Bol
Kees wil een programma schrijven dat de inhoud van een bol berekent als de straal van deze bol bekend is. Hij weet dat dit met de volgende functie gaat:
Zijn programma staat hieronder afgedrukt.
double inhoud;
int straal=2;
double vier_pi=(4*3,14);
printf("Debug Demonstratie Visual C++ 2008 Express Edition\n");
inhoud=(straal*straal*straal*vier_pi)/3;
printf("Een bol met een straal van %d cm heeft een inhoud van %f cm^3", straal, inhoud);
Kees compileert het programma en het blijkt dat er geen syntax fouten inzitten. Als hij het echter uitvoert blijkt dat de inhoud van de bol niet juist is. De uitvoer van het programma is:
Debug Demonstratie Visual C++ 2008 Express Edition
Een bol met een straal van 2 cm heeft een inhoud van 37.333333 cm^3
De juiste inhoud van een bol van 2 cm is echter 33.510321638291127876934862754981 cm3. We gaan nu uitzoeken waar deze fout zit.
Met F10 lopen we stap voor stap door het programma heen en we controlleren de waarde van alle variabelen na elke stap.
Hierboven zie je de waarden van de variabelen nadat de eerste 2 regels van main zijn uitgevoerd. De straal is gelijk gemaakt aan 2. Alles is nog zoals we verwachten. Kees drukt nogmaals op F10.
Kees ziet nu dat de waarde van de variabele vier_pi 14.000 is geworden. Dat klopt natuurlijk niet. Er zit dus een fout in de regel:
In C moet de floating point constante 3,14 ingetypt worden als 3.14.
Na deze correctie blijkt het programma correct te werken:
Een bol met een straal van 2 cm heeft een inhoud van 33.493333 cm^3
Het antwoord is nog niet erg nauwkeurig. Dit komt omdat kees de constante pi niet erg nauwkeurig heeft ingevoerd.
Voorbeeld 2 - Machtverheffen
Gegeven is het volgende programma.
int macht;
int xtoy(int a, int b);
macht = xtoy(x, y);
printf("\n7 tot de macht 8 = %d", macht);
int xtoy(int a, int b)
for(tel=0; tel<b; tel++)
answer = answer * a;
Neem dit programma over en voer het uit. In dit programma wordt de 78 uitgerekend. Zoals iedereen kan nagaan is het juiste antwoord 5764801. Het programma levert echter een verkeerde waarde. Aan jou de opdracht om uit te zoeken waar deze fout zit. De werkwijze is dezelfde als bij de vorige opdracht. Stap door het programma heen en hou de variabelen in de gaten. Tip: wil je ook binnenin de functie xtoy stappen, gebruik dan F11 "Step Into" op het moment dat de functie wordt aangeroepen.
Kun je de fout vinden? Zo niet mail voor een tip: mailto:bd@hhs.nl.
Voorbeeld 3 - Optellen
#define AANTAL 4
int array[AANTAL] = {3,5,6,9};
int TelOp(int[]);
som = TelOp(array);
printf("De som van de 4 getallen is: %d", som);
int TelOp(int lijst[])
for(tel=0; tel<AANTAL; tel++)
answer = answer + lijst[tel];
Neem dit programma over en voer het uit. Bij het uitvoeren krijg je de volgende waarschuwing. Snap je deze melding?
Als je op Continue drukt wordt het programma vervolgd.
Bedenk dat de meeste C compilers helemaal geen code genereren voor deze warning. Probeer maar eens wat er gebeurt als je dit programma met WxDev-C++ compileert en runt.