Virpi Temat założony przez niniejszego użytkownika |
Undefined reference to... program obiektowy z wykorzystaniem allegro. » 2012-04-21 14:31:52 Witam, mam problem ze skompilowaniem swojego projektu. Ma to być obiektowe akwarium. Dlatego też każdy element gry będzie inną klasą. Później mam zamiar umieścić wszystkie obiekty w jednym kontenerze i przechodząc po nich jakimś wskaźniekiem wyświetlać je na wspólnym buforze, a później bufor ten na screenie. Jednak po przerobieniu programu na obiektowy pojawia się problem, mianowicie otrzymuję błąd "Undefined reference to'bufor'"w funkcji void CSlimak::rysuj() w kazdej linijce, gdzie mam odniesienie do bufora. Możecie mi podpowiedzieć, jak mam poradzić sobie z tym błędem?
#include "CAllegro.h" #include "CSlimak.h"
int main() { CAllegro wyswietlanie; CSlimak slimak1; BITMAP * bufor = NULL; bufor = create_bitmap( 800, 600 ); while( !key[ KEY_ESC ] ) { slimak1.przesun(); slimak1.rysuj(); } wyswietlanie.deinit(); return 0; } END_OF_MAIN()
#ifndef CALLEGRO_H #define CALLEGRO_H
#include <allegro.h> #include "CSlimak.h"
class CAllegro { public: CAllegro(); virtual ~CAllegro(); BITMAP * bufor; void init(); void deinit(); void wyswietl(); protected: private: };
#endif
#include "CAllegro.h"
CAllegro::CAllegro() { bufor = NULL; allegro_init(); set_color_depth( 32 ); set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 ); bufor = create_bitmap( 800, 600 ); install_timer(); install_keyboard(); install_mouse(); }
CAllegro::~CAllegro() { }
void CAllegro::init() { }
void CAllegro::deinit() { clear_keybuf(); allegro_exit(); }
#ifndef CSLIMAK_H #define CSLIMAK_H
#include "CAllegro.h"
extern BITMAP * bufor;
class CSlimak { public: CSlimak(); virtual ~CSlimak(); void przesun(); void rysuj(); int * a; int * b; protected: private: int wsp_x, wsp_y, predkosc; BITMAP * slimak; BITMAP * slimak2; };
#endif
#include "CSlimak.h"
CSlimak::CSlimak() { wsp_x = 200; wsp_y = 200; predkosc = 1; slimak = load_bmp( "slimak.bmp", default_palette ); slimak2 = load_bmp( "slimak2.bmp", default_palette ); }
CSlimak::~CSlimak() { }
void CSlimak::przesun() { if( key[ KEY_RIGHT ] ) { wsp_x += predkosc; } else if( key[ KEY_LEFT ] ) { wsp_x -= predkosc; } if( key[ KEY_DOWN ] ) { wsp_y += predkosc; } else if( key[ KEY_UP ] ) { wsp_y -= predkosc; } }
void CSlimak::rysuj() { BITMAP * ostatni = NULL; a = & wsp_x; b = & wsp_y; clear_to_color( bufor, makecol( 150, 150, 150 ) ); if( key[ KEY_RIGHT ] ) { masked_blit( slimak2, bufor, 0, 0, * a, * b, slimak2->w, slimak2->h ); ostatni = slimak2; } else { if( key[ KEY_LEFT ] ) { masked_blit( slimak, bufor, 0, 0, * a, * b, slimak->w, slimak->h ); ostatni = slimak; } else masked_blit( ostatni, bufor, 0, 0, * a, * b, ostatni->w, ostatni->h ); } blit( bufor, screen, 0, 0, 0, 0, 800, 600 ); }
|
|
DejaVu |
» 2012-04-21 14:36:36
To przez tą linijkę :) Szczerze mówiąc to masz duży chaos w tym kodzie. W jednym miejscu tworzysz zmienną lokalną 'bufor', w innym miejscu tworzysz zmienną w klasie o nazwie 'bufor' i jeszcze w innym miejscu masz zadeklarowaną informację, że gdzieś w globalnej przestrzeni nazw istnieje zmienna 'bufor' (a, że jej nie ma to dostajesz wspomniany przez siebie błąd).
PS. Jak chcesz pisać obiektowo i wiesz co to obiektowość to użyj biblioteki SFML, a nie Allegro 4.4 bo i tak milion razy gorsze będzie rozwiązanie oparte o Allegro 4.4 w porównaniu do SFML :) |
|
Virpi Temat założony przez niniejszego użytkownika |
» 2012-04-21 14:42:43 Tak, przepraszam :) w mainie to pozostałość po próbach poprawy tego błędu. W takim razie jak mogę odwołać się dobrze do bufora? |
|
DejaVu |
» 2012-04-21 14:48:48 No musisz go utworzyć :P 'extern' informuje kompilator, że 'gdzieś ta zmienna jest zadeklarowana' co umożliwia skompilowanie kodu. Linker jednak później chce dostać faktycznie zmienną, a nie samą obietnicę i stwierdza, że 'eee nie istnieje taka zmienna! bujaj się!'. |
|
Virpi Temat założony przez niniejszego użytkownika |
» 2012-04-21 14:56:34 Dobrze :) ale bufor jest utworzony w klasie CAllegro i do niego chciałbym się odwołać, ponieważ ma być on wspólny dla wszystkich elementów, bo później powinienem mieć kilka elementów różnych klas, jakieś rybki itp. i każdy z tych obiektów powinienem narysować na tym właśnie buforze i wyświetlić go na ekranie. I w tym cały problem :) nie wiem, co zrobić, żeby kompilator wiedział, że chodzi mi o ten bufor w klasie CAllegro.
A i bardzo chętnie poczytam o bibliotece SFML :) |
|
DejaVu |
» 2012-04-21 14:58:57 Jak organizować kod obiektowo != undefined reference. Jeden temat = jeden problem :) |
|
« 1 » |