sobota, 19 marca 2011

Techniki programowania: switch() oraz if()


Autor: BlueDraco
Redakcja: Dondu


Punkt II.9 Smoczych zasad brzmi:

Nie używaj instrukcji switch() ani sekwencji if()...else if(), gdy poszczególne sekcje case różnią się tylko wartościami danych, a nie wykonywanymi operacjami.

Rozejście warunkowe jest zawsze czasochłonne i warto go unikać, gdy nie jest niezbędne. Jeżeli w zależności od wartości zmiennej używamy tylko różnych danych, a nie wykonujemy różnych akcji, należy zastąpić rozejście kodu wyborem odpowiedniej wartości danych – zwykle przy użyciu tablicy zmiennych lub stałych.

Ilustrują to dwa poniższe przykłady, zaczerpnięte z polskiego Internetu.





Przykład 1

Pierwszy przykład pokazuje zamianę wartości cyfry na kod wyświetlacza siedmiosegmentowego. Oryginalny kod wygląda tak:

unsigned char transl(uint32_t cyfra){
    switch (cyfra) {
        case 0 :
            return 0x3f;
        case 1 :
            return 0x06;
        case 2 :
            return 0x5b;
        case 3 :
            return 0x4f;
        case 4 :
            return 0x66;
        case 5 :
            return 0x6d;
        case 6 :
            return 0x7d;
        case 7 :
            return 0x07;
        case 8 :
            return 0x7f;
        case 9 :
            return 0x6f;
        case 10 :
            return 0x77;
        case 11 :
            return 0x7c;
        case 12 :
            return 0x39;
        case 13 :
            return 0x5e;
        case 14 :
            return 0x79;
        case 15 :
            return 0x71;
        default :
            return 0x40;
        }
}

Po wprowadzeniu tablicy zastępującej zbędne rozejście, kod przyjmie następującą postać:

uint8_t transl(uint32_t cyfra)
{
    static const uint8_t cyfry[] = {
        0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
        0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71,
        0x40
        };
    return cyfry[cyfra <= 16 ? cyfra : 16];
}





Przykład 2


28 marca 2013r. godz. 11:38
W związku ze zgłoszeniem możliwego naruszenia praw autorskich w zakresie niniejszego przykładu, wstrzymujemy jego publikację do momentu wyjaśnienia wszelkich wątpliwości.
Dondu


Jako pracę domową proponuję Czytelnikom przyjrzenie się kodowi asemblerowemu powstałemu przez kompilację obu wersji programów oraz porównanie zajętości pamięci.

Więcej: Techniki programowania mikrokontrolerów - Smocze zasady

Autor: BlueDraco
Redakcja: Dondu

10 komentarzy:

  1. Bardzo fajnie pokazane, daje do myślenia. Pierwszy kod był bardzo "łatwy" do zobrazowania ale w drugim przypadku świetnie wymyślone. Sam muszę częściej "wpadać" na takie pomysł :)

    OdpowiedzUsuń
  2. Fajny ten myk z licznik &= 0b11;
    Ale tylko dla 4 cyfr, bo dla 5 już trzeba if().
    Upraszczając kod można by chyba zamiast ++licznik, zrobić ANODY_PORT &= ~(1 << licznik++);

    OdpowiedzUsuń
  3. Kolejny potężny negatyw za brak cywilnej odwagi, w publikowaniu komentarzy, widzę że niewygdona prawda w oczy kole.....

    OdpowiedzUsuń
  4. Kolego Ktosiek.

    Nie jestem online 24h/dobę, więc proszę cierpliwie zaczekać na moderację i/lub odpowiedź - 20 minut, które odczekałeś, to znacznie za mało. Aby nie było na przyszłość tego typu problemów, dodałem tekst informujący o tym.

    Przed publikacją swojego komentarza zapewne czytałeś tekst zamieszczony nad polem do pisania komentarzy. Napisałem tam, że nie przepuszczam spamu, ani niekulturalnych wypowiedzi.

    Twoja wypowiedź kwalifikuje się pod oba te punkty. Wprawdzie jest merytoryczna, ale tylko w niewielkiej części.

    Jeżeli więc chcesz odnieść się do artykułu merytorycznie, to proszę napisać jeszcze raz.

    Resztę swoich emocjonalnych wątków proszę omówić z autorem tematu np. za pomocą PW na forum Elektroda.pl. Link do konta autora znajdziesz tutaj.

    Miłego wieczoru.

    OdpowiedzUsuń
  5. Nie odpowiedziałeś na moje uwagi, które napisałem 20 marca 2013 15:24. Mogę liczyć na odzew?

    OdpowiedzUsuń
  6. Anonimowy: Odpowiedziałem rozszerzeniem tekstu - nowym małym artykulikiem, tylko kol. Dondu nie ma mocy edycyjnych. Jak mu tekst przejdzie przez warsztat - będzie tu poldlinkowany.

    OdpowiedzUsuń
  7. Artykuł o którym pisze BlueDraco ukaże się około 1 kwietnia - wcześniej nie dam rady.

    OdpowiedzUsuń
  8. Informuję, że otrzymałem informację o możliwym naruszeniu praw autorskich przez autora artykułu, dlatego też w części dot. przykładu nr 2 zawieszam jego publikację do momentu wyjaśnienia sprawy.

    OdpowiedzUsuń
  9. Kiedy można spodziewać się brakującego drugiego przykładu ?

    OdpowiedzUsuń
  10. witam
    Już rok mija i nic nie wyjaśnione?
    można ten przykład dostać na priva?
    janusz_k@o2.pl

    OdpowiedzUsuń