Introductie Microsoft Visual C++ 2008 Express Edition.

© Harry Broeders.

Deze pagina is bestemd voor studenten van de Haagse Hogeschool - TH Rijswijk/Academie voor Engineering.

Inleiding.

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++.

Downloaden en installeren.

Je kunt Microsoft Visual C++ 2008 Express Edition downloaden vanaf: http://www.microsoft.com/express/download/. De installatie wijst zichzelf.

Prog1 van PROS1P1 met Visual C++ 2008.

Start het programma en klik op het knopje New Project.

[Image]

Kies (klik op) Win32 en vervolgens Win32 Console Application. Type de naam van het programma in, bijvoorbeeld prog1

[Image]

Klik vervolgens op Application Settings en vink het hokje Empty Project aan.

[Image]

Klik nu op het knopje Add New Item.

[Image]

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.

[Image]

Type nu de code voor het programma in:

#include <stdio.h>
int main()
{
    int a, b, product;
    a = 6;
    b = 10;
    product = a*b;
    printf("Het product van %d en %d is: %d\n", a, b, product);
    printf("\nSluit dit venster door op een toets te drukken");
    getchar();
    return 0;
}

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.

[Image]

Klik nadat je het hele programma heb ingetypt op het Start Debugging knopje.

[Image]

Visual C++ snapt zelf dat het programma eerst gecompileerd moet worden.

[Image]

Als het goed is wordt het programma nu gecompileerd en uitgevoerd.

[Image]

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).

Dit kun je instellen bij de properties van een project. Druk op Alt+F7 om het property window te openen en zet "Disable Language Extentions" op "Yes".

[Image]

Debuggen.

Deze debughandleiding is gedeeltelijk geschreven door Ruben Geluk (oud-student Elektrotechniek).

Je kunt het programma ook stap voor stap uitvoeren. Dat is erg handig als je een logische fout in je programma wilt opsporen.

Met de functietoets F10 (Step Over) kun je stap voor stap door het programma lopen. Als je 1x op F10 drukt stopt het uitvoeren bij de main functie. Een geel pijltje geeft aan waar de uitvoering gestopt is.

[Image]

Als je daarna 4x op F10 drukt worden de eerste 4 regels van main uitgevoerd.

Merk op dat je de lokale variabelen in het window links onder kunt zien.

[Image]

Je ziet de waarden van de variablen a, b en product.

Als je (later) een eigen functie of memberfunctie hebt geschreven en je wilt dat deze functie ook stap voor stap wordt uitgevoerd dan moet je op F11 (Step Into) drukken op het moment dat deze functie wordt aangeroepen.

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.

#include <stdio.h>

int main()
{
    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);
    getchar();
    return 0;
}

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.

[Image]

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.

[Image]

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:

    double vier_pi=(4*3,14);

Zie jij de fout?

In C moet de floating point constante 3,14 ingetypt worden als 3.14.

Na deze correctie blijkt het programma correct te werken:

Debug Demonstratie Visual C++ 2008 Express Edition
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.

#include <stdio.h>

int main()
{
    int x = 7;
    int y = 8;
    int macht;
    int xtoy(int a, int b);

    printf("Debug Demonstratie Visual C++ 2008 Express Edition\n");

    macht = xtoy(x, y);
    printf("\n7 tot de macht 8 = %d", macht);
    getchar();
    return 0;
}

int xtoy(int a, int b)
{
    int tel;
    int answer = a;
    for(tel=0; tel<b; tel++)
    {
        answer = answer * a;
    }
    return answer;
}

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

#include <stdio.h>
#define AANTAL 4

int main()
{
    int array[AANTAL] = {3,5,6,9};
    int som;
    int TelOp(int[]);

    printf("Debug Demonstratie Visual C++ 2008 Express Edition\n");

    som = TelOp(array);
    printf("De som van de 4 getallen is: %d", som);
    getchar();
    return 0;
}

int TelOp(int lijst[])
{
    int tel;
    int answer;
    for(tel=0; tel<AANTAL; tel++)
    {
        answer = answer + lijst[tel];
    }
    return answer;
}

Neem dit programma over en voer het uit. Bij het uitvoeren krijg je de volgende waarschuwing. Snap je deze melding?

[Image]

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.