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

Undefined reference to... program obiektowy z wykorzystaniem allegro.

Ostatnio zmodyfikowano 2012-04-21 14:58
Autor Wiadomość
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? 

C/C++
#include "CAllegro.h"
#include "CSlimak.h"



int main()
{
    CAllegro wyswietlanie;
    //wyswietlanie.init();
    CSlimak slimak1;
    BITMAP * bufor = NULL;
    bufor = create_bitmap( 800, 600 );
   
    while( !key[ KEY_ESC ] )
    {
        /* put your code here */
        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 // CALLEGRO_H



#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(); //ctor
}

CAllegro::~CAllegro()
{
    //dtor
}

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 // CSLIMAK_H



#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()
{
    //dtor
}

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 );
   
}
P-54965
DejaVu
» 2012-04-21 14:36:36
C/C++
extern BITMAP * bufor;
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 :)
P-54966
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?
P-54968
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ę!'.
P-54969
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 :)
P-54970
DejaVu
» 2012-04-21 14:58:57
Jak organizować kod obiektowo != undefined reference. Jeden temat = jeden problem :)
P-54971
« 1 »
  Strona 1 z 1