Allegro biblioteka do programowania gier Języki: English  español  Deutsch  français  한국어 (Hangul)  Italiano 

 
 

Allegro
  Nowości
  Wprowadzenie
  Licencja
  Twórcy
  Starsze wiadomości
  Loga

Pliki
  Ostatnia wersja
  Stare wersje
  CVS

Dokumentacja 
  API
  FAQ
  Tutoriale
  Przyszłość

Wsparcie
  Pomoc
  Listy dyskusyjne
  IRC

Gry, narzędzia, biblioteki, itp
  Allegro.cc

Różne
  DIGMID
  Linki
  Mirrory
  Webmasterzy
  Humor

 
 
  

Co zrobić gdy Twój program nie działa


Zawartość


Wprowadzenie

Gdy źle się dzieje, często jest dobrym pomysłem, aby poprosić innych o pomoc. Na szczęście dla ludzi w tej sytuacji jest wiele ludzi (zarówno twórców, jak i użytkowników Allegro), którzy z radością spędzą swój czas odpowiadając na pytania tego typu, ale jest wiele rzeczy, który możesz zrobić, aby ten proces uczynić bardziej efektywnym. Ten dokument opisuje kilka kroków które musisz uczynić, mając jakiekolwiek problemy z Allegro, pokazuje sposoby ich samodzielnego rozwiązywania oraz zawiera wiele wskazówek kiedy i jak prosić o pomoc. Podążając za tymi wskazówkami uczynisz życie łatwiejszym zarówno dla pomagającego (ponieważ wszystkie informacje będą przedstawione w zwięzły i użyteczny sposób), jak i poszukującego pomocy (ponieważ będzie bardziej prawdopodobne że otrzyma właściwą odpowiedź).


Część 1 - kto jest winny?

Czy błąd tkwi w Allegro, czy twoim kodzie? Aby się przekonać, spróbuj uruchomić programy testowe, w szczególności test.exe (w problemach związanych w grafiką), play.exe (w problemach z kartami dźwiękowymi) i całą zawartość katalogu examples (wszystkiego co może mieć jakiś związek). Jeżeli nie możesz powielić tam błędu, to prawdopodobnie wina leży po Twojej stronie w tym przypadku przejdź do części 3.

Jeżeli jest związany z DOS'owymi trybami graficznymi powinieneś zacząć od zdobycia kopii Display Doctora z http://www.scitechsoft.com/. Jeżeli to rozwiązuje problem, jest prawie pewne, że Twój oryginalny sterownik VESA był w jakiś sposób uszkodzony. Nie interesują mnie raporty o problemach tego typu: nic nie mogę zrobić, aby je naprawić, więc obawiam się, że jedyną opcją będzie zdobycie lepszego sterownika VESA, zmuszenie producenta do poprawienia błędów, kupno Display Doctora, lub napisanie sterownika FreeBE/AF dla Twojej karty (zobacz http://www.talula.demon.co.uk/freebe/).


Część 2 - gdy winne jest Allegro

Jeżeli wciąż myślisz, że problem tkwi w Allegro wyślij raport zawierający opis problemu, typ platformy, wersje biblioteki, opis sprzętu, listę programów w których udało się błąd powielić (jest ważne, żeby nie tylko wiedzieć, które nie działały, ale również które działały, jeżeli są takie).

Jeżeli jest związany z DOS'owymi trybami graficznymi powinieneś wysłać również to co zwracają afinfo i vesainfo (krótsza wersja wystarczy jeżeli nie poprosisz o użycie opcji -v - pozostałe dane są zazwyczaj niepotrzebne). Spróbuj uruchomić test.exe z różnymi sterownikami (wszystkimi które mogą działać z Twoją kartą, VESA 2.0 i VESA 1.x), w różnych trybach graficznych i głębiach koloru. Jeżeli możesz używać dowolnych rozdzielczości SVGA uruchom test.exe z opcją Autodetect i napisz co jest wyświetlane na środku ekranu.

Jeżeli problem dotyczy dźwięku, spróbuj użyć programu setup i ręcznie skonfigurować kartę. Możliwe, że nie zbędne jest ręczne wprowadzenie parametrów sprzętu, a jeżeli jest to klon SB spróbuj wybrać wcześniejszą wersje karty SB, w której działa Autodetect (SB Pro, SB 2.0, or SB 1.0). Jeżeli wciąż nic nie działa wyślij nazwę i opisy sterowników, które są wykrywane (wyświetla to play.exe).


Część 3 - gdy program się zawiesza

Gdy program się zawiesza, zazwyczaj otrzymujesz od djgpp komunikat podobny do tego:

      Exiting due to signal SIGSEGV
      General Protection Fault at eip=00001eca
      [snip]

      Call frame traceback EIPs:
        0x00001eca
        0x00001590
        0x00001aea
Ta informacja mówi dokładnie w którym program się zawiesił. Aby to nabrało sensu, powinieneś skompilować Twój program z informacją dla debugera (używając opcji -g) i uruchamiając "symify program.exe" podczas gdy ten komunikat jest na ekranie. To zmieni go na coś takiego:
      Call frame traceback EIPs:
        0x00001eca   _strcpy+14
        0x00001590   _main+56, line 7 of t.c
        0x00001aea   ___crt1_startup+138
W tym przypadku możesz zobaczyć, że program zawiesił się na funkcji strcpy(), która jest wywoływana z 7 linii funkcji main() z plik t.c. Teraz musisz tylko obejrzeć co ta linia robi i poprawić ją :-)

Uwaga: jeżeli błąd objawia się głęboko w Allegro ten komunikat raczej się nie przyda. W takim przypadku należy przekompilować Allegro z informacją dla debugera (zobacz readme) oraz zlinkować Twój program z tą wersją biblioteki.

Uwaga 2: nawet jeżeli komunikat wskazuje na jedną z funkcji Allegro nie oznacza to że z całą pewnością winna jest biblioteka. Wszystko się zawiesi, jeżeli tylko podasz błędne argumenty, więc jeżeli nie uda Ci się powielić problemu na jednym z programów przykładowych, powinieneś sprawdzić, czy błąd nie tkwi w operatorach i podwójnie sprawdzić co przekazujesz do funkcji.


Część 4 - rzeczy których ludzie nie robią (choć powinni)

Jednym z najczęstszych błędów popełnianych przez programistów jest nie sprawdzanie wartości powrotnych funkcji, które mogą nie zadziałać. Taki błąd często prowadzi do niespodziewanych i niezwykłych błędów, czyniących debugowanie koszmarem. Istnieje wiele funkcji w i poza Allegro, które mogą nie zadziałać w różnych okolicznościach. Jednak są one na tyle miłe, że powiadamiają o tym czy zdziałały skutecznie poprzez udokumentowane wartości powrotne.

Gdy funkcja może nie zadziałać (w szczególności set_gfx_mode(), install_sound() oraz cokolwiek co ładuje dane z dysku) jest _istotne_, aby sprawdzić wartość powrotną i odpowiednio zareagować.

Innym często zapominanym i użytecznym narzędziem są opcje włączające dokładne ostrzeżenia w kompilatorze (gcc używa -Wall) podczas kompilacji. Wszystkie ostrzeżenia zwracane za pomocą tej opcji powinny być usunięte przed zrobieniem czegokolwiek innego. W gcc użyteczną sztuczką jest kompilacja z opcją -O, ponieważ wtedy kompilator bada reakcje programu bardziej szczegółowo, pokazując przy tym więcej użytecznych ostrzeżeń. Podczas debugowania powinieneś wyłączyć optymalizację. Pomimo, że program ma lepsze osiągi czasowe jest bardzo prawdopodobne, że narzędzia debugujące nie będą działać w pełni prawidłowo.


Część 5 - szukanie pomocy

Ok, pomimo sprawdzeniu wszystkich wyżej opisanych rzeczy program wciąż nie działa. Nie masz żadnego pomysłu co dalej robić, więc nadszedł czas, aby zdać się na łaskę sieci w nadziei na znalezienie jakiegoś genialnego człowieka, lub wyroczni, która zna odpowiedź na Twoje pytanie...

Najlepszym miejscem jest lista dyskusyjna Allegro: zobacz readme.txt, aby uzyskać szczegóły. Pamiętaj, że jest to lista dotycząca Allegro. Problemy z językiem C lub djgpp należą do innych list (odpowiednio pl.comp.lang.c, comp.lang.c i comp.os.msdos.djgpp).

Zarówno lista Allegro, jak i djgpp są zarchiwizowane poprzez strony domowe. Jest bardzo prawdopodobne, że będziesz w stanie znaleźć rozwiązanie problemu przez czytanie odpowiedzi na poprzednie pytania, które być może uchronią Cię przed wysyłaniem listu.

Według netykiety, przed wysłaniem czegokolwiek na forum internetowe powinieneś najpierw sprawdzić związaną z tym dokumentację, nie koniecznie czytając ją całą. Jeżeli problem jest wart pytania setek ludzi, jest również wart poświęceniu mu paru minut na samodzielne rozwiązanie. Allegro jest intensywnie i starannie dokumentowane. Ważne jest nie tylko przeczytanie tekstu, ale również przebadanie programów przykładowych.


Część 6 - nauka z moich błędów

Czego nie robić, część pierwsza:

      "Mój program się zawiesza. Powiedz mi co zrobić."
Tak, ludzie naprawdę wysyłają mi pytania tego typu :-) Pomimo lat praktyki wciąż nie potrafię czytać w myślach, więc pytanie jest całkowicie bezcelowe. Aby otrzymać pomoc musisz opisać problem na tyle szczegółowo, aby ini mogli zrozumieć i powielić go: to zazwyczaj oznacza załączenie fragmentu kodu źródłowego.


Czego nie robić, część druga:

      "Mam problem z programem. Załączam 500 kilowego zipa zawierającego
      10 tysięcy linii kodu, całą grafikę i dźwięk: możesz to za mnie
      zdebugować i powiedzieć w czym tkwi problem?"
Po zmarnowaniu czasu i impulsów na pobranie tak wielkiego pliku, jest mało prawdopodobne, aby ktokolwiek _chciał_ Ci pomóc. Poświęć sam czas jaki zajęłoby przeczytanie i zrozumienie takiego ogromu informacji. Musisz wyizolować najmniejszy fragment kodu, aby pokazać problem: im mniejszy, tym większa szansa, że ktoś będzie w stanie Ci pomóc. Pamiętaj, że prosisz o przysługę i jesteś odpowiedzialny za uczynienie jej jak najprostszą.


Część 7 - formułowanie oświadczenia

Najważniejsze jest zawarcie kodu, które może być skompilowany i przetestowany przez osobę czytającą wiadomość. Nie wysyłaj całego programu: spróbuj wyodrębnić najmniejszy fragment zawierający linie powodujące problem, lub powielić to w inny, łatwy sposób (często zdarzy się, że znajdziesz błąd podczas upraszczania, więc jest to dobre ćwiczenie w samym sobie). Ten kod powinien być małym i kompletnym programem, który może być skompilowany i uruchomiony, ponieważ strasznie trudno debuguje się niekompletne fragmenty.

Najlepiej jest zamieścić kod bezpośrednio w treści listu, ponieważ ułatwi to innym przeczytanie, niż gdyby było to zawarte jako załącznik.

Najlepiej gdyby Twój program nie używał zewnętrznej grafiki i danych z plików. Nie będzie przeszkadzać załączenie zipa (max 2k) zawierającego te dane, lub informacji co może go zastąpić (np. "zamieść plik .pcx 32x32 nazwany 'tile.pcx' w katalogu, w którym znajduje się program"). Jeżeli nie można tego tak uprościć powinieneś zamieścić program i dane na jakiejś stronie i wysłać tylko adres.

Powinieneś napisać jakiej linii poleceń używasz podczas kompilacji programu, powinna ona zawierać opcję -Wall.

Opisz co program ma robić (to nie koniecznie może być oczywiste dla innych ludzi) i co naprawdę robi. Nie trzeba koniecznie dołączać całego komunikatu z części 3 (inni mogą to powielić jeżeli mogą tylko skompilować i uruchomić Twój kod), ale musisz napisać czy w ogóle go dostajesz, czy też są to tylko nieprawidłowe rezultaty (jeżeli tak to w czym różnią się od twoich oczekiwań). Użyteczne jest zaznaczenie komentarzami błędnej linii.

Wszelkie dodatkowe informacje, które dodasz mogą okazać się użyteczne. Najważniejszą jest konfiguracja komputera, informacja o użytych sterownikach oraz wersja Allegro (nie pisz tylko "WIP", ale podaj dokładną datę jeżeli używasz jakiejś nienumerowanej oficjalnie wersji)


Część 8 - przykład perfekcji

Dla informacji zamieszczam przykład, który uważam za idealny raport.

   Mam problemy z używaniem trybów hicolor w moim programie, mimo że
   działają świetnie z programami testowymi. Używam Allegro 3.0 pod
   djgpp 2.02 (wersja gcc 2.8.1) na p166, pod win95 oraz używam
   wbudowanego sterownika VESA 2.0, który jest opisywany przez vesainfo
   jako "Matrox Graphics Inc.".

   Program ma za zadanie wybierać tryb 640x480x16bit, rysować niebieski
   prostokąt blisko górnego, lewego rogu ekranu i poczekać na naciśnięcie
   klawisza przed wyjściem. Otrzymuje generalny błąd zabezpieczenia
   podczas uruchamiania.

   Kompiluje poleceniem "gcc -Wall t.c -o t.exe -lalleg" i nie otrzymuje
   żadnych ostrzeżeń.


   --- tu ciach, t.c ---

   #include <stdio.h>
   #include <allegro.h>

   void main()
   {
      BITMAP *bmp = screen;

      install_keyboard();

      if (set_gfx_mode(GFX_AUTODETECT, 640, 480, 0, 0) != 0) {
         printf("Error setting video mode\n");
         return;
      }

      set_color_depth(16);

      /* tu się wiesza! */
      rectfill(bmp, 32, 32, 64, 64, 0x001F);

      readkey();
   }