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

[allegro] intrygująca funkcja

Ostatnio zmodyfikowano 2012-01-06 18:07
Autor Wiadomość
McAffey
Temat założony przez niniejszego użytkownika
[allegro] intrygująca funkcja
» 2012-01-06 17:38:16
Witam. Zazwyczaj staram się sam rozwiązywać swoje błędy w kodzie, tym razem jednak mam błąd, który mnie strasznie intryguje. Tzn mógłbym napisać daną funkcję od zera w inny sposób, tak żeby działała poprawnie (i jeśli założenie tego tematu na forum mi nie pomoże, w co raczej wątpię, to tak zrobię), jednak z ciekawości chciałem pokazać go wam. A mianowicie, mam funkcję kontrolującą kręcenie się kółka myszki w allegro. Na potrzeby tematu odseparowałem ją z mojej aplikacji i pokazuję wam aplikację zrobioną tylko dla tej funkcji.
C/C++
#include <allegro.h>

int ostatnia_rolka = 0, test1 = 0, test2 = 0, test3 = 0, test4 = 0;

int rolka()
{
    int zwracana_wartosc = 0;
   
    while( mouse_z != ostatnia_rolka )
    {
        //Krecenie kolkiem w gore
        if( mouse_z > ostatnia_rolka )
        {
            zwracana_wartosc = 1; test1 = zwracana_wartosc;
        }
       
        //Krecenie kolkiem w dol
        if( mouse_z < ostatnia_rolka )
        {
            zwracana_wartosc = 2; test2 = zwracana_wartosc;
        }
       
        ostatnia_rolka = mouse_z;
        test3 = zwracana_wartosc;
    }
   
    test4 = zwracana_wartosc;
   
    return zwracana_wartosc;
}

int main()
{
    allegro_init();
    install_keyboard();
    set_color_depth( 16 );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 );
   
    install_mouse();
    show_mouse( screen );
   
    BITMAP * bufor = NULL;
   
    bufor = create_bitmap( 800, 600 );
   
    int liczba = 100;
   
    while( !key[ KEY_ESC ] )
    {
        clear_to_color( bufor, makecol( 255, 255, 255 ) );
       
        if( rolka() == 1 )
        {
            liczba++;
        }
       
        if( rolka() == 2 )
        {
            liczba--;
        }
       
        textprintf_ex( bufor, font, 20, 35, makecol( 0, 0, 0 ), - 1, "Liczba: %d, test1: %d, test2: %d, test3: %d, test4: %d ostatnia_rolka: %d, mouse_z: %d", liczba, test1, test2, test3, test4, ostatnia_rolka, mouse_z );
       
        blit( bufor, screen, 0, 0, 0, 0, 800, 600 );
    }
   
   
    destroy_bitmap( bufor );
   
    allegro_exit();
    return 0;
}
END_OF_MAIN();

Funkcja działa poprawnie dla przesuwania kółka w górę, a z niewiadomych mi powodów nie działa dla ruchów w dół. Jednak bardziej intrygujące są wyniki obserwacji zmiennych powtykanych w tą funkcję (test1, test2...), a dokładniej  zmiennej test4. Pozostałe zmienne w tym przypadku zachowują się poprawnie, tylko test4 cały czas ma wartość 0, a moim zdaniem po ruszeniu kółkiem powinien mieć wartość 1 lub 2. I co ciekawe, funkcja ta, nie działa poprawnie również wtedy, gdy zwracam wartość jeszcze w pętli while, tzn :
C/C++
#include <allegro.h>

int ostatnia_rolka = 0, test1 = 0, test2 = 0, test3 = 0, test4 = 0;

int rolka()
{
    int zwracana_wartosc = 0;
   
    while( mouse_z != ostatnia_rolka )
    {
        //Krecenie kolkiem w gore
        if( mouse_z > ostatnia_rolka )
        {
            zwracana_wartosc = 1; test1 = zwracana_wartosc;
        }
       
        //Krecenie kolkiem w dol
        if( mouse_z < ostatnia_rolka )
        {
            zwracana_wartosc = 2; test2 = zwracana_wartosc;
        }
       
        ostatnia_rolka = mouse_z;
        test3 = zwracana_wartosc;
        return zwracana_wartosc;
    }
   
    test4 = zwracana_wartosc;
}

int main()
{
    allegro_init();
    install_keyboard();
    set_color_depth( 16 );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 );
   
    install_mouse();
    show_mouse( screen );
   
    BITMAP * bufor = NULL;
   
    bufor = create_bitmap( 800, 600 );
   
    int liczba = 100;
   
    while( !key[ KEY_ESC ] )
    {
        clear_to_color( bufor, makecol( 255, 255, 255 ) );
       
        if( rolka() == 1 )
        {
            liczba++;
        }
       
        if( rolka() == 2 )
        {
            liczba--;
        }
       
        textprintf_ex( bufor, font, 20, 35, makecol( 0, 0, 0 ), - 1, "Liczba: %d, test1: %d, test2: %d, test3: %d, test4: %d ostatnia_rolka: %d, mouse_z: %d", liczba, test1, test2, test3, test4, ostatnia_rolka, mouse_z );
       
        blit( bufor, screen, 0, 0, 0, 0, 800, 600 );
    }
   
   
    destroy_bitmap( bufor );
   
    allegro_exit();
    return 0;
}
END_OF_MAIN();

Zmienna zwracana_wartosc ma wartość 2 (wiemy to z obserwacji zmiennej test3 a i tak nie działa poprawnie moment :
C/C++
if( rolka() == 2 )
{
    liczba--;
}
(bo liczba się nie zmniejsza)

Z doświadczenia wiem, że w takich przypadkach najczęściej pomijam jakąś oczywistość, a jak ją potem znajduję to moja samoocena drastycznie spada, jednak nie mogę się tutaj żadnego oczywistego błędu doszukać. Pomożecie i lukniecie na tą funkcję ? Z góry dziękuję :)
P-47420
DejaVu
» 2012-01-06 17:45:36
Nie wiem czy o to chodzi, ale:
C/C++
#include <allegro.h>

int rolka()
{
    static int ostatnia_rolka = 0;
    int iResult = mouse_z - ostatnia_rolka;
    ostatnia_rolka = mouse_z;
    return iResult;
}

/edit:
A w kontekście tego co na dole napisane:
C/C++
if( rolka() > 0 )
     costam++;

if( rolka() < 0 )
     costam--;
P-47421
ison
» 2012-01-06 17:46:38
zamiast
C/C++
if( rolka() == 1 )
{
    liczba++;
}

if( rolka() == 2 )
{
    liczba--;
}
zrób
C/C++
int costam = rolka();
if( costam == 1 )
{
    liczba++;
}

if( costam == 2 )
{
    liczba--;
}
P-47422
McAffey
Temat założony przez niniejszego użytkownika
» 2012-01-06 18:07:33
Dzięki Ison, Twoje rozwiązanie działa, no tak, oczywisty błąd, przecież po pierwszym sprawdzeniu funkcja już się zerowała. No i od razu stało się dla mnie jasne dla czego na koniec test4 zostawał 0. Ech, no i tak jak myślałem, rozwiązanie było oczywiste a ja wychodzę na idiotę.

Ps. DejaVu Twoje rozwiązanie jest dużo szybsze niż moje, ale już zostanę przy swoim (skoro już działa). Pociesza mnie tylko fakt, że w tej "mainowej" jego części zrobiłeś ten sam błąd co ja, który sprostował Ison, czyli zdarza się nawet geniuszom ;> (No tylko Ty pewnie byś od razu się zorientował gdzie jest kot pogrzebany bo tego pewnie nawet nie kompilowałeś, no ale cóż, myślę że porównywanie Ciebie i mnie to spore nieporozumienie).

Jeszcze raz dzięki, temat zamykam :)
P-47426
« 1 »
  Strona 1 z 1