Programowanie
ABC... C Jak zrobić pętlę tak by się nie zapętlić...
W C występują trzy różne instrukcje pętli. Jeśli programowałeś w BASCOM-ie na pewno same nazwy nie są Ci obce. Rzeczywiście pętle do-while oraz while odpowiadają dość dokładnie znanym z BASCOM-a do-Ioop-until oraz while-wend. Zwróć jednak szczególną uwagę na pętlę for. W C ma ona znacznie większe możliwości niż w językach pokrewnych Basicowi.
1 lko wtedy, gdy
warunek jest spełniony (wartość całego wyrażenia jest równa prawdzie).
Instrukcja - może to być instrukcj a prosta - obowiązkowo żaki
Izaakiem średnika (;), lub instrukcja złożona utworzona z dowo instrukcji prostych wziętych w nawiasy klamrowe. Instrukcja U ciało pęlli i jest wykonywana przy każdym jej przebiegu.
\
whi 1 e(jfiarunek_trwanfał <fTstrukc;
✓
<Sarunek-trwania? instrukcja_pętli) CostrukcilO
W tym miejscu możemy korzystać z dowolnego warunku. Więcej miejsca temu tematowi poświęciłem przy omawianiu instrukcji if. Pętla zawsze jest wykonywana tak długo, dopóki warunek jest spełniony.
Ciało pętli to instrukcja prosta lub złożona. Aby uzyskać pustą pętlę, można zaraz za instrukcją pętli umieścić znak średnika (;). W ten sposób tworzymy pętlę której jedynym zadaniem jest oczekiwanie, aż warunek stanie się fałszywy. W pętli for dodatkowo wykonana zostanie inicjacja i wywoływana będzie instrukcja pętli. Równie dobrze możesz umieścić w takim miejscu puste nawiasy klamrowe. Polecam Ci tę właśnie metodę. W ten sposób zaznaczasz, że nie popełniłeś błędu i na pewno chciałeś stworzyć pustą pętlę. AVR-GCC to nie przeszkadza, ale niektóre kompilatory przy wykorzystaniu pierwszego rozwiązania zgłaszają ostrzeżenie. Jak to dokładniej wygląda, możesz zobaczyć na listingu 15. Pusta pętla jest wykorzystywana w otoczeniu punktu O.
Jest to najprostsza z dostępnych pętli. Zanim ciało pętli zostanie wykonane, testowany jest warunek trwania. Jeśli od początku jest on niespełniony, ciało pętli nie zostanie wykonane ani razu. W tym przypadku zwykle na ciele pętli spoczywa odpowiedzialność takiego wpłynięcia na warunek, aby w odpowiednim momencie przestał być spełniany. Z drugiej strony, warunkiem może być na przykład oczekiwanie na odpowiedni stan na wyprowadzeniu portu.
Pętla utworzona za pomocą tej instrukcji nie jest bardziej skomplikowana niż pętla while. Różnica jest jednak taka, że warunek sprawdzany jest po wykonaniu ciała pętli. Oznacza to, że ciało pętli zostanie wykonane przynajmniej raz, nawet jeśli początkowo warunek jest niespeł-
Niech nie przeraża Cię bardziej rozbudowana składnia pętli for. W BASCOM-ie miałeś do czynienia z pętlą, która umożliwia jedynie
zwiększanie lub zmniejszanie wartości wybranej zmiennej. Warunkiem zakończenia było zawsze dojście do odpowiedniej wartości. Łatwo osiągnąć identyczny rezultat. Wystarczy odpowiednio dobrać instrukcje inicjacji oraz instrukcję pętli:
for(n=0; n<4; n-) (...)
for(n=4; n>0; n+=2) (...)
Zauważ jednak, że przedstawiona składnia jest znacznie bardziej uniwersalna. Na przykład możesz zadbać o to, aby zmienna, która jest testowana, była przesuwana w lewo czy prawo, aby po każdym przejściu pętli zmniejszała się lub powiększała na przykład 10 razy: for(n=l; n<(l«7); r.«=l) (...) for(n=1000; n>0; n/=10) (...)
Możliwe jest nawet odniesienie instrukcji inicjacji, warunku oraz instrukcji pętli do różnych zmiennych. Jednak ze względu na czytelność kodu nie robi się tego. W takim przypadku lepiej jest wykorzystać jedną z wcześniejszych pętli i wspomniane instrukcje dopisać (odpowiednio) przed oraz we wnętrzu pętli.
zmienna przyjmie wartość równą zero. Okazuje się, że nasz kompilator tak właśnie zrobił. Wykrył, że zmienna n nie jest wykorzystywana we wnętrzu pętli. Oznacza to, że chcemy jedynie jej ciało powtórzyć 4 razy, nieważne w jaki sposób. Jeśli masz ochotę - możesz sprawdzić ten fragment za pomocą AYRStudio. Dla uproszczenia symulacji jeszcze przed pętlą główną możesz dopisać:
WyświetlDEC(10000) ;
Spowoduje to już na początku skok do interesującego nas fragmentu. Sprawdź, jakie wartości przyjmuje zmienna n. Powinno to być 3, 2, 1, 0, czyli inaczej niż zostało zapisane, a jednak program jest wykonywany popra-
| (var=1234) j
Rys. 24 Działanie funkcji WyswietIDEC.
NIE. W C wszystkie wyrażenia stałe są obliczane przez kompilator. Adres tablicy jest wyrażeniem stałym. Program nie będzie więc naprawdę wykonywał odejmowania. Po prostu wykorzysta adres do tablicy mniejszy o 1.
Zauważ, że przedstawiony na rysunku 24 sposób obliczeń umożliwia wyświetlanie nie tylko w kodzie dziesiętnym. Można przetwarzać liczby na dowolny kod. Należy zmienić jedynie współczynnik, przez który liczba jest dzielona (zarówno przy uzyskiwaniu reszty, jak i przy przesuwaniu). Podstawowym ograniczeniem od góry bazy, z jaką może odbywać się przetwarzanie, jest liczba pozycji w tablicy g_WzoryCyfr.
Interesująca sprawa dotycząca specyfiki procesorów AVR jest związana z punktem © na listingu 15. Ta część kodu jest odpowiedzialna za wyświetlenie kresek na wyświetlaczach, jeśli zakres możliwych do wyświetlenia wartości został przekroczony. Zauważ teraz, że formalnie zmienna w pętli for przyjmuje wartości od 0 do 3 włącznie. Jednak ze względu na zbiór instrukcji procesora okazuje się, że mniejszym nakładem kodu można przerwać wykonywanie pętli, gdy dana
Elektronika dla Wszystkich Wrzesień 2005 39