Autor Wątek: Niespodziewany problem z konstruktorem klasy  (Przeczytany 1929 razy)

Offline b621

  • Użytkownik

# Sierpień 17, 2013, 02:54:47
Witam brać warsztatową, klepiąc kolejne linijki kodu napotkałem dość nieoczekiwany błąd o treści podanej niżej.

Unhandled exception at 0x5B616266 (allegro-5.0.8-monolith-md-debug.dll) in BrickGames.exe: 0xC0000005: Access violation reading location 0x00000000.

Do kodu następującej treści.

struct Menu
{
Menu();

int Main();

ALLEGRO_BITMAP* animation;

int tick;
int frame;
int option;

bool menu;
bool redraw;

string path;
private:

ALLEGRO_TIMER* mTimer;
ALLEGRO_EVENT_QUEUE* meq;

};

Menu::Menu(){
Menu::meq = al_create_event_queue();
Menu::mTimer = al_create_timer(1.0/APM);
...}

Błąd dotyczy linijki z definiowaniem kolejki wydarzeń (event queue) i timera.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Xender

  • Użytkownik

# Sierpień 17, 2013, 04:08:30
Access violation reading location 0x00000000.
Bardzo charakterystyczny adres - widzisz access violation ("segfaulta") na 0 (albo w bliskich okolicach 0 - offsety w wypadku dostępu do pól) = masz odwołanie do nullptr.

W takich sytuacjach bardzo przydaje się callstack (podgląd stosu wywołań) - nie wygląda aby ten segfault został rzucony z twojego kodu (nie robiłeś placement new na nullptr, prawda? :P), więc raczej poleciał z funkcji bibliotecznej. Tu pytanie: zainicjalizowałeś bibliotekę przed użyciem, jak dokumentacja i tutoriale nakazują?
« Ostatnia zmiana: Sierpień 17, 2013, 04:10:11 wysłana przez Xender »

Offline b621

  • Użytkownik

# Sierpień 17, 2013, 04:20:15
Tak wszystko zostało zapisane według praw boskich, allegro śmiga do momentu próby użycia konstruktora.

Offline b621

  • Użytkownik

  • +3
# Sierpień 17, 2013, 08:42:39
Wiem, że jedno pod drugim, ale internet mobilny o skróconej przepustowości to czyste zło i po missclicku nie chciałem ryzykować 30 minut walki o ponowne połączenie z forum.

Programowanie kilka pięknych godzin pod rząd jako lek na zmęczenie po koncercie nie było dobrym pomysłem, jednak szybki prysznic mocna kawa pozwoliły mi przejrzeć na oczy i ujrzeć poczwarę, która to chyłkiem zakradła się do mego kodu. Próba konstruowania (proszę o uświadomienie jak w języku dużych, mądrych ludzi się to mówi) klasy bez uprzedniego zainicjowania Allegro nie było dobrym pomysłem. Biję się w pierś przyznając, że boskie prawa zostały nie dotrzymane, nie mówiąc nawet o dokumentacyjnych (słowotwórstwo się mnie trzyma... chyba :P).

Szybkie przemieszczenie deklaracji (znowu proszę o pouczenie co do nazewnictwa) klasy za magiczną funkcję AllegroInit pomogło niczym od dotknięcia czarodziejskiej różdżki.

Pozdrawaim cgb621

Offline Xender

  • Użytkownik

  • +1
# Sierpień 17, 2013, 13:30:26
@up - Jeśli chodzi o nazewnictwo, to konstruuje się obiekt, czyli instancję klasy, a nie samą klasę. Poza tym ok. ;)