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. #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 ) { if( mouse_z > ostatnia_rolka ) { zwracana_wartosc = 1; test1 = zwracana_wartosc; } 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 : #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 ) { if( mouse_z > ostatnia_rolka ) { zwracana_wartosc = 1; test1 = zwracana_wartosc; } 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 : 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ę :) |
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 :) |