[C++]First chance - exception

Pagina: 1
Acties:

  • Sangurash
  • Registratie: Februari 2001
  • Laatst online: 21-08 07:21

Sangurash

Are u talkin' to I.R.?

Topicstarter
Ik heb een vervelend probleem, ik wil een programma maken dat grafieken enzovoort laat zien. Een grafiek kan meerdere lijnstylen (---, ...) hebben en verschillende kleuren. Nu kan ik dus een CPen object aanmaken en zo de punten doorlopen, maar elke keer als er een andere style gewenst wordt moet er een nieuw pen object aangemaakt worden en krijg ik naar verloop van tijd die exception, naar vele aangemaakte pennen dus.
Ik maak dus meerdere pennen aan voor ik de oude pen terug zet en de pennen delete! Ik gebruik trouwens MFC iemand een idee?


Dit is de probleem code:

<lus>
CPen pen(lijnStijl, 1, getRGB(ditVenster.LijnInstel.GetAt(volgendeLijn+1)));
pDC->SelectObject(&pen);

teken lijnen enzovoort...
<lus>

[ Voor 7% gewijzigd door Sangurash op 23-04-2003 14:05 ]

Uw SAP specialist


  • whoami
  • Registratie: December 2000
  • Laatst online: 10:17
Welke exception krijg je dan precies?

https://fgheysels.github.io/


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Je moet de pennen ook gewoon direct na gebruik verwijderen als je er zoveel wilt alloceren

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Sangurash
  • Registratie: Februari 2001
  • Laatst online: 21-08 07:21

Sangurash

Are u talkin' to I.R.?

Topicstarter
Het probleem is dat ik de geslecteerde pen steeds moet doorgebruiken tot een nadere style gewenst is dan moet er een nieuwe pen komen. Ik moet eigenlijk de oude pen hervullen ofzo maar dat kan niet :S.

De exception is een standard fout ik heb al op de error code gezocht maar dat leidt tot vele dingen. Het punt is dat er op den duur veel pennen zijn die niet gebruikt worden met de zelfde naam :| . Ik weet het echt niet meer ...

Uw SAP specialist


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Waarom kun je niet gewoon bij het gebruik van een nieuwe pen de oude opruimen, en dan zodra de oude weer nodig is een nieuwe aanmaken?

En wat is een standaard fout? Plaats eens een screenshot oid van je foutmelding? En wat bedoel je met een pen met een "naam" ?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
Ehm, die CPen staat binnen de loop, toch? Dan wordt die elke keer aan het einde van de iteratie weggegooid. Maar voor de zekerheid, laat die loop helemaal zien (eigenlijk de hele functie)

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

MSalters voor zover ik weet doet de destructor van CPen (CGdiObject eigenlijk) geen DestroyHandle op de aangemaakte handle. Dat moet je zelf doen door CGdiObject::DestroyHandle () aan te roepen

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Sangurash2 schreef op 23 April 2003 @ 14:46:
De exception is een standard fout ik heb al op de error code gezocht maar dat leidt tot vele dingen.
Heej wil je nu geholpen worden of niet? De reden dat jij hier je vraag stelt is omdat wij wellicht meer ervan weten dan jij. Dat de errorcode en exception jou toevallig niets te melden hebben betekent niet dat het ons niet kan helpen om jou te helpen. Je hebt al zoveel woorden vuil gemaakt aan het melden dat het ding een standaard code is dat je al 100 keer de errorcode had kunnen typen.

Professionele website nodig?


  • Sangurash
  • Registratie: Februari 2001
  • Laatst online: 21-08 07:21

Sangurash

Are u talkin' to I.R.?

Topicstarter
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
    //for voor grafiek punten, lijn, markeringen
    for(int aantal = ditVenster.LijnInstel.GetAt(volgendeLijn); aantal < maxCoords; aantal++)
    {   
        //indien true vanaf dit punt andere lijnstijl gekozen
        if(ditVenster.LijnInstel.GetAt(volgendeLijn)==aantal)
        {
            lijnStijl = ditVenster.LijnInstel.GetAt(volgendeLijn+2);
            if(lijnStijl != ditVenster.LijnInstel.GetAt(huidigeLijn+2) || volgendeLijn == 0 ||
                ditVenster.LijnInstel.GetAt(volgendeLijn+1) != ditVenster.LijnInstel.GetAt(huidigeLijn+1))
            {
>> De foutieve code             CPen pen(lijnStijl, 1, getRGB(ditVenster.LijnInstel.GetAt(volgendeLijn+1)));
>>              pDC->SelectObject(&pen);
            }
            huidigeLijn = volgendeLijn;
            if(maxLijnInst > volgendeLijn + 4)
                volgendeLijn +=4;
        }
        //markering > 0 = true
        if(ditVenster.LijnInstel.GetAt(huidigeLijn+3) > 0)
        {
            //ster is kleinerdan letter dus anders verticaal centreren
            double ster = modeY;
            
            if(ditVenster.LijnInstel.GetAt(huidigeLijn+3) == 42)
                ster += 2.0 * modeY;
            if(printen)
                ster -=  modeX*4;

            pDC->SetTextAlign(TA_CENTER|TA_TOP);//centreer
            tekenMarkering(modeX * ditVenster.xCoords.GetAt(aantal),
                           modeY * (ditVenster.yCoords.GetAt(aantal)+ster),//+3voor ster
                           ditVenster.LijnInstel.GetAt(huidigeLijn+1),
                           ditVenster.LijnInstel.GetAt(huidigeLijn+3), pDC);
        }
        if(maxMoveTo > 0)//zijn er M commandos?
        {
            //true als huidige punt geen lijn maar move to is
            if(ditVenster.MoveTos.GetAt(curMov)==aantal)
            {
                pDC->MoveTo(modeX * ditVenster.xCoords.GetAt(aantal),
                            modeY * ditVenster.yCoords.GetAt(aantal));  //andere punten grafiek
                if((maxMoveTo-1)!=curMov)
                    curMov++;
            }
        }
        //geen lijn maar punt
        if(lijnStijl == 5)//alleen puntje
        {
            CPoint p(modeX * ditVenster.xCoords.GetAt(aantal),
                     modeY * ditVenster.yCoords.GetAt(aantal));
            pDC->SetPixel(p,1);                         //andere punten grafiek
        }
        else    //geen van de anderen dus het is een gewone lijn
        {
            pDC->LineTo(modeX * ditVenster.xCoords.GetAt(aantal),
                        modeY * ditVenster.yCoords.GetAt(aantal));  //andere punten grafiek
        }
    }       
    pDC->SelectObject(oldPen);
    pDC->SelectObject(oldFont);             //oude font terugzetten

    pen.DeleteObject();
    font.DeleteObject();                    //verwijder object
}

Mja helaas, werk ik nu thuis en krijg ik de exception niet omdat ik met XP werk, hij beindigd nu gewoon. The thread 0x180 has exited with code 0 (0x0).
The thread 0x46C has exited with code 0 (0x0).

Het is geen uber code ofzo en nog sorry van me moeilijk doen , ben ff niet goed bezig hier :D

[ Voor 7% gewijzigd door Sangurash op 24-04-2003 13:09 ]

Uw SAP specialist


  • The End
  • Registratie: Maart 2000
  • Laatst online: 13:32

The End

!Beginning

Ten eerste:
De CPen die jij maakt, wordt volgens mij meteen weggegooid. Alles wat binnen de {} wordt aangemaakt, bestaat erbuiten niet. (iemand anders kan dit vast netter/duidelijker uitleggen)
Echter geef je wel een referentie naar dat object mee in 'SelectObject'. En omdat het CPen object buiten de brackets niet meer bestaat crashed je applicatie.

Ten tweede:
SelectObject geeft je het vorig geselecteerde object terug.
Wat je moet doen om netjes ermee te werken is dit:
code:
1
2
3
4
5
6
CPen NewPen(blablabla)
CPen *OldPen = NULL;
OldPen = pDC->SelectObject(&NewPen);
//doe van alles
pDC->SelectObject(OldPen);
NewPen.DeleteObject();

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

The End schreef op 24 April 2003 @ 14:32:
Ten eerste:
De CPen die jij maakt, wordt volgens mij meteen weggegooid. Alles wat binnen de {} wordt aangemaakt, bestaat erbuiten niet. (iemand anders kan dit vast netter/duidelijker uitleggen)
Dit klopt idd. De locale variabele gaat buiten scope, en wordt derhalve opgeruimd. Echter, dit geldt alleen voor de CPen instantie zelf. Wat de constructor voor CPen doet is de CreatePen () API functie aanroepen, die een handle teruggeeft. De destructor van CPen ruimt die handle echter niet op met DeleteObject (), zoals ik al eerder zei.

CDC::SelectObject verwacht dan wel een pointer naar een CPen, maar intern doet het gewoon een aanroep naar ::SelectObject met de handle die in de CPen staat. Het buiten scope gaan van de CPen doet er weinig toe, de aangemaakte handle bestaat nog steeds.

En daarom gaat het ook op een gegeven moment fout, de handles worden niet vrijgegeven, en op een gegeven moment kun je er niet meer aanmaken omdat er teveel zijn.
Ten tweede:
SelectObject geeft je het vorig geselecteerde object terug.
Wat je moet doen om netjes ermee te werken is dit:
code:
1
2
3
4
5
6
CPen NewPen(blablabla)
CPen *OldPen = NULL;
OldPen = pDC->SelectObject(&NewPen);
//doe van alles
pDC->SelectObject(OldPen);
NewPen.DeleteObject();
dit is idd betere code :Y)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Sangurash
  • Registratie: Februari 2001
  • Laatst online: 21-08 07:21

Sangurash

Are u talkin' to I.R.?

Topicstarter
Ik zal het volgende week eens gaan testen op 98 het lijkt nu op Xp redelijk goed! Bedankt voor alle reacties! En zo snel ook _/-\o_ .
Ik laat het nog weten!

Uw SAP specialist


  • Sangurash
  • Registratie: Februari 2001
  • Laatst online: 21-08 07:21

Sangurash

Are u talkin' to I.R.?

Topicstarter
Mja het werkt nu wel, bij ieder lijntje een pen aanmaken selecten lijntje teken oude pen herzetten, alleen het is giga traaag :S .

Uw SAP specialist

Pagina: 1