Определение массива в 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 в той же области. Есть ли лучший способ закодировать это?

, 👍0


3 ответа


Лучший ответ:

3

Если вы хотите объявить несколько переменных с одним и тем же именем внутри разных операторов Case, вы можете заключить код внутри каждой из них в фигурные скобки:

case 1:{
    Code...
break;}
case 2:
...

Кудрявые скобки установят ограничения области действия переменных именно в этом случае.

,

0

Хотя я не отговариваю вас делать это самостоятельно. Я бы пошел по простому пути и использовал доступную библиотеку. Как есть или, если необходимо, после внесения изменений. Для меня это лучший способ, поскольку я не очень хорош в программировании.

https://learn.adafruit.com/adafruit-neopixel-uberguide/neomatrix-library

И это выглядит хорошо.

FastLED NeoMatrix

Лучшая поддержка ESP32, чем Adafruit::Neopixel

https://github.com/marcmerlin/FastLED_NeoMatrix

,

0

Я вижу несколько проблем с вашим кодом.

Во-первых, это вопрос «объема». Если вы определите 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[] несколько раз в одной области. (что является нет-нет)

,