Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Program się wyłącza po kompilacji i wyskakuje błąd

Ostatnio zmodyfikowano 2014-05-23 22:28
Autor Wiadomość
Geniusz
Temat założony przez niniejszego użytkownika
Program się wyłącza po kompilacji i wyskakuje błąd
» 2014-05-22 14:09:13
Uczę się biblioteki irrlicht i przy okazji piszę prosty program, jednak napotkałem pewien problem i nie umiem sobie z nim poradzić.

Poniżej ważniejsze miejsca mojego programu.

postac.h
C/C++
#ifndef POSTAC_H
#define POSTAC_H

#include <irrlicht.h>

using namespace irr;

using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;

class postac
{
public:
    //KONSTRUKTOR DESTRUKTOR
    postac();
    virtual ~postac();
   
    //GLOWNA FUNKCJA
    virtual void wykonaj_akcje() = 0;
   
    //DANE
    IrrlichtDevice * device;
    IVideoDriver * driver;
    ISceneManager * smgr;
    IGUIEnvironment * guienv;
    IAnimatedMesh * mesh;
    IAnimatedMeshSceneNode * node;
    ICameraSceneNode * camera;
   
    vector3df nodePosition;
    vector3df nodeRotation;
    vector3df cameraRotation;
    vector3df cameraTarget;
    vector3df cameraPosition;
   
    //plik sklada sie jeszcze z kilku zmiennych i funkcji, ale mysle, ze nie sa one teraz istotne.
};

#endif // POSTAC_H

czlowiek.h
C/C++
#ifndef CZLOWIEK_H
#define CZLOWIEK_H

#include "postac.h"
#include "MyEventReceiver.h"

class czlowiek
    : public postac
{
public:
    //KONSTRUKTOR DESTRUKTOR
    czlowiek( MyEventReceiver * Receiver = 0, IrrlichtDevice * Device = 0, int ID = 0, const path & sciezka_do_pliku = "",
    const path & sciezka_do_tekstury = "", vector3df pozycja = vector3df( 0, 0, 0 ), unsigned int Zycie = 100, unsigned int Zrecznosc = 10 );
    virtual ~czlowiek();
   
    //GLOWNA FUNKCJA
    void wykonaj_akcje();
   
    //DANE
    MyEventReceiver * receiver;
    position2d < s32 > LastMousePosition;
    position2d < s32 > NowMousePosition;
   
    //plik sklada sie jeszcze z kilku zmiennych i funkcji, ale mysle, ze nie sa one teraz istotne.
    //konstruktor znajduje sie w pliku czlowiek.cpp
};

#endif // CZLOWIEK_H

main.cpp
C/C++
#include "irrlicht.h"

using namespace irr;

using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;

#include "MyEventReceiver.h"
#include "czlowiek.h"

int main( int argc, char ** argv )
{
    MyEventReceiver receiver;
   
    IrrlichtDevice * device =
    createDevice( EDT_SOFTWARE, dimension2d < u32 >( 640, 480 ), 16,
    false, false, false, & receiver );
   
    IVideoDriver * driver = device->getVideoDriver();
    ISceneManager * smgr = device->getSceneManager();
    IGUIEnvironment * guienv = device->getGUIEnvironment();
   
    //glownie chodzi o ponizszy fragment kodu       
    postac * wsk;
   
    {
        //po usunieciu "{" i "}", program dziala jak nalezy, jednak w moim programie bedzie wymagana
        //podobna sytuacja tzn. nie bedzie sie mozna odniesc bezposrednio do obiektu typu czlowiek bez wskaznika
        czlowiek clwk( & receiver, device, 1, "../../media/sydney.md2", "../../media/sydney.bmp" );
        wsk = & clwk;
    }
   
    while( device->run() )
    {
        wsk->wykonaj_akcje();
       
        driver->beginScene( true, true, SColor( 0, 200, 200, 200 ) );
       
        smgr->drawAll();
        guienv->drawAll();
       
        driver->endScene();
    }
   
    device->drop();
   
    return 0;
}

Program się kompiluje, jednak od razu się wyłącza, a w logu kompilacji pojawia się coś takiego :
 

Irrlicht Engine version 1.8.1
Microsoft Windows XP Professional Dodatek Service Pack 3 (Build 2600)
Resizing window (640 480)
Loaded mesh: ../../media/sydney.md2
Loaded texture: C:/Documents and Settings/Admin/Pulpit/Irrlicht/irrlicht-1.8.1/m
edia/sydney.bmp
pure virtual method called
terminate called without an active exception

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

Process returned 3 (0x3)   execution time : 0.125 s
Press any key to continue.

I moje pytanie - dlaczego wyskakuje ten błąd i co robię źle ?
P-110642
kubawal
» 2014-05-22 14:16:20
Nie możesz używać wskaźnika do zmiennej w innym zakresie. Alokuj go dynamicznie (new)

/edit: Swoją drogą, dziwne że taki błąd wyskakuje. W takich przypadkach zazwyczaj wyrzuca SEGFAULT albo Acess violation reading location...
P-110644
Monika90
» 2014-05-22 14:17:33
C/C++
wsk = & clwk;
} //klmara zamykająca niszczy obiekt klasy czlowiek

//tutaj wskaznik wsk jest już nieważny - odnosi się do zniszczonego obiektu


/edit: Swoją drogą, dziwne że taki błąd wyskakuje. W takich przypadkach zazwyczaj wyrzuca SEGFAULT albo Acess violation reading location...
Destruktor klasy czlowiek ustawia vptr na vtable klasy podstawowej
P-110645
Geniusz
Temat założony przez niniejszego użytkownika
» 2014-05-23 22:28:01
Dziękuję za pomoc. Wszystko działa jak należy.
P-110758
« 1 »
  Strona 1 z 1