Toon posts:

[Visual C++] Errors bij runnen niet bij compilen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

Ik ben bezig met een spel te maken en zit nu met een probleem, waar ik niet uit kom.

Ik wil aan alle kanten planes gaan plakken om een 'wereld' te creeeren, maar wanneer ik
mijn planes en textures voor front, back, right en left wil aanmaken gaat het fout. Het compilen geeft geen enkel probleem, maar zodra ik ga runnen krijg ik een foutmelding.

Hieronder als eerst de code van de headerfile waarna het fout gaat
level1.h:

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
#pragma once

#include <string>
#include "level.h"

class Application;
class PlaneEntity;
class BlockEntity;
class KartEntity;
class TextureManager;
class Texture;
class EntityManager;
class InputManager;

class Level1
    
{
private:
    std::string name;
    
    //Lijst met objecten die gebruikt worden in dit levl
    PlaneEntity * planeEntity;
    BlockEntity * blockEntity;
    KartEntity * kartEntity;

                Application * application;

    Texture * texture;

                // het betreft dit gedeelte
    Texture * frontTexture;
    Texture * backTexture;
    Texture * leftTexture;
    Texture * rightTexture;

    PlaneEntity * frontPlane;
    PlaneEntity * backPlane;
    PlaneEntity * leftPlane;
    PlaneEntity * rightPlane;
                // einde gedeelte

    EntityManager * entityManager;
    InputManager * inputManager;

    void addKart();
    void addPlane();
    void addBlockObjects();
public:

    Level1(std::string name, Application *app, EntityManager * entityManager, InputManager * inputManager); 
    ~Level1(void);
    void setUpLevel();

};


Zodra ik 7 van de 8 benodigde planes en textures uit probleemgebied actief maak(dus bij 1 nog de '//' commentaar tekens ervoor) krijg ik de volgende error:

"Unhandled exception at 0x7c901230 in GameEngine.exe: User breakpoint"

hij gaat terug naar visual studio en komt bij de volgende klasse en methode:
"mlock.c"

code:
1
2
3
4
5
6
7
8
9
void __cdecl _unlock (
        int locknum
        )
{
        /*
         * leave the critical section.
         */
        LeaveCriticalSection( _locktable[locknum].lock );
}


Wanneer ik alle 8 de planes en textures 'actief' maak krijg ik de volgende fout:

"Unhandled exception at 0x7c812a5b in GameEngine.exe: Microsoft C++ exception: std::bad_alloc @ 0x0012e89c."

en gaat in visual studio naar de volgende klasse en code stuk:
"dbgheap.c"

code:
1
2
3
4
5
6
7
#ifdef _MT
            }
            __finally {
                /* unlock the heap
                 */
                _munlock(_HEAP_LOCK);
            }


Ik begrijp niet hoe dit komt, wat dit inhoudt en hoe ik dit kan oplossen. Aangezien ik in een header file als level.h gemakkelijk 12 planes en textures kan zetten zonder fouten bij runnen.

Ik hoop dat iemand een oplossing voor mijn probleem weet!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:52

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ten eerste post je te weinig context - ga in de callstack omhoog tot je in je eigen code terecht komt.

Ten tweede kan ik wel raden wat er mis gaat: heap corruption. Dat kan betekenen dat je:
  • geheugen meer dan 1 keer vrij geeft
  • geheugen gebruikt wat nooit is gealloceerd (denk aan een ongeïnitialiseerde pointer)
  • geheugen gebruikt wat je al hebt vrijgegeven (tip: zet je pointers op 0 na het vrijgeven)
  • simpelweg buiten je buffers schrijft.
Je programma crasht in zo'n geval bijna nooit bij de fout zelf maar op een later moment in code die er totaal niet aan gerelateerd is.

[ Voor 7% gewijzigd door .oisyn op 22-01-2007 19:57 ]

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.


Verwijderd

Topicstarter
Als eerst bedankt voor je reactie.

Ik ben vrij nieuw met c++ en visual studio, dus snap nog niet helemaal alles ervan,
dus ook niet van 'heap corruption' enzovoort, maar jouw uitleg hierover, maakt het iets duidelijker voor mij. Maar dan blijft dat het voor mij lastig is om te vinden waar het precies het geval is.

Ik vind het raar dat het programma pas crasht, wanneer ik 7 textures en planes heb aangemaakt(dus zeg maar front, back, left, right, top planes en front en back texture) als ik maar 6 in die level1.h zet doet het programma het wel.

Hieronder heb ik nog een stuk code over hoe ik de planes en textures gebruik in mij level1.cpp

level1.cpp:
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
void Level1::addPlane() {

    int error = FE_OK;   
    Texture * texture = application->getTextureManager()->createMipMapTexture
                ("ground.png", &error);

    Texture * frontTexture = application->getTextureManager()->createMipMapTexture
                ("front.png", &error);
    Texture * backTexture = application->getTextureManager()->createMipMapTexture
                ("backpng", &error);
    Texture * leftTexture = application->getTextureManager()->createMipMapTexture
                ("left.png", &error);
    Texture * rightTexture = application->getTextureManager()->createMipMapTexture
                ("right.png", &error);
    Texture * topTexture = application->getTextureManager()->createMipMapTexture
                ("top.png", &error);

    planeEntity = new PlaneEntity(application, 0, 1, 0, -GRIDWIDTH / 2);
    planeEntity->setTexture(texture); //texture toevoegen

    frontPlane = new PlaneEntity(application, 0, 0, 1, -GRIDWIDTH / 2);
    backPlane = new PlaneEntity(application, 0, 0, -1, -(MAX_LEVEL_WIDTH*3 -
                GRIDWIDTH / 2));
    leftPlane = new PlaneEntity(application, 1, 0, 0, -GRIDWIDTH / 2);
    rightPlane = new PlaneEntity(application, -1, 0, 0, -(MAX_LEVEL_WIDTH*3 - 
                GRIDWIDTH / 2));
    topPlane = new PlaneEntity(application, 0, -1, 0, -(MAX_LEVEL_WIDTH*3 - 
                GRIDWIDTH / 2));
    
    frontPlane->setTexture(frontTexture);
    backPlane->setTexture(backTexture);
    leftPlane->setTexture(leftTexture);
    rightPlane->setTexture(rightTexture);
    topPlane->setTexture(topTexture);

    entityManager->addEntity(planeEntity);  
    entityManager->addEntity(frontPlane);
    entityManager->addEntity(backPlane);
    entityManager->addEntity(leftPlane);
    entityManager->addEntity(rightPlane);
    entityManager->addEntity(topPlane);
}


Ik hoop dat jij mij kunt aangeven hoe ik het beste het 'heap corruption' probleem kan aanpakken, ik heb wel al een Visual Leak Detector in mijn project gebracht en geeft inderdaad leaks aan, maar ik snap niet veel van de informatie die deze tool geeft.

  • The Fox NL
  • Registratie: Oktober 2004
  • Laatst online: 10:15
MrRock, ik kan geen berichtjes naar jou sturen, dus dan maar zo.

Mag ik vragen hoe jij aan die code komt? Aangezien die code van mijn progsel FoxEngine komt (vandaar ook FE_OK, whats in a name). Ik heb dit gemaakt tijdens mijn opleiding aan de Hogeschool Zeeland met het vak Computer Graphics.


En bij mij doet ie het wel...

Graag antwoord

Verwijderd

Topicstarter
Hallo The Fox NL,

Het antwoord is heel simpel.
De code is als voorbeeld ter beschikking gesteld door desbetreffende docent aan de HZ, zodat ook te gebruiken valt voor tips bij nieuwe projecten.
Ik heb slechts enkele delen van jouw code gebruikt, waaronder jouw TextureManager, die ik erg sterk vond werken, maar zoals je al kunt zien is dit project geen kopie van het jouwe, aangezien jij bijvoorbeeld al geen gebruik maakt van level1.cpp en level1.h. De FE_OK heb ik dus meegenomen aangezien deze ook in de TextureManager zat. De opbouw van het geheel is totaal anders nu...

Hoop dat dit genoeg duidelijk maakt voor jouw The Fox Nl.

Verder....
Doordat ik dus in een nieuw project werk en het daarin anders doe, zit ik wel met een probleem dat het 't niet doet, ik kom er nog steeds niet uit en hoop dat iemand mij daarbij kan helpen, van die VLD teksten begrijp ik helemaal niets namelijk...

[ Voor 12% gewijzigd door Verwijderd op 23-01-2007 13:56 ]


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Nofi, het probleem is helemaal niet dat dit een nieuw project is, maar dat je je heap memory basics (pointers, malloc(), free() etc.) niet beheerst. Dat is de context van alle mogelijkheden welke .oysin hierboven noemt. Er zijn genoeg tutorials hierover, alsmede een beroemd melig filmpje: Binky Pointer Fun Video. :P

{signature}


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
malloc en free zijn irrelevant hier ('t is geen C). Maar new en delete worden wel gebruikt (C++). Dat lijkt me onverstandig gezien het nivo van de TS.

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


  • The Fox NL
  • Registratie: Oktober 2004
  • Laatst online: 10:15
Verwijderd schreef op dinsdag 23 januari 2007 @ 13:23:
Hallo The Fox NL,

Het antwoord is heel simpel.
De code is als voorbeeld ter beschikking gesteld door desbetreffende docent aan de HZ, zodat ook te gebruiken valt voor tips bij nieuwe projecten.
Ik heb slechts enkele delen van jouw code gebruikt, waaronder jouw TextureManager, die ik erg sterk vond werken, maar zoals je al kunt zien is dit project geen kopie van het jouwe, aangezien jij bijvoorbeeld al geen gebruik maakt van level1.cpp en level1.h. De FE_OK heb ik dus meegenomen aangezien deze ook in de TextureManager zat. De opbouw van het geheel is totaal anders nu...

Hoop dat dit genoeg duidelijk maakt voor jouw The Fox Nl.

Verder....
Doordat ik dus in een nieuw project werk en het daarin anders doe, zit ik wel met een probleem dat het 't niet doet, ik kom er nog steeds niet uit en hoop dat iemand mij daarbij kan helpen, van die VLD teksten begrijp ik helemaal niets namelijk...
Maar dat kan ik natuurlijk niet zien he, dat je niet alles gebruikt. Ik wilde alleen even weten of het hier niet ging om een domweg wat code overkloppen en dan zeggen dat je iets totaal nieuws hebt gemaakt. Gelukkig is dat niet het geval, dus ik wens je veel succes met je spel.

Wat betreft die fout, ik zou even niet weten wat het veroorzaakt.

Hola, ik zie in de code van je tweede post "backpng" staan, moet dat geen "back.png" zijn?

[ Voor 3% gewijzigd door The Fox NL op 23-01-2007 19:57 ]


Verwijderd

Topicstarter
The Fox NL schreef op dinsdag 23 januari 2007 @ 19:54:
[...]

Hola, ik zie in de code van je tweede post "backpng" staan, moet dat geen "back.png" zijn?
Jep, klopt, gelijk ff aangepast, maar lost probleem niet op...


Ik vroeg mij af of iemand weet hoe je anders meerdere PlaneEntity's zou kunnen aanmaken, zonder deze telkens op deze manier te moeten aanmaken:
PlaneEntity * planeEntity;

Ik heb al wat gegoogled, maar kon daar niet direct iets vinden om het anders te doen.
Wellicht kan een andere manier, dan de pointer manier, mijn probleem ook al 'enigzins' kunnen oplossen.

  • The Fox NL
  • Registratie: Oktober 2004
  • Laatst online: 10:15
Mr Rock, ik zie nog een fout in je code.

Jij declareert je Textures tweemaal.
In je methode addPlane doe je
code:
1
Texture * frontTexture = ...
etc. Maar dan maak je die Textures lokaal aan. Jij moet gewoon net als bij de planeEntities
code:
1
 frontTexture = ....
doen. Ik heb trouwens eens mijn eigen code bekeken, en zag daar nog wat fouten in staan. Zo moet Texture::~Texture private zijn, en moet in de releaseMipMapTexture methode het Texture object ge-delete worden. In mijn code deed ik dat niet, en de enige reden dat het daar goed gaat zonder te crashen is omdat ik de textures pas weer vrijgeef aan het einde van mijn programma. Ze worden dan niet meer gebruikt en dat resulteert dus niet in een fout.

De destructor Texture::~Texture moet trouwens helemaal leeg gehaald worden, dus
code:
1
glDeleteTextures(1, &textureId);
moet eruit, want dat wordt dan gedaan in releaseMipMapTexture.

Hoe die fouten erin gekomen zijn weet ik niet, ik gok op tijdgebrek icm het feit dat het bij mij goed ging.
Pagina: 1