Можно ли использовать диапазон в switchcase, как в Паскале?
в операторе case в Паскале я могу использовать это:
Var i : integer;
...
Case i of
1..5 : DoSomething;
end;
Мне было интересно, есть ли способ сделать это с помощью C/C++ в компиляторе Arduino, используя:
switch (var) {
case 1..5:
// statements
break;
или это возможно только с использованием if/else?
@Jelle Bleeker, 👍1
2 ответа
Лучший ответ:
Короткий ответ: Нет
Более длинный ответ: каждый случай в операторе switch должен быть дискретным значением (вот почему float и double тоже не будут работать), но есть способ обойти это. В порядке предпочтения:
A) Используйте функцию «сквозного пропуска»
switch (value)
{
case 1: // Преднамеренное падение
case 2: // Преднамеренное падение
case 3: // Преднамеренное падение
case 4: // Преднамеренное падение
case 5:
DoThingA();
break;
case 6:
DoThingB();
break;
}
Б) Измените логику так, чтобы диапазон был установлен по умолчанию (не очень хорошо, но если у вас нет другого выбора):
switch (value)
{
case 6:
DoThingB();
break;
default:
DoThingA();
break;
}
C) Использовать вспомогательную функцию (действительно некрасиво, но...). Должна быть веская причина не вызывать DoThing() из вспомогательной функции.
enum DoOptions {EOptionA, EOptionB};
DoOptions DoWhat (int value)
{
if (value < 6) return EOptionA;
return EOptionB;
}
switch (DoWhat(value))
{
case EOptionA:
DoThingA();
break;
case EOptionB:
DoThingB();
break;
}
В компиляторах avr-gcc/avr-g++ (используемых в Arduino IDE для плат Arduino на базе AVR) доступны некоторые расширения GNU. Одно из них — поддержка ...
для случая
:
switch (i)
{
case 10 ... 100: Serial.println(F("First")); break;
case 101 ... 1000: Serial.println(F("Second")); break;
default: Serial.println(F("Everything else")); break;
}
Но это не часть стандарта C/C++, это просто расширение компилятора, поэтому есть вероятность, что оно не скомпилируется на разных платформах (в основном, из-за разных компиляторов). Поэтому лучше избегать его в переносимом коде.
- Как запрограммировать ардуино на чистом C/C++?
- RtcDateTime' не называет тип
- как отправить аргумент объектам ESP8266WebServer в функции
- Какие Arduino поддерживают ATOMIC_BLOCK?
- GSM-модуль IOT-GA6 Arduino + ошибка CME 58
- Разница между массивом char и массивом unsigned char
- Не могу использовать uint16_t в библиотеке
- Как объединить два значения в строку?