RTV forum PL | NewsGroups PL

Jak używać stringów w Arduino z funkcjami podobnymi do switch... case?

[Arduino] Switch... case

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Jak używać stringów w Arduino z funkcjami podobnymi do switch... case?

Michal M. Lechanski
Guest

Sun Oct 14, 2018 8:20 am   



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.

--
Michał

Grzegorz Niemirowski
Guest

Sun Oct 14, 2018 9:46 am   



Michal M. Lechanski <michal@doriath.eu> napisał(a):
Quote:
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.

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):
https://stackoverflow.com/questions/16388510/evaluate-a-string-with-a-switch-in-c

--
Grzegorz Niemirowski
https://www.grzegorz.net/

Mateusz Viste
Guest

Sun Oct 14, 2018 10:08 am   



On Sun, 14 Oct 2018 09:20:37 +0100, Michal M. Lechanski wrote:

Quote:
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.

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

Marek
Guest

Sun Oct 14, 2018 10:36 am   



W dniu 14.10.2018 o 10:20, Michal M. Lechanski pisze:
Quote:
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?

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.

--
Pzdr.
Marek

J.F.
Guest

Sun Oct 14, 2018 11:58 am   



Dnia 14 Oct 2018 10:08:15 GMT, Mateusz Viste napisał(a):
Quote:
On Sun, 14 Oct 2018 09:20:37 +0100, Michal M. Lechanski wrote:
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.

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.

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.

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

A potem unicode sie trafi :-)

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

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

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

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

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.

Michal M. Lechanski
Guest

Sun Oct 14, 2018 9:06 pm   



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

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

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

--
Michał

Mateusz Bogusz
Guest

Fri Oct 19, 2018 7:27 pm   



W dniu 14.10.2018 o 23:06, Michal M. Lechanski pisze:
Quote:
Dziękuję za wszystkie odpowiedzi, w końcu okazało się że tym razem
if...else zupełnie wystarczyło.

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

--
Pozdrawiam,
Mateusz Bogusz

elektroda NewsGroups Forum Index - Elektronika Polska - Jak używać stringów w Arduino z funkcjami podobnymi do switch... case?

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map