-
1. Data: 2018-10-14 10:20:37
Temat: [Arduino] Switch... case
Od: "Michal M. Lechanski" <m...@d...eu>
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ł
-
2. Data: 2018-10-14 11:46:11
Temat: Re: [Arduino] Switch... case
Od: "Grzegorz Niemirowski" <g...@p...onet.pl>
Michal M. Lechanski <m...@d...eu> napisał(a):
> 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/evaluat
e-a-string-with-a-switch-in-c
--
Grzegorz Niemirowski
https://www.grzegorz.net/
-
3. Data: 2018-10-14 12:08:15
Temat: Re: [Arduino] Switch... case
Od: Mateusz Viste <m...@n...pamietam>
On Sun, 14 Oct 2018 09:20:37 +0100, Michal M. Lechanski wrote:
> 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
-
4. Data: 2018-10-14 12:36:39
Temat: Re: [Arduino] Switch... case
Od: Marek <t...@f...pl>
W dniu 14.10.2018 o 10:20, Michal M. Lechanski pisze:
> 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
-
5. Data: 2018-10-14 13:58:28
Temat: Re: [Arduino] Switch... case
Od: "J.F." <j...@p...onet.pl>
Dnia 14 Oct 2018 10:08:15 GMT, Mateusz Viste napisał(a):
> 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.
> - 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 :-)
> - 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 ...
> - 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.
-
6. Data: 2018-10-14 23:06:47
Temat: Re: [Arduino] Switch... case
Od: "Michal M. Lechanski" <m...@d...eu>
W dniu 14.10.2018 o 09:20, Michal M. Lechanski pisze:
> 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ł
-
7. Data: 2018-10-19 21:27:40
Temat: Re: [Arduino] Switch... case
Od: Mateusz Bogusz <m...@o...pl>
W dniu 14.10.2018 o 23:06, Michal M. Lechanski pisze:
> 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