Можно ли использовать диапазон в 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;
}
Думаю, тогда мне придется использовать операторы if. Спасибо за быстрый ответ., @Jelle Bleeker
Приведенный выше код приводит к двум (2) сообщениям компилятора: 1 предупреждению и 1 ошибке., @user3629249
Меня это не удивляет, я написал их, чтобы объяснить, что я пытался сказать в тексте, а не для того, чтобы предоставить герметичное решение проблемы. Если вы не можете прояснить проблемы самостоятельно, не стесняйтесь публиковать подробности, и я решу их для вас., @Code Gorilla
В компиляторах 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++, это просто расширение компилятора, поэтому есть вероятность, что оно не скомпилируется на разных платформах (в основном, из-за разных компиляторов). Поэтому лучше избегать его в переносимом коде.
В настройках я включил дополнительные предупреждения и добавил флаг pedantic, тогда компилятор выдает предупреждение: range expressions в switch statements is not standard. Но я все равно его использую., @Jot
- Как запрограммировать ардуино на чистом C/C++?
- RtcDateTime' не называет тип
- как отправить аргумент объектам ESP8266WebServer в функции
- Какие Arduino поддерживают ATOMIC_BLOCK?
- GSM-модуль IOT-GA6 Arduino + ошибка CME 58
- Разница между массивом char и массивом unsigned char
- Не могу использовать uint16_t в библиотеке
- Как объединить два значения в строку?
В C/C++ вам нужно написать case explicit "case A: case B: ... break;" https://www.tutorialspoint.com/cprogramming/switch_statement_in_c.htm, @Mikael Patel