Определение массива в switch case
Я новичок в Arduino, поэтому будьте вежливы. Я пытаюсь запрограммировать свой esp32 для управления неопикселями как семисегментным дисплеем. Поэтому я беру цифру и передаю ее в регистр переключателей, а в случае переключателя указываю, какой номер светодиода должен гореть. `
function showDigits(digit){
switch(digit){
case 1:
int a[]={1,3,4,.....};
break;
case 2:
int a[]={1,3,4,6,8,...};
break;
.
.
.
default:
int a[]={1,2,3,4,5,6,7,8,9,....};
}
}
Теперь выдается несколько ошибок, включая повторное объявление массива a в той же области. Есть ли лучший способ закодировать это?
@nirmeets, 👍0
3 ответа
Лучший ответ:
Если вы хотите объявить несколько переменных с одним и тем же именем внутри разных операторов Case, вы можете заключить код внутри каждой из них в фигурные скобки:
case 1:{
Code...
break;}
case 2:
...
Кудрявые скобки установят ограничения области действия переменных именно в этом случае.
Хотя я не отговариваю вас делать это самостоятельно. Я бы пошел по простому пути и использовал доступную библиотеку. Как есть или, если необходимо, после внесения изменений. Для меня это лучший способ, поскольку я не очень хорош в программировании.
https://learn.adafruit.com/adafruit-neopixel-uberguide/neomatrix-library
И это выглядит хорошо.
FastLED NeoMatrix
Лучшая поддержка ESP32, чем Adafruit::Neopixel
https://github.com/marcmerlin/FastLED_NeoMatrix
Я вижу несколько проблем с вашим кодом.
Во-первых, это вопрос «объема». Если вы определите int a[]
внутри switch
, он будет уничтожен, как только switch
завершится, и никакой код, который не будет выполняться за пределами его скобки смогут получить к нему доступ.
Я также считаю, что массив целых чисел
здесь неправильный выбор. Было бы гораздо меньше памяти, если бы использовать массив boolean
, который означает, должен ли каждый светодиод гореть или нет. Вы можете использовать его позже вот так:
if (a[4]) { digitalWrite(LED4, HIGH); } else { digitalWrite(LED4, LOW); }
или еще лучше использовать «тройной оператор»:
digitalWrite(LED4, (a[4] ? HIGH : LOW));
Третья проблема заключается в том, что ваша функция определена неправильно и не содержит никакой информации о типе. Это C, а не Python, поэтому типы ОЧЕНЬ важны! Правильное определение вашей функции должно быть следующим:
void showDigits(int digit)
Взгляните на этот пример, который правильно скомпилировался:
void showDigits(int digit)
{
bool a[6] = {false, false, false, false, false, false};
switch (digit)
{
case 1:
a[0] = true;
a[1] = false;
break;
case 2:
a[1] = false;
break;
default:
a[0] = true;
}
if (a[4]) {
digitalWrite(4, HIGH);
} else {
digitalWrite(4, LOW);
}
};
switch..case
— это очень специфический синтаксис. Если вы не используете break;
в конце case
, выполнение фактически продолжится до следующего определения case
, и компилятор сообщит вам об этом. что вы пытались определить int a[]
несколько раз в одной области. (что является нет-нет)
- ESP32 в Arduino-IDE с FS.h и SPIFFS
- Программаторы для этой платы отсутствуют - Программирование ESP32 Cam с помощью Ardunio IDE
- Установка значения float до двух знаков после запятой
- ESP32-CAM первый: 0x8 TG1WDT_SYS_RESET загрузочный цикл
- esp32 Stack canary watchpoint срабатывает
- Проверка размера во флэш-памяти Esp32
- Ошибка Cast from 'char*' to 'uint8_t {aka unsigned char}' loses precision [-fpermissive]
- WindowsError(31, "Устройство, подключенное к системе, не функционирует") в arduino