[Arduino] Switch... case

Oct 14, 2018 6 Replies

Dzień dobry,



switch ... case dopuszcza tylko dane typu int i char, mnie wygodnie by było użyć String. Czy istnieje podobna funkcja pozwalająca operować na danych typu string? Dziękuję za sugestie.


P.S. Wiem że mogę użyć if..else.


Michal M. Lechanski snipped-for-privacy@doriath.eu napisa³(a):

Nie ma podobnej konstrukcji jêzyka C++ dla typu string. Ale ja bym jej nawet nie szuka³. Przemapuj sobie te stringi na enumy i dopiero potem u¿ywaj w switch..case. Pozwoli Ci to nie tylko na u¿ycie tej konstrukcji ale te¿ zwiêkszy czytelno¶æ/koszerno¶æ kodu. Unikamy magicznych stringów i magicznych liczb, stosujemy enumy, szczególnie w wiêkszych programach. Z tego te¿ wzglêdu unikamy tak¿e litera³ów liczbowych w switch..case. Odpowiedni w±tek na StackOverflow, ze szczególnym podkre¶leniem odpowiedzi 4 (tej z 9 punktami):

formatting link

Mi w podobnych sytuacjach zdarzało się użyć kilku rozwiązań:

- parsowanie stringa by przydzielić mu stosownego enuma, i następnie switch() na enumie.

- kiedy stringi można rozróżnić po pierwszych 4 znakach, to zwyczajny cast do uint32_t

- na podstawie ciągu znaków wyliczam crc32, i następnie z tej wartości korzystam by rozpoznać jaka była (domniemana) zawartość stringa

- ostatecznie męczyć się z if (strcmp()) else if () itd...

Mateusz

W dniu 14.10.2018 o 10:20, Michal M. Lechanski pisze:

Enum Twoim przyjacielem, który Ci pomoże:

typedef enum TZwierzaki { enKotki, enPieski, enKrowki, enKozki, enSwinki };

TZwierzaki zwierzaki = enPieski; //wartość domyślna string ZwierzakiStr = "Pieski";

Przykład użycia:

if (miaauu) { ZwierzakiStr = "Kotki"; zwierzaki = enKotki; } if (haauu) { ZwierzakiStr = "Pieski"; zwierzaki = enPieski; }

switch (zwierzaki) { case enKotki: {

} break; case enPieski: {

} break; case enKrowki: {

} break; default: { //dla enKozki i enSwinki } }

Można też po każdym "case" wstawić funkcję konwertująca łańcuch do elementu ze zbioru TZwierzaki (w necie pełno przykładów, wystarczy chwilę poszukać), ale powyższe rozwiązanie jest proste, przejrzyste i daje możliwość wykorzystania zmiennej "zwierzaki" do różnych celów, np. w GUI po rzutowaniu na int do ustawiania np. indeksu listy rozwijalnej (ComboBox) lub po rzutowaniu indeksu z int na typ TZwierzaki do odczytu z tejże listy wybranego zwierzęcia.

Switch z int ma te zalete, ze kompilator moze tablice skokow zrobic.

A jak parsujesz, to czy jest zysk, czy tylko strata ?

Parsowac mozna algorytmem binarnym, w if'ach to nieco trudniejsze, ale mozna je optymalnie ustawic.

A potem unicode sie trafi :-)

Tu z kolei kompilator nie moze tablicy skokow ... albo nie bedzie sie ograniczal, 100MB sobie wygeneruje :-)

Metoda hash ... znana, stosowana, patrz wyzej ...

I tu by sie przydalo jeszcze miec mniejsze i wieksze, i C troche zawodzi. Czy mi sie wydaje, czy w Fortranie taki trojstronny if byl ?

J.

W dniu 14.10.2018 o 09:20, Michal M. Lechanski pisze:

Dziękuję za wszystkie odpowiedzi, w końcu okazało się że tym razem if...else zupełnie wystarczyło.

W dniu 14.10.2018 o 23:06, Michal M. Lechanski pisze:

Haha, nie dziwie się. Po takich odpowiedziach X-D

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required