как заставить работать switch с String ?

Тема в разделе "Флудилка", создана пользователем Redn, 2 ноя 2014.

  1. Redn

    Redn Гик

    всем привет вот сегодня решил создать код создаюший ардуине виртуалную карту с адресами и столкнулся с проблемой что swith нехочет работать со String можно это как нибудь обойти ? вот код :
    Код (Text):
    #include<Ultrasonic.h>

    Ultrasonic smY (9,8);
    Ultrasonic smX (3,2);
    //  a b s d f
    // 1
    // 2
    // 3
    // 4
    // 5
    String map1[25];
    int X,Y = 0;
    String sm2 = "1";
    String sm1 = "a";
    String sm3;
    void setup ()
    {
     
      Serial.begin(9600);
     
    }
    void loop ()
    {
     

     
    }
    void maper()
    {
      sm3 = sm1 + sm2;
     
      switch(sm3)
      {
        case "a1" : map1[1] = 1 break;
      }
    }
     
     
  2. geher

    geher Гуру

    switch в принципе не может работать со сложными типами, такими как строки, массивы. структуры.
    Логику выбора варианта по строке можно реализовать последовательностью if.
    Код (Text):

    String s;
    ...
    if (s=="a1") {
         map1[1] = 1;
    } else if (s=="a2") {
         map1[1] = 2;
    } else if(s=="b1") {
         map1[2] = 1;
    } else {
    }
     
    Другой вариант - каскад switch по символам строки.
    Код (Text):
    switch (s.charAt(0)) {
        case 'a':
            switch(s.charAt(1)){
               case '1':
                   map1[1] = 1;
                   break;
               case '2':
                   map1[1] = 2;
                   break;
               default:
                   break;
            }
            break;
        case 'b':
            switch(s.charAt(1)){
               case '1':
                   map1[2] = 1;
                   break;
               default:
                   break;
            }
            break;
        default:
            break;
    }
     
    Последнее редактирование: 13 ноя 2014
  3. Unixon

    Unixon Оракул Модератор

    Вообще-то есть один фокус... но нужно попробовать. Действительно switch case работает только с целыми числами, при этом case вообще только с константами, но можно неявно преобразовать строку в число (например, посчитав хэш), если определить оператор приведения типа. Константы для case все же придется объявлять заранее.

    Ну и обходной вариант - написать функцию, которая будет сравнивать входную строку со списком образцов и возвращать номер строки в их списке, а дальше уже можно этот номер в switch case затолкать.
     
  4. geher

    geher Гуру

    Вычисление хэша (если по серьезному, "правильной" функцией) для ардуины, как мне кажется, перебор с расходованием ресурса времени процессора.
    А вот идея с функцией определения номера строки из списка дозволенных очень даже логичная, особенно если константы для номеров строк грамотно определить с понятными именами.
     
  5. Megakoteyka

    Megakoteyka Оракул Модератор

    Дело в том, что сравниваемый объект в данном случае представляет собой указатель на экземпляр класса String. Происходит сравнение указателей, а не данных. По этой причине нельзя сравнить оператором == массивы/строки - приходится их перебирать поэлементно.
     
  6. Redn

    Redn Гик

    всем большое спасибо скоро я сделаю библеотеку позваляюшею arduino строить мини карту вокруг себя :)
     
  7. ALev

    ALev Гик

    Ай-яй-яй. Так строки сравнивать нельзя. Вы сравниваете адреса, где лежат ваши данные, а не сами данные. Пример:

    [CODE cpp]
    const char* s1 = "asdf";
    char s2[16];

    strcpy(s2, s1);

    if(s2 == s1) {
    Serial.println("Blablabla");
    }
    else {
    Serial.println("WoW");
    }
    [/CODE]

    Как вы думаете, что вы увидите в мониторе порта?
     
  8. geher

    geher Гуру

    Виноват, мне надо было бы уточнить сразу. Поскольку в коде, начавшем тему, для строк использовался тип String (класс), то я также ориентировался на него,
    В этом случае конструкция сравнивает именно данные, поскольку для класса String оператор сравнения (==) переопределен.
    В связи с этим вношу уточняющую правку в свое сообщение.
     
    Последнее редактирование: 13 ноя 2014
    ALev нравится это.