Unikanie sytuacji wieszających program?

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
Awatar użytkownika
Kulpina
Użytkownik
Posty: 2037
Rejestracja: 28 lip 2005, 16:57
Lokalizacja: Sanok
Kontakt:

Unikanie sytuacji wieszających program?

Post autor: Kulpina » 21 lis 2009, 13:09

Ostatnio zacząłem się zastanawiać nad taką kwestią.
Mam w programie zmienną, która może przyjąć tylko wartości 0...8.
Przyjęcie innych wartości byłoby równoznaczne z próbą wyświetlenia czegoś na wyświetlaczu, którego nie ma, więc porobiło by się takie trochę nie wiadomo co :mrgreen:

Dlatego co chwilę jest sprawdzane, czy zmienna ma wartość 9 i jeśli ta wartość zostanie osiągnięta to zmienna jest zerowana. Ot mniej więcej tak
Sposób 2 pisze: if(Ktorywysw = 9)
{
Ktoracyfra = 0;
PORTC |= 0x02;
}
I podczas pisania programu zacząłem się zastanawiać.
W końcu polecenie:
Sposób 2 pisze: if(Ktorywysw > 8 )
{
Ktoracyfra = 0;
PORTC |= 0x02;
}
Daje praktycznie ten sam efekt, zajmując trochę więcej miejsca w programie, jednak owo miejsce nie jest mi niezbędne, bo mam go dużo, natomiast napisanie programu drugim sposobem zabezpiecza przed staniem się niewiadomoczego w wypadku gdyby ta zmienna przyjęła np. wartość 10.
Teoretycznie wartości 10 nie przyjmie, bo nie ma jak, ale w elektronice dziwów spotkałem już dużo, więc aktualnie zastosowałem ten drugi sposób i przechodzę to pisania dalszej części programu.
Czy jednak coś takiego ma sens? Jak to ocenić?

Awatar użytkownika
RcTomek
Moderator
Posty: 243
Rejestracja: 27 wrz 2007, 21:15
Lokalizacja: Głogów / Wrocław

Post autor: RcTomek » 21 lis 2009, 17:37

W warunku powinienieś zerować zmienną Ktorywysw, w przeciwnym razie będzie nadal zwiększana.

Aha.. i powinno być:

Kod: Zaznacz cały

if(Ktorywysw == 9)
== porównywanie
= przypisywanie

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 21 lis 2009, 19:24

Oczywiście że ma to sens, i tak się robi w praktyce pisząc jakieś funkcje (C). Natomiast najczęściej niespełnienie takiego warunku powoduje, że funkcja się natychmiast kończy i zwraca wtedy jako wynik działania kod błędu który określa co było nie tak. Przy czym te warunki testujące są na samym początku takiej funkcji. Należy jednak pamiętać że spowalnia to program, oraz go nie co komplikuje, bo jak mamy kody błędów to trzeba i pisać funkcje ich obsługi, aby miało to jakiś sens. Ale tak się pisze raczej profesjonalne oprogramowanie, w małych programach, raczej nikt sobie nie komplikuje aż tak życia. W przypadku licznika do multipleksowania wyświetlaczy, bo chyba to robisz :?: sam licznik tak się robi że nie może przyjąć wartości niedopuszczalnej, lub jak chcesz wyświetlać cyfry z zakresu od 0 do 9, a wartość jakieś zmiennej mogła by przyjąć wartość większą niż 9 (bo liczy się od 0) to wtedy funkcję robi się tak że jak wartość jest > 9 to w tablicy znaków jest 11 znak nazywany NULL (pusty) który powoduje że w tym miejscu wyświetlacza nie wyświetla się nic (pusty wyświetlacz na danej pozycji).

ODPOWIEDZ