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ść
ison
» 2010-09-05 11:46:02
wiesz... na prawdę ciężko będzie ci mówić wszędzie gdzie masz błąd bo jest ich mnóstwo. Radziłbym powtórzyć sobie wiadomości o wskaźnikach bo są źle użyte w twoim programie.
poprzez new tworzony jest nowy obiekt, zatem w obiekcie ste klasy sterowanie w konstruktorze wskaźnik wskazuje na nowo utworzony obiekt kol klasy kolizjie (pomijając fakt że pisze się 'kolizje'). Zauważ że w funkcji main() również tworzysz obiekt klasy kolizjie o nazwie koli. Masz zatem 2 obiekty a nie 1. W funkcji sterującej modyfikujesz obiekt kol a w funkcji main() wyświetlasz kulę na pozycji obiektu koli.
P-21752
inny1997
Temat założony przez niniejszego użytkownika
» 2010-09-06 20:01:44
powtórzyłem wiadomości o wskaźnikach i wymyśliłem inną forme przekazywania danych między
obiektami .opiera się ona na  podawaniu konstruktorowi pól obiektu z którym
się komunikuje z tym obiektem i znaleziu adresu tego pola. dzięki temu mogę w obiekcie wytworzyć wskaźnikna dane pole .
 
mam związku z tym pytanie jak zadeklarować niedomyślny konstruktor(taki w ,którym można wprowadzić jakieś dane). wymyśliłem własną wersje rozwiązanie tego problemu ,ale napewno jest niepoprawna ,a poza tym nie działa.

oto udoskonalony kod
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:
    bool * kol_dol;
    bool * kol_lewo;
    bool * kol_prawo;
    int * x;
    int * x_2;
public:
    bool prawo;
    bool lewo;
    bool skok;
    void spr_ste();
    sterowanie()
    {
    };
   
    void ste_konst( bool a, bool b, bool c, int d, int e )
    {
        prawo = false;
        lewo = false;
        skok = false;
        kol_dol = & a;
        kol_lewo = & b;
        kol_prawo = & c;
        x = & d;
        x_2 = & e;
    }
   
    ~sterowanie()
    {
    }
};
void sterowanie::spr_ste()
{
    if( key[ KEY_LEFT ] && !* kol_lewo )
    { lewo = true;
        * x--;
        * x_2--; }
   
    if( key[ KEY_RIGHT ] && !* kol_prawo )
    { prawo = true;
        * x++;
        * x_2++; }
   
    if( key[ KEY_UP ] && * kol_dol )
    { skok = true; }
   
}

class grawitacja
{
private:
    float a;
   
    float t0; float t1;
   
    float roznica; float przed;
   
    bool czy_skok;
   
    bool * skok;
    bool * kol_dol;
    int * y;
    int * y_2;
public:
    float v0; float v1;
   
    void grawituj();
    grawitacja()
    {
    };
   
    void grawitacja_konst( bool a_s, bool b_kd, int c_y, int d_y_2 )
    {
        a = 10;
        t0 = 0;
        t1 = 0.1;
        roznica = 0;
        przed = 0;
        v0 = 0;
        v1 = 40;
        czy_skok = false;
        skok = & a_s;
        kol_dol = & b_kd;
        y = & c_y;
        y_2 = & d_y_2;
    }
    ~grawitacja()
    {
    }
};

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

LOCK_VARIABLE( pre );
LOCK_FUNCTION( inc_pre );
int main()
{
   
   
    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 );
    kolizjie koli;
    sterowanie ste;
    grawitacja graw;
    ste.ste_konst( koli.czy_kol_dol, koli.czy_kol_lewo, koli.czy_kol_prawo, koli.x, koli.x_2 );
    graw.grawitacja_konst( ste.skok, koli.czy_kol_dol, koli.y, koli.y_2 );
   
    while( !key[ KEY_A ] )
    {
       
        blit( tlo, bufor, 0, 0, 0, 0, tlo->w, tlo->h );
        blit( ziemia, bufor, 0, 0, 0, 600 -( ziemia->h ), ziemia->w, ziemia->h );
        masked_blit( trawa, bufor, 0, 0, 0, 600 -( ziemia->h + trawa->h ), ziemia->w, trawa->h );
        masked_blit( kula, bufor, 0, 0, koli.x, koli.y, kula->w, kula->h );
        blit( bufor, screen, 0, 0, 0, 0, bufor->w, bufor->h );
        ste.spr_ste();
        koli.spr_kol();
        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()
 
P-21804
ison
» 2010-09-06 20:09:26
tamto rozwiązanie było prawie dobre, wystarczyło wyrzucić drugi obiekt bo niepotrzebnie deklarowałeś 2

"mam związku z tym pytanie jak zadeklarować niedomyślny konstruktor(taki w ,którym można wprowadzić jakieś dane)."
konstruktory możesz przeciążać
C/C++
class Foo
{
    Foo() { }
    Foo( int a ) { }
    Foo( int a, int b ) { }
    Foo( double a ) { }
    ~Foo() { }
};
P-21805
inny1997
Temat założony przez niniejszego użytkownika
» 2010-09-06 20:28:22
jak wywołuje się przeciążony konstruktor ?
uważam, żę moje poprzednie rozwiązanie jest błędne ,ponieważ tworząc obiekty 
za pomocą new
nie umożliwiało poprawnej komunikacj między obiektowej.
(pokazuje to wykres)
1-kolizjie
2-sterowanie
3-grawitacjia
błędna,poniważ przy tworzeniu obiektu 3 tworzy się coś takiego. obiekt 2 i 3 działają
na różne obiekty ,a powinny na tylko jeden ten sam obiekt.

w obiekcie 2 tworzony jest znowu 1
///////////////////////////////////  |
wytworzenie nowych obiektów 1 2
////////////////////////////////// |/ 
//////////////////////////////////  3
poprawna komunikacjia
1------2
 \    /
  \  /
   \/
   3


P-21806
waxx
» 2010-09-06 20:38:29
Foo foo();
Foo foo(2);
Foo foo(2, 4);

?
P-21807
inny1997
Temat założony przez niniejszego użytkownika
» 2010-09-06 20:59:20
nie wiem cały czas działe nie poprawnie. zmieniłem kod minimalnie deklarując obiekt używając konstruktora (z wprowodzaniem wartości ) . niewiem już co jest źle prypuszcza , że ta komunikacjia, ale do końca nie jestem pewny . pokombinuje jesze troche  i chyba zostawie niedokończony program . ja akurat nie widze żadnego błędu.
P-21808
ison
» 2010-09-06 22:13:21
"uważam, żę moje poprzednie rozwiązanie jest błędne ,ponieważ tworząc obiekty za pomocą new nie umożliwiało poprawnej komunikacj między obiektowej"
nie wiem o jakiej ty znowu komunikacji mówisz ;D wszystko było dobrze, jeśli w klasie tworzysz wskaźnik na inny obiekt to komunikacja jest dobra ;D
zazwyczaj jeśli się coś kompiluje to "komunikacja" (jak ty to nazywasz) musi być "dobra"...

przykład:
klasa Foo, w niej tworzysz wskaźnik na nowy obiekt klasy Bar
C/C++
class Bar
{
public:
    int a;
};

class Foo
{
public:
    Bar * MyBar;
    Foo()
    {
        MyBar = new Bar;
    }
    ~Foo();
} MyFoo;
teraz gdy chcesz się odwołać do zmiennej a piszesz:
C/C++
MyFoo.MyBar->a;

wtedy zwyczajnie miałeś 2 obiekty (jeden przez new, jeden zwykły) i ci się mieszały
jak chcesz i znajdę trochę wolnego czasu to mogę ci całkowicie przebudować twój kod tak żeby działał i go sobie przeanalizujesz
P-21810
inny1997
Temat założony przez niniejszego użytkownika
» 2010-09-07 12:12:42
tworząc przez new  jest tworzony wskaźnik na powstały obiekt który jest tworzony podczas tworzenia obiektu . w poprzednim rozwiązaniu tworzyły się dwa wkaźniki na  dwa obiekty (obiekt_a i obiekt_b)wytworzone przez new ,a jeden obiekt(obiekt_a) znowu tworzył sobie kolejny obiekt(obiekt_b) i wskaźnik na niego . powinno być tak :

konstruktor 1_obiekt,konstruktor 2_obiekt,połączenie 2_obiekt z 1_obiekt,
konstruktor 3_obiekt,połączenie 3_obiekt z 2_obiekt
oraz 3_obiekt z 2_obiekt

jest mała różnica między tymi dwoma rozwiązaniami .

w moim programie jest jakby złożona komunikacja.
P-21815
1 2 3 4 « 5 » 6
Poprzednia strona Strona 5 z 6 Następna strona