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

Problem z if(){} // niewiadomo czemu automatycznie wysiada program

Ostatnio zmodyfikowano 2011-05-02 21:39
Autor Wiadomość
Bartekko
Temat założony przez niniejszego użytkownika
Problem z if(){} // niewiadomo czemu automatycznie wysiada program
» 2011-05-01 14:04:49
C/C++
#include <ctime>
#include <cstdlib>
#include <allegro.h>
#include <iostream>
#include <fstream>
#include <conio.h>

int mx = 0, my = 0, mb = 0;
void myszka()
{ if( mx != mouse_x | my != mouse_y | mb != mouse_b )
    { mx = mouse_x;
        my = mouse_y;
        mb = mouse_b;
       
    }
   
};
int main()
{ std::cout << "Uruchamianie Programu" << std::endl;
    srand( time( NULL ) );
    std::cout << "ustalono rand na czas" << std::endl << "uruchamianie interfejsu graficznego";
    allegro_init();
    install_keyboard();
    install_mouse();
    BITMAP * menu = NULL;
    menu = load_bmp( "pliki/main.bmp", default_palette );
   
    set_color_depth( 32 );
    set_gfx_mode( GFX_AUTODETECT, 1280, 1024, 0, 0 );
    clear_to_color( screen, makecol( 10, 10, 10 ) );
    BITMAP * car = NULL;
    BITMAP * closed = NULL;
    BITMAP * logo = NULL;
    BITMAP * koza = NULL;
    koza = load_bmp( "pliki/koza.bmp", default_palette );
    car = load_bmp( "pliki/car.bmp", default_palette );
    closed = load_bmp( "pliki/closed.bmp", default_palette );
    logo = load_bmp( "pliki/trol.bmp", default_palette );
    if( !koza |!car |!closed |!logo |!menu ) {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "nosz kurde, nie ma obrazka: albo masz za malo pamiêci, albo nie ma któregos obrazka w folderze /pliki/" );
        allegro_exit();
        return 0;
       
       
    }
    clear_to_color( screen, makecol( 255, 255, 255 ) );
    blit( logo, screen, 0, 0, 256, 256, logo->w, logo->h );
    rest( 2500 );
    destroy_bitmap( logo );
    meni:
    blit( menu, screen, 0, 0, 0, 0, menu->w, menu->h );
    show_mouse( screen );
    unscare_mouse(); myszka();
    while( mouse_b != 1 ) {
        myszka();
    } if( mx < 420 ) { //gra
       
       
        goto meni;
    }
    if( mx < 857 && mx > 420 ) { // wprowadzanie danych
        int iloscdrzwi = 0, iloscprob = 0;
        clear_to_color( screen, makecol( 256, 256, 0 ) );
        BITMAP * men2 = NULL;
        men2 = load_bmp( "pliki/menu2.bmp", default_palette );
        blit( men2, screen, 0, 0, 0, 0, men2->w, men2->h );
        rest( 1000 );
        while( true ) {
            myszka();
            //if(){            // wprowadzenie ilosci prob
           
           
           
            //}
            //if(){         //  wprowadzenie ilosci drzwi
           
           
           
           
            //}
            if( mouse_b = 1 && mx > 940 && my > 770 ) { goto meni; // wyjście do menu BŁĄD
            }
           
           
           
        }
       
        if( mx > 857 && mx < 1024 ) {
            return 0;
        }
       
    }
   
   
    destroy_bitmap( car ); destroy_bitmap( koza ); destroy_bitmap( menu );
    destroy_bitmap( closed );
}
END_OF_MAIN();


Problem leży w tym, że w linii oznaczonej BŁĄD zamiast wychodzić do menu po najechaniu na odpowiedni obszar i kliknięciu wychodzi z programu bez kliknięcia( po najechaniu na obszar)
Pytanie: czy problem leży w funkcji myszka(); czy w instrukcji goto meni; ? jak go naprawić
P-32384
kamillo121
» 2011-05-01 14:16:08
1. Zajrzyj do kursu STC i zobacz jak dodawać kod cpp na forum.
2. W innym temacie pisałeś o goto, było kilka powodów dla których się nie używa tego w pewnych przypadkach a mimo to używasz tego, jaki z tego morał ? kompletnie nie przywiązujesz wagi do tego co ktoś pisze więc się nie dziw, że teraz masz problemy...

3.
C/C++
if( mx != mouse_x | my != mouse_y | mb != mouse_b )

Jeżeli w tym miejscu chodziło ci o wyrażenie OR to powinno być tak:

C/C++
if( mx != mouse_x || my != mouse_y || mb != mouse_b )

Podobna sytuacja tutaj:

C/C++
if( !koza |!car |!closed |!logo |!menu )

4. Nazwij poprawnie temat
P-32386
Bartekko
Temat założony przez niniejszego użytkownika
» 2011-05-01 14:33:26
do mometnu napisania tematu w poprzednim nikt nie odpowiedział co w praktyce może się stać, a tylko coś o słabym działaniu kodu i problemach w odczytywaniu przez programistę (dodam, że pokazuje się menu, ale wypirnicza program po 0.2 sekundy
Edit: Spróbuję inaczej...
P-32387
ison
» 2011-05-01 15:36:06
to właśnie masz odpowiedź dlaczego nie używa się goto, bo nikomu nie będzie się chciało odszyfrowywać Twojego kodu i Ci pomagać ;)
P-32390
yyy...mleko
» 2011-05-02 01:20:55
ykhm chyba mam przykład jak WIELCY PROGRAMIŚCI :D nie przywiązują wagi do błahostek, bo podstawowy błąd jaki mi się rzuca w oczy w linijce
if( mouse_b = 1 && mx > 940 && my > 770 ) { goto meni;
, to zły operator równości nie powinno być czasem
mouse_b == 1
??? :)
P-32423
absflg
» 2011-05-02 08:33:27
C/C++
( mx != mouse_x | my != mouse_y | mb != mouse_b )
( mx != mouse_x || my != mouse_y || mb != mouse_b )
Zadziała dokładnie tak samo...

Nie znam niestety tej biblioteki, ale wydaje mi się to osobliwe: jeżeli mouse_* to zmienne to na co ci w ogóle ta funkcja myszka()? Przecież możesz kontrolować równie dobrze oryginały.

Szybki rzut w Google mówi mi, że źle korzystasz ze zmiennej mouse_b. Powinieneś użyć maski wybranego przycisku/ów twoje
mouse_b != 1
 będzie spełnione gdy będzie wciśnięta kombinacja klawiszy inna niż wciśnięcie tylko klawisza 1. Zerknij w dokumentację.

Kolejne do czego się można przyczepić, to że etykieta nie jest wyróżniona, zwykle jej nazwa jest pisana wielkimi literami i ma jedną tabulację mniej niż blok, w którym się znajduje.
Oczywiście to szczegół natury estetycznej i na program nie wpłynie. To, że użycie goto jest w tym programie nieuzasadnione to już inna sprawa...

ALE DO SEDNA:
A tu chyba znalazłem problem prawdziwy problem
makecol( 256, 256, 0 )
 obawiam się, że w RGB natężenie barw podstawowych reprezentuje się liczbą z zakresu 0-255.

Ogarnij ten kod i wymień goto na funkcję i pętlę. I byłoby miło, gdybyś powstawiał trochę komentarzy dot. działania jak chcesz, żeby ktoś kto nie jest tobą to przeglądał.
P-32425
pekfos
» 2011-05-02 11:09:06
Zadziała dokładnie tak samo...
jesteś tego pewien?
P-32430
absflg
» 2011-05-02 12:50:25
Ah no tak, nie ta kolejność działań. No to jeszcze nawiasy by się przydały :P
P-32441
« 1 » 2
  Strona 1 z 2 Następna strona