всем привет вот сегодня решил создать код создаюший ардуине виртуалную карту с адресами и столкнулся с проблемой что 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; } }
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; }
Вообще-то есть один фокус... но нужно попробовать. Действительно switch case работает только с целыми числами, при этом case вообще только с константами, но можно неявно преобразовать строку в число (например, посчитав хэш), если определить оператор приведения типа. Константы для case все же придется объявлять заранее. Ну и обходной вариант - написать функцию, которая будет сравнивать входную строку со списком образцов и возвращать номер строки в их списке, а дальше уже можно этот номер в switch case затолкать.
Вычисление хэша (если по серьезному, "правильной" функцией) для ардуины, как мне кажется, перебор с расходованием ресурса времени процессора. А вот идея с функцией определения номера строки из списка дозволенных очень даже логичная, особенно если константы для номеров строк грамотно определить с понятными именами.
Дело в том, что сравниваемый объект в данном случае представляет собой указатель на экземпляр класса String. Происходит сравнение указателей, а не данных. По этой причине нельзя сравнить оператором == массивы/строки - приходится их перебирать поэлементно.
Ай-яй-яй. Так строки сравнивать нельзя. Вы сравниваете адреса, где лежат ваши данные, а не сами данные. Пример: [CODE cpp] const char* s1 = "asdf"; char s2[16]; strcpy(s2, s1); if(s2 == s1) { Serial.println("Blablabla"); } else { Serial.println("WoW"); } [/CODE] Как вы думаете, что вы увидите в мониторе порта?
Виноват, мне надо было бы уточнить сразу. Поскольку в коде, начавшем тему, для строк использовался тип String (класс), то я также ориентировался на него, В этом случае конструкция сравнивает именно данные, поскольку для класса String оператор сравнения (==) переопределен. В связи с этим вношу уточняющую правку в свое сообщение.