Avatar billede sipswj Nybegynder
07. april 2008 - 19:14 Der er 11 kommentarer

Try, Catch og throw.

Jeg har store problemer med at benytte try, throw og catch.
Vi skal lave en vekselmaskine. En underopgave er at lave en tom struct i headeren, som hedder "notEnoughMoney" som skal kastes hvis maskinen løber tør for penge.
Jeg har inkluderet min cpp fil med funktionerne. Al hjælp vil blive modtaget med kyshånd.

#include "Automat.h"
#include <iostream>

void Automat::veksel(seddelType s)
{
        try
    {
        if (s == FEMTI)
        {
            udRegn(50);
        }
        else if (s == EN_HUND)
        {
            udRegn(100);
        }
        else if (s == TO_HUND)
        {
            udRegn(200);
        }
        else if (s == FEM_HUND)
        {
            udRegn(500);
        }
        else if (s == INVALID)
        {
        cout << "Sedlen kan ikke accepteres.\n";
        }
    }
    catch (int h[])
    {
        if (h[0] == 0 && h[1] == 0)
        {
           
        }
        else
        {
            cout << "\nDer er blevet vekslet til:\n" << h[0] << " antal tyvere\n" << h[1] << " antal tiere." << endl;
        }
    };

}
void Automat::udRegn(int amount)
{

        int x,y,i;
        int z[2];
        x = 0;
        y = 0;
        i=1;
        while (i > 0)
        {
            if (amount == 0)
            {
                i = 0;
            }
            else if (amount>10 && coins.tyvere>0) //korrekt og-funktion?
            {
                amount -= 20;
                coins.tyvere -= 1;
                x += 1;
            }   
            else if (amount==10 || coins.tyvere==0) //korrekt eller-funktion?
            {
                amount -= 10;
                coins.tiere -= 1;
                y += 1;
            }
/*            else if (coins.tiere==0 && coins.tyvere==0 || coins.tiere==0 && amount==10)
            {
                throw notEnoughMoney ("Der er ikke moenter nok i automaten til at veksle\n");
                i = 0;
            }
*/

        }
        z[0] = x;
        z[1] = y;
        throw z;
Avatar billede arne_v Ekspert
07. april 2008 - 19:24 #1
Jeg er ikke sikker paa at jeg forstaa hvad dit problem er.

Generelt skal du bare catche samme type som du thrower.

Eksempel:

#include <iostream>
#include <string>

using namespace std;

struct Foobar
{
    int iv;
    string sv;
};

int main()
{
    try
    {
        throw 123;
    }
    catch(int ex)
    {
        cout << "Vi hapsede " << ex << endl;
    }
    try
    {
        throw string("abc");
    }
    catch(string ex)
    {
        cout << "Vi hapsede " << ex << endl;
    }
    try
    {
        Foobar fb;
        fb.iv = 123;
        fb.sv = "abc";
        throw fb;
    }
    catch(Foobar ex)
    {
        cout << "Vi hapsede " << ex.iv << " & " << ex.sv << endl;
    }
    return 0;
}
Avatar billede sipswj Nybegynder
07. april 2008 - 19:44 #2
Men når det er en struct jeg thrower, hvordan catcher jeg sådan en? Endvidere når det er påkrævet det skal være en tom struct. Hvordan ved brugeren så at der er sket en exception?
Avatar billede arne_v Ekspert
07. april 2008 - 19:56 #3
Min foobar er en struct.

Selve catch er ikke afhaengig af at der er struct'en har noge felter - catch sker paa type.
Avatar billede arne_v Ekspert
07. april 2008 - 19:57 #4
... er ikke afhaengig af at struct'en har nogle felter ...
Avatar billede sipswj Nybegynder
07. april 2008 - 20:20 #5
"Rediger udRegn funktionen og kast (throw) en struct notEnoughMoney uden medlemmer, som er privat i Automat-klassen. Fang (catch) denne exception i veksel()-funktionen og behandl den fornuftigt."

Dette er taget fra opgave teksten til mit spørgsmål. Så vidt jeg har forstået skal der ikke oprettes noget via notEnoughMoney hvor du opretter fb via Foobar. Hvordan ser du opgaven løst med efter du har læst opgaveteksten?
Avatar billede arne_v Ekspert
07. april 2008 - 20:32 #6
notEnoughMoney er en struct ligesom Foobar dog uden felter
Avatar billede sipswj Nybegynder
07. april 2008 - 20:35 #7
Jeg er godt klar over det er en struct. Jeg kan bare ikke se hvad du mener. Det er sikkert simpelt men jeg har aldrig arbejdet med exceptions før og sidder fast siden igår morges. Er derfor vildt frustreret over det ikke virker. Hvis du har tid til at forklare det lidt dybere hvordan du ser opgaven løst udfra den tidligere nævnt opgavetekst vil jeg blive glad.
Avatar billede arne_v Ekspert
08. april 2008 - 01:26 #8
Prøv og studer mit eksempel.

Så skriv noget kode. Og virker det ikke som det skal så post koden her - i form af
noget kode som kan oversættes.
Avatar billede sipswj Nybegynder
08. april 2008 - 08:53 #9
Ok.

Jeg har nu ændret i min kode:
else if (coins.tiere == 0 && coins.tyvere == 0 && amount > 10 || coins.tiere==0 && amount > 9)
    {
        throw notEnoughMoney;
        i = 0;
    }

Compileren siger: "Error 2275: 'Automat::notEnoughMoney' : illegal use of this type as an expression.

Any thoughts?
Avatar billede arne_v Ekspert
08. april 2008 - 13:40 #10
Du skal smide en instans af notEnoughMoney ikke notEnoughMoney selv.

notEnoughMoney nem;
throw nem;
Avatar billede lars314 Nybegynder
16. april 2008 - 13:47 #11
Du bør nok ændre det så du catch'er by reference og ikke by value.

d.v.s.

catch(Foobar& ex)
{
    cout << "Vi hapsede " << ex.iv << " & " << ex.sv << endl;
}

Læs evt.
http://www.parashift.com/c++-faq-lite/exceptions.html#faq-17.7
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester