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ść
malan
» 2010-09-02 09:33:53
Od kiedy destruktory wywołuje się "ręcznie"?
P-21577
lenrokskate
» 2010-09-02 13:01:25
ten kod w ogóle nadaje się do wywalenia, taki w nim bałagan, że ciężko coś znaleźć
P-21586
Elaine
» 2010-09-02 16:15:55
Od kiedy destruktory wywołuje się "ręcznie"?
Jak się używa placement new, to jawne wywołanie destruktora jest czymś normalnym. W tym konkretnym przypadku jednakże jest to tylko świetny sposób na spowodowanie podwójnej destrukcji.
P-21620
DejaVu
» 2010-09-02 16:24:40
Ja bym rzekł potrójnej, bo aplikacja też pójdzie w kosmos ;d
P-21622
inny1997
Temat założony przez niniejszego użytkownika
» 2010-09-03 20:36:34
poprawiłem  czytelność kody
zrezygnowałem z klas wyświetlanie i gra wyświetlam bitmapy "ręcznie"
C/C++
#include <allegro.h>
#include <iostream>
#include <math.h>

class kolizjie
{
private:
    BITMAP * kula;
    BITMAP * mapa;
public:
    int x;
    int y;
    int x_2;
    int y_2;
    bool czy_kol_gora;
   
    bool czy_kol_lewo;
   
    bool czy_kol_dol;
   
    bool czy_kol_prawo;
   
    void spr_kol();
   
    kolizjie()
    {
        kula = load_bmp( "kula.bmp", default_palette );
        mapa = load_bmp( "mapa.bmp", default_palette );
        x = 100;
        x_2 = 100 + kula->h;
        y = 100;
        y_2 = 100 + kula->w;
        czy_kol_dol = false;
        czy_kol_gora = false;
        czy_kol_lewo = false;
        czy_kol_prawo = false;
       
    }
    ~kolizjie()
    {
        destroy_bitmap( mapa );
        destroy_bitmap( kula );
    }
};
void kolizjie::spr_kol()
{
    if
    ( getpixel( mapa, x_2, y - 1 ) != makecol( 255, 0, 255 ) ||
    getpixel( mapa, x, y - 1 ) != makecol( 255, 0, 255 ) ||
    getpixel( mapa,( x + x_2 ) / 2, y - 1 ) != makecol( 255, 0, 255 ) )
    { czy_kol_gora = true; }
   
    if
    ( getpixel( mapa, x_2 + 1, y ) != makecol( 255, 0, 255 ) ||
    getpixel( mapa, x_2 + 1, y_2 ) != makecol( 255, 0, 255 ) ||
    getpixel( mapa, x_2 + 1,( y_2 + y ) / 2 ) != makecol( 255, 0, 255 ) )
    { czy_kol_prawo = true; }
   
    if
    ( getpixel( mapa, x_2, y_2 - 1 ) != makecol( 255, 0, 255 ) ||
    getpixel( mapa, x, y_2 - 1 ) != makecol( 255, 0, 255 ) ||
    getpixel( mapa,( x + x_2 ) / 2, y_2 - 1 ) != makecol( 255, 0, 255 ) )
    { czy_kol_dol = true; }
   
    if
    ( getpixel( mapa, x - 1, y_2 ) != makecol( 255, 0, 255 ) ||
    getpixel( mapa, x - 1, y ) != makecol( 255, 0, 255 ) ||
    getpixel( mapa, x - 1,( y + y_2 ) / 2 ) != makecol( 255, 0, 255 ) )
    { czy_kol_lewo = true; }
   
}

class sterowanie
{
private:
    kolizjie * kol;
public:
    bool prawo;
    bool lewo;
    bool skok;
    void spr_ste();
   
    sterowanie()
    {
        prawo = false;
        lewo = false;
        skok = false;
        kol = new kolizjie;
    }
   
    ~sterowanie()
    {
        delete kol;
    }
};
void sterowanie::spr_ste()
{
    if( key[ KEY_LEFT ] && !kol->czy_kol_lewo )
    { lewo = true;
        kol->x--;
        kol->x_2--; }
   
    if( key[ KEY_RIGHT ] && !kol->czy_kol_prawo )
    { prawo = true;
        kol->x++;
        kol->x_2++; }
   
    if( key[ KEY_UP ] && kol->czy_kol_dol )
    { skok = true; }
   
}

class grawitacja
{
private:
    float a;
   
    float t0; float t1;
   
    float roznica; float przed;
   
    bool czy_skok;
   
    sterowanie * ster;
    kolizjie * kol;
public:
    float v0; float v1;
   
    void grawituj();
   
    grawitacja()
    {
        a = 10;
        t0 = 0;
        t1 = 0.1;
        roznica = 0;
        przed = 0;
        v0 = 0;
        v1 = 40;
        czy_skok = false;
        ster = new sterowanie;
        kol = new kolizjie;
    }
    ~grawitacja()
    {
        delete ster;
        delete kol;
    }
};

void grawitacja::grawituj()
{
    if( ster->skok )
    { v0 = v1;
        czy_skok = true; }
   
    if( !ster->skok && !czy_skok && !kol->czy_kol_dol )
    { v0 = 0;
        czy_skok = true; }
   
    if( czy_skok )
    {
        roznica =( v0 * t0 -( a *( t0 * t0 ) ) / 2 ) - przed;
        kol->y = kol->y + static_cast < int >( round( roznica ) );
       
        przed =( v0 * t0 -( a *( t0 * t0 ) ) / 2 );
        t0 = t0 + t1;
        if( kol->czy_kol_dol && roznica < 0 )
        {
           
            while( roznica < 0 )
            {
               
                roznica++; kol->y--;
                if( !kol->czy_kol_dol )
                {
                    kol->y++; break;
                }
            }
           
        }
    }
};
volatile long pre = 0;
void inc_pre()
{
    pre++;
}
END_OF_FUNCTION( inc_pre );

LOCK_VARIABLE( pre );
LOCK_FUNCTION( inc_pre );
int main()
{
    sterowanie ste;
    kolizjie koli;
    grawitacja graw;
   
    allegro_init();
    install_timer();
    install_keyboard();
    set_color_depth( 32 );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 );
   
    int t2 = 10;
    install_int_ex( inc_pre, BPS_TO_TIMER( 100 ) );
    BITMAP * ziemia;
    BITMAP * trawa;
    BITMAP * kula;
    BITMAP * tlo;
    BITMAP * bufor;
   
    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 );
   
    while( !key[ KEY_A ] )
    {
        masked_blit( kula, bufor, 0, 0, koli.x, koli.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 );
        blit( bufor, screen, 0, 0, 0, 0, bufor->w, bufor->h );
        koli.spr_kol();
        ste.spr_ste();
        if( pre % t2 < 6 )
        { graw.grawituj(); }
    }
   
    destroy_bitmap( bufor );
    destroy_bitmap( tlo );
    destroy_bitmap( ziemia );
    destroy_bitmap( trawa );
    return 0;
   
    allegro_exit();
};
END_OF_MAIN()

niewiem co jest żle możę ktoś podpowie,bo kombinuje i cały czas po uruchomieniu programu się zawiesza.
P-21677
ison
» 2010-09-03 20:53:08
"niewiem co jest żle możę ktoś podpowie,bo kombinuje i cały czas po urochomieniu programu się zawiesza"
pisze się 'uruchomieniu'

nikt do końca życia kodów ci debugować nie będzie,
próbuj sam dojść do tego co jest źle; stawiaj exit(0); od początku programu jak leci i sprawdzaj w którym momencie dokładnie wywala błąd. Zaraz jeszcze chwilkę popatrzę na twój kod, może coś ci podpowiem więcej :p

p.s. pisze się kolizje a nie kolizjie ;)

//edit błąd tkwi w tym że wywołujesz konstruktory w których wczytujesz bitmapy zanim zainicjalizujesz allegro
gdy tak wygląda początek:
C/C++
allegro_init();
install_timer();
install_keyboard();
set_color_depth( 32 );
set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 );

sterowanie ste;
kolizjie koli;
grawitacja graw;
to aplikacja nie wywala błędu
P-21678
inny1997
Temat założony przez niniejszego użytkownika
» 2010-09-03 21:07:13
niestety  nadal nie działa poprzednio nie wyświetlał nawe okna ,a teraz wyświetal okno i nie działa (zawiesza się).
P-21680
ison
» 2010-09-03 21:08:26
nie mam pojęcia, u mnie działa dobrze (to znaczy nie wywala błędu żadnego)...
kompilujesz i mówisz że tuż po tym wywala błąd tak?

//edit windows czy linux?
dziwne szczerze mówiąc że u ciebie wywala błąd a u mnie nie ;p
P-21681
1 2 « 3 » 4 5 6
Poprzednia strona Strona 3 z 6 Następna strona