[Arduino] Switch... case

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.

Reply to
Michal M. Lechanski
Loading thread data ...

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

Reply to
Mateusz Viste

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.

Reply to
Marek

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.

Reply to
J.F.

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.

Reply to
Michal M. Lechanski

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

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

Reply to
Mateusz Bogusz

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.