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

znowu błąd segmentecji

Ostatnio zmodyfikowano 2010-09-08 14:04
Autor Wiadomość
inny1997
Temat założony przez niniejszego użytkownika
znowu błąd segmentecji
» 2010-09-01 14:40:42
napisałem gre testową, która ma sprawdzić moje rozwiązania związane z grawitacjią , kolizjiami oraz sterowanie całość zorientowana obiektowo

oto kod
C/C++
#include<iostream>
#include<allegro.h>
#include<math.h>

class gra
{ public:
    gra()
    {
        allegro_init();
        install_timer();
        install_keyboard();
        set_color_depth( 16 );
        set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 );
    };
    ~gra()
    {
        allegro_exit();
    }
   
};





//kolizje,kolizje,kolizje,kolizje,kolizje,kolizje,kolizje,kolizje,
class kolizje
{
   
public:
    int prawo_x_ob;
    int dol_y_ob;
    int x;
    int y;
    BITMAP * mapa;
    BITMAP * kula;
    kolizje() { mapa = load_bmp( "mapa.bmp", default_palette );
        kula = load_bmp( "kula.bmp", default_palette );
        x = 100;
        y = 100;
        prawo_x_ob = kula->w + x;
        dol_y_ob = kula->h + y; }
    ~kolizje() { destroy_bitmap( mapa );
        destroy_bitmap( kula ); }
   
    int spr_kolizji_gora();
    int spr_kolizji_prawo();
    int spr_kolizji_dol();
    int spr_kolizji_lewo();
};


//kolizje,kolizje,kloizje,kolizje,kolizje,kolizje,kolizje
//góra,góra,góra,góra,góra,góra,góra,góra,góra,góra,         

int kolizje::spr_kolizji_gora()
{
    if( getpixel( mapa, prawo_x_ob, y ) != makecol( 255, 0, 255 ) ||
    getpixel( mapa, x, y ) != makecol( 255, 0, 255 ) ||
    getpixel( mapa,( x + prawo_x_ob ) / 2, y ) != makecol( 255, 0, 255 ) )
    { return( true ); }
    else
    { return( false ); }
};
//prawo,prawo, prawo, prawo, prawo, prawo, prawo, prawo,                 

int kolizje::spr_kolizji_prawo()
{
    if( getpixel( mapa, prawo_x_ob, y ) != makecol( 255, 0, 255 ) ||
    getpixel( mapa, prawo_x_ob, dol_y_ob ) != makecol( 255, 0, 255 ) ||
    getpixel( mapa, prawo_x_ob,( dol_y_ob + y ) / 2 ) != makecol( 255, 0, 255 ) )
    { return( true ); }
    else
    { return( false ); }
};

//dół,dół,dół,dół,dół,dół,dół,dół,dół,dół,dół,dół,dół,dół,dół,

int kolizje::spr_kolizji_dol()
{
    if( getpixel( mapa, prawo_x_ob, dol_y_ob ) != makecol( 255, 0, 255 ) ||
    getpixel( mapa, x, dol_y_ob ) != makecol( 255, 0, 255 ) ||
    getpixel( mapa,( x + prawo_x_ob ) / 2, dol_y_ob ) != makecol( 255, 0, 255 ) )
    { return( true ); }
    else
    { return( false ); }
};
//lewo,lewo,lewo,lewo,lewo,lewo,lewo,lewo,lewo,lewo,lewo,lewo,

int kolizje::spr_kolizji_lewo()
{
    if( getpixel( mapa, x, dol_y_ob ) != makecol( 255, 0, 255 ) ||
    getpixel( mapa, x, y ) != makecol( 255, 0, 255 ) ||
    getpixel( mapa, x,( y + dol_y_ob ) / 2 ) != makecol( 255, 0, 255 ) )
    { return( true ); }
    else
    { return( false ); }
}


//wyświetlanie,wyświetlanie,wyświetlanie,wyświetlanie,wyświetlanie,
class wyswietlanie
{
   
public:
    kolizje * kol_wys;
    BITMAP * kula;
    BITMAP * bufor;
    BITMAP * tlo;
    BITMAP * ziemia;
    BITMAP * trawa;
    wyswietlanie()
    {
        kol_wys = new kolizje;
        ziemia = load_bmp( "ziemia.bmp", default_palette );
        trawa = load_bmp( "trawa.bmp", default_palette );
        kula = load_bmp( "kula.bmp", default_palette );
        tlo = load_bmp( "tlo.bmp", default_palette );
        bufor = create_bitmap( 800, 600 );
    }
    ~wyswietlanie() { destroy_bitmap( kula );
        destroy_bitmap( bufor );
        destroy_bitmap( tlo );
        destroy_bitmap( ziemia );
        destroy_bitmap( trawa );
        delete kol_wys; }
    void wyswietl();
   
};
//wyświetlanie,wyświetlanie,wyświetlanie,wyświetlanie,wyświetlanie,

void wyswietlanie::wyswietl() {
    masked_blit( kula, bufor, 0, 0, kol_wys->x, kol_wys->y, kula->h, kula->w );
    blit( tlo, bufor, 0, 0, 0, 0, tlo->h, tlo->w );
    blit( ziemia, bufor, 0, 0, 600 -( ziemia->h ), 0, ziemia->h, ziemia->w );
    blit( trawa, bufor, 0, 0, 600 -( ziemia->h + trawa->h ), 0, ziemia->h, trawa->w );
};

//sterowani,sterowani,sterowani,sterowani,sterowani,sterowani,sterowani,
class sterowanie
{
public:
    kolizje * kol_ste;
    bool lewo();
    bool prawo();
    bool skok();
    sterowanie() { kol_ste = new kolizje; };
   
    ~sterowanie() { delete kol_ste; };
};
//sterowanie,sterowanie,sterowanie,sterowanie,sterowanie,sterowanie                   
bool sterowanie::lewo()
{ if( key[ KEY_LEFT ] &&!kol_ste->spr_kolizji_lewo() )
    { kol_ste->x--; return( true ); }
    else
    { return( false ); }
};

bool sterowanie::prawo()
{ if( key[ KEY_RIGHT ] &&!kol_ste->spr_kolizji_prawo() )
    { kol_ste->x++; return( true ); }
    else
    { return( false ); }
};

bool sterowanie::skok()
{ if( key[ KEY_UP ] && kol_ste->spr_kolizji_dol() )
    { return true; }
    else
    { return false; }
};

//grawitacja,grawitacja,grawitacja,grawitacja,grawitacja,grawitacja,grawitacja,
class grawitacja
{
private:
    kolizje * wyk_kol;
    sterowanie * ster;
    float t0;
    float t1;
    float v1;
    float v0;
    float a;
    float b;
    float n;
public:
    grawitacja() { wyk_kol = new kolizje;
        ster = new sterowanie;
        t0 = 0;
        t1 = 0, 1;
        v1 = 40;
        v0 = 0;
        a = 10;
        b = 0;
        n = 0; }
    ~grawitacja() { delete ster;
        delete wyk_kol; }
    int graw();
};
//grawitacja,grawitacja,grawitacja,grawitacja,grawitacja,grawitacja,        

int grawitacja::graw()
{
    if( ster->skok() )
    { v0 = v1; }
    else
    { v0 = 0; }
   
    n =( v0 * t0 -( a *( t0 * t0 ) ) / 2 ) - b;
    wyk_kol->y = wyk_kol->y +( static_cast < int >( round( n ) ) );
    b = v0 * t0 -( a *( t0 * t0 ) ) / 2;
    t0 = t0 + t1;
   
    if( wyk_kol->spr_kolizji_dol() && n < 0 )
    {
        while( n < 0 )
        {
            n++; wyk_kol->y--;
            if( !wyk_kol->spr_kolizji_dol() )
            {
                wyk_kol->y++; n = 0;
            }
        }
    }
};
volatile long pre = 0;
void inc_pre()
{
    pre++;
}
END_OF_FUNCTION( inc_pre );

LOCK_VARIABLE( pre );
LOCK_FUNCTION( inc_pre );


int main()
{
    gra game;
    grawitacja ruch;
    kolizje mapa1;
    sterowanie klawisze;
    wyswietlanie obraz;
   
    int t2 = 10;
    install_int_ex( inc_pre, BPS_TO_TIMER( 100 ) );
    while( key[ KEY_A ] )
    {
        obraz.wyswietl();
        mapa1.spr_kolizji_dol();
        mapa1.spr_kolizji_gora();
        mapa1.spr_kolizji_lewo();
        mapa1.spr_kolizji_prawo();
        klawisze.lewo();
        klawisze.prawo();
        klawisze.skok();
        if( pre % t2 < 6 )
        { ruch.graw(); }
    }
   
    ruch.~grawitacja();
    mapa1.~kolizje();
    klawisze.~sterowanie();
    obraz.~wyswietlanie();
    game.~gra();
   
   
    remove_int( inc_pre );
    return 0;
   
}
END_OF_MAIN()

niestety kod się kompiluje, ale nie chce działać i dowiedziałem się że jest błąd sgmentacji
P-21476
ison
» 2010-09-01 15:11:48
to tak:
po pierwsze w tej linijce:
C/C++
while( key[ KEY_A ] )
powinno być raczej while(!key[KEY_A])
chyba że chcesz aby program działał tylko gdy będziesz trzymał A ;p

2)
nie znam przyczyny tego zajścia ale gdy zakończy się funkcja main bądź wywołasz return 0; to wywala błąd. U mnie zastąpienie return'a przez exit(0); podziałało ;p

3)
nigdzie nie blitujesz buforu na ekran

Nie wiem co ma ten program zbytnio robić więc dalej ci nie pomogę, może komuś będzie się chciało analizować cały kod. Jeśli chcesz to skieruj się bezpośrednio z jakimś problemem bo tak to mi ciężko wyłapać wszystkie błędy w kodzie
P-21477
pekfos
» 2010-09-01 15:27:15
C/C++
grawitacja() { wyk_kol = new kolizje;
    ster = new sterowanie;
    t0 = 0;
    t1 = 0, 1; //kropka, nie przecinek!!
    v1 = 40;
    v0 = 0;
    a = 10;
    b = 0;
    n = 0; }
//edit: sprawdzaj czy się bitmapy dobrze wczytują.
P-21479
inny1997
Temat założony przez niniejszego użytkownika
» 2010-09-01 15:29:04
ten program jest wersją testową.
jego celem jest:
-wyświetlić podłoże,tło,trawe podłoże,kuli(sterujemy nim)
-wykryć kolizjie we wszystkich czterech kierunkach
-wykrywać czy jest wciśnięty jakiś klawisz i czy jest możliwość ruchu(prawo,lewo)albo skoku
-zmieniać pozycje kuli zgodnie z grawitacją w przypadku skoku (posłużyłem się   wzorem z wikipedi) wartość reprezentująca zmiane przedstawia wartość n (wartość n może być ujemna w przypadku spadania)

bitmapy dobrze się wczytują sprawdziłem. program nadal nie działa.
P-21480
ison
» 2010-09-01 15:40:02
po poprawieniu wyżej wymienionych błędów aplikacja działa... działa pod tym względem że wyświetla bitmapy, dalej już możesz sobie sam zdebugować kod co jest nie tak przy wykrywaniu kolizji, ruchu kulki etc.

kod jest mało czytelny więc całego programu ci nie poprawie

p.s. zamiast static_cast<int> możesz zwyczajnie napisać (int)
P-21484
lenrokskate
» 2010-09-01 15:43:57
static_cast<int> możesz zwyczajnie napisać (int)
w C++ powinno się używać zapisu static_cast ponieważ rzutowanie tzw. "obleśne" (czyli przez nawias) pochodzi z języka C i jest przestarzałe

zrodlo
P-21486
inny1997
Temat założony przez niniejszego użytkownika
» 2010-09-01 15:51:36
u mnie nie działa. w programie wstawiłem kropke  wprowadziłem kopiowanie bufora na ekran i zmieniłem
while(key[KEY_A])
na
while(!key[KEY_A])
i program nadal nie działa.
P-21488
pekfos
» 2010-09-01 15:54:15
popraw
if( cos ) { costam(); }
na
if( cos ) costam();
to łatwiej będzie to czytać.

//edit: i nie wywołuj jawnie destruktorów! same się wywołają.
P-21490
« 1 » 2 3 4 5 6
  Strona 1 z 6 Następna strona