![]() |
Turbo Pascal.
|
![]() |
Jak uruchamiać oporne programy
Im bardziej złożony program, tym mniejsza szansa, że uda Ci się od razu napisać go bezbłędnie. Wyłapanie wszystkich błędów kompilacji to dopiero początek: zawsze może Ci się przytrafić dzielenie przez zero czy próba otwarcia nieistniejącego pliku. Błędy te, zwane błędami wykonania (ang. runtime errors), są znacznie mniej przyjemne i trudniejsze do usunięcia od błędów kompilacji. Ich lokalizacja wymaga na ogół użycia specjalnego narzędzia uruchomieniowego, zwanego z angielska debuggerem (czyli odpluskwiaczem). System uruchomieniowy Turbo Pascala będzie tematem ostatniego już rozdziału poświęconego temu kompilatorowi.
Polecenia systemu uruchomieniowego zgrupowane są w menu Run oraz Debug, przy czym większości z nich odpowiadają klawisze skrótu. Do eksperymentów z debuggerem można wykorzystać praktycznie dowolny program, chociaż warto, by zawierał on definicje procedur i zmiennych lokalnych. Dla naszych potrzeb odpowiedni będzie przedstawiony na stronie 62 program Bisekcja.
Jak już wiesz, wystąpienie błędu wykonania powoduje przerwanie działania programu i wskazanie kursorem instrukcji, która ten błąd spowodowała. Niestety, na ogół informacja taka jest niewystarczająca, gdyż do skutecznej lokalizacji błędu wymagane jest prześledzenie zachowania programu na co najmniej kilka instrukcji przed jego wystąpieniem. Możliwość taką daje w nowoczesnych narzędziach uruchomieniowych tzw. tryb krokowy, pozwalający na wykonywanie programu instrukcja po instrukcji.
Turbo Pascal pozwala na krokowe wykonywanie programu na dwa sposoby, realizowane odpowiednio poleceniami Trace Into i Step Over z menu Run (lub odpowiadającymi im klawiszami F7 i F8). Różnica pomiędzy obydwoma trybami sprowadza się do innego sposobu traktowania procedur i funkcji: polecenie Trace Into pozwala na "wejście" do wnętrza procedury, zaś Step Over wykonuje ją jako jedną instrukcję. W obu przypadkach aktualnie wykonywana instrukcja zostaje wyróżniona w tekście programu kolorowym paskiem. Aby wypróbować działanie trybu krokowego, skompiluj program Bisekcja (F9) i wykonaj go w obu trybach. Zauważ też, że wydanie polecenia Program Reset (Ctrl-F2) pozwala na zrestartowanie programu, co może się przydać gdy się okaże, że dalsze jego wykonywanie nie ma sensu.
Powyższa wprawka nie przyniosła chyba żadnych niespodzianek i... niewiele informacji. Tryb krokowy, pozwalający na ustalenie drogi, jaką "przebywa" wykonanie programu, nie daje żadnych wskazówek na temat wartości przyjmowanych przez zmienne, które w większości przypadków są odpowiedzialne za sterowanie pracą programu, a więc i ewentualne kolizje. Na szczęście podejrzenie zawartości wybranej zmiennej jest bardzo łatwe: wystarczy do tego polecenie Evaluate/modify (Ctrl-F4) z menu Debug. Jego wydanie powoduje wyświetlenie okienka zawierającego informację o wartości zmiennej oraz pozwalającego na jej zmianę (tak!).
Rysunek 14. Pole dialogowe Evaluate and Modify
W pole Expression wpisujemy wyrażenie (np. nazwę zmiennej, w naszym przypadku eps), którego wartość chcemy obejrzeć. Wartość wyświetlana jest w polu Result, zaś pole New value umożliwia jej zmianę (z czym jednak należy nieco uważać).
Czasami okazuje się, że podejrzaną zmienną należy śledzić cały czas. W takiej sytuacji zamiast mało wygodnego podglądania poleceniem Evaluate lepiej jest użyć polecenia Watch (Ctrl-F7). Po jego wydaniu (i wpisaniu nazwy odpowiedniej zmiennej lub wyrażenia w okienku Add Watch) na dole ekranu pojawi się okienko Watches, zawierające wartości śledzonych zmiennych (w naszym przypadku zmiennej a, czyli lewej granicy przedziału poszukiwań pierwiastka).
Rysunek 15. Okienko Watches
Ponieważ powrót do okienka edytora zwykle powoduje przysłonięcie okienka Watches, warto uporządkować układ okienek na ekranie, np. przesuwając je za pomocą myszki lub wydając polecenie Tile z menu Window.
Dysponując tymi wiadomościami możesz już wykorzystać tryb krokowy i polecenia podglądania zmiennych do prześledzenia zachowania zmiennej c, będącej bieżącą wartością pierwiastka.
W przypadku większych programów może się okazać, że dotarcie do fatalnej instrukcji z wykorzystaniem trybu krokowego jest zbyt czasochłonne. W takich sytuacjach z pomocą przychodzi polecenie Go to cursor (F4), powodujące wykonanie wszystkich instrukcji aż do miejsca wskazanego kursorem, a następnie przejście do pracy krokowej. Wykorzystując je możesz łatwo "wskoczyć" np. do wnętrza funkcji f(x) bez konieczności wykonywania instrukcji poprzedzających jej wywołanie.
Jeśli powyższe czynności masz wykonywać wielokrotnie, znacznie bardziej użyteczne od funkcji Go to cursor okazuje się polecenie Add breakpoint z menu Debug (Ctrl-F8). Jego wydanie pozwala na ustawienie w miejscu wskazanym kursorem tzw. punktu wstrzymania, powodującego zatrzymanie programu po każdorazowym jego osiągnięciu. Nie dość tego, dodatkowe parametry punktu wstrzymania (Condition i Pass count) umożliwiają jego warunkowe wykonywanie lub zignorowanie określonej liczby przejść. Opcje te używane są rzadko i nie będziemy ich tu omawiać; w większości przypadków użycie punktów wstrzymania sprowadza się do ich ustawiania i usuwania za pomocą klawiszy Ctrl-F8 (odpowiednia instrukcja zostanie wyróżniona w treści programu kolorowym paskiem). Po dojściu programu do punktu wstrzymania na ogół wystarczy sprawdzić zawartość podejrzanej zmiennej poleceniem Evaluate lub Add Watch.
Skrótowe omówienie poleceń systemu uruchomieniowego kończy nasze wprowadzenie do programowania i Turbo Pascala. Dalsze wiadomości zdobędziesz korzystając z bardziej zaawansowanej literatury, a przede wszystkim na drodze praktycznej - pisząc programy. Pamiętaj:
Korzystanie z komputera nie zwalnia od myślenia. Im większy nacisk położysz na właściwe zaprojektowanie rozwiązania, tym mniej czasu będziesz musiał poświęcić na jego zaprogramowanie i tym mniejsze szanse, że będziesz musiał odwoływać się do pomocy środków uruchomieniowych...
Powodzenia!
Poprzedni | Spis treści | Następny | Wersja spakowana |