Как сделать цикл for над встроенным анонимным массивом
У меня есть куча пинов с именами в заголовке:
#define DIP5 53
#define DIP4 52
#define DIP3 51
#define DIP2 50
#define DIP1 49
#define DIP0 48
Если это не очевидно, у меня есть куча DIP-переключателей, подключенных к цифровым контактам 48..53 на Arduino Mega2560
В setup() мне нужно установить для них все значение INPUT_PULLUP. Я знаю, что, вероятно, будет меньше усилий, если просто выполнить серию команд pinMode, например:
pinMode(DIP5, INPUT_PULLUP);
pinMode(DIP4, INPUT_PULLUP);
// ... и так далее
... но я пытаюсь обогатить свои навыки C++ & быть причудливым, поэтому я пытаюсь понять, как объявить анонимный массив и выполнить через него foreach... что-то вроде:
for (int pin : {DIP5, DIP4, DIP3, DIP2, DIP1, DIP0}) {
pinMode(pin, INPUT_PULLUP);
}
... который, по-видимому, компилятор в любом случае оптимизирует до 6 встроенных команд pinMode, но позвольте мне чувствовать себя хорошо, имея красивый исходный код ;-)
за исключением... когда я пытаюсь это сделать, я получаю следующую ошибку:
ошибка: для вывода из списка инициализаторов, заключенного в фигурные скобки, требуется #include <initializer_list>
... но когда я добавляю #include <initializer_list>
, я получаю другую ошибку:
фатальная ошибка: initializer_list: нет такого файла или каталога
Есть идеи, что не так?
также... могу я с уверенностью предположить, что компилятор просто развернет все это за кулисами, или есть реальный риск, что он фактически объявит настоящий массив в SRAM только для одной итерации?
@Bitbang3r, 👍0
Обсуждение2 ответа
Лучший ответ:
Я пытаюсь обогатить свои навыки C++ & будь модным
Возможно, Arduino Mega — неподходящая платформа для изучения модного C++. Среда разработки не поддерживает все современные материалы C++. В конкретно...
фатальная ошибка: initializer_list: нет такого файла или каталога
... он основан на avr-libc, библиотеке C с ограниченной поддержкой. для С++.
может я с уверенностью могу предположить, что компилятор просто развернет весь дело за кадром
Нет, нельзя. Среда разработки Arduino по умолчанию вызывает avr-gcc с параметром -Os
.
флаг, что означает «оптимизировать размер кода». Развертывание цикла — это своего рода
компромисса между пространством и скоростью компилятор вряд ли сделает с этим
настройка оптимизации. Вы можете дизассемблировать файл .elf, если хотите
знаю точно.
существует ли реальный риск, что фактически будет объявлен настоящий массив в SRAM просто повторить один раз?
Я предлагаю вам последовать совету jsotola и объявить массив самостоятельно.
Вы можете объявить массив PROGMEM
, если хотите избежать траты оперативной памяти.
Но учитывая, что он не должен занимать более 6 байт (как uint8_t[]
),
Лично я бы даже не заморачивался.
Эдгар Боне ответы, почему for (int pin : {DIP5, DIP4, DIP3, DIP2, DIP1, DIP0}) {
не работает. Что вы получите (где поддерживается) с этим синтаксисом, так это initializer_list
, который сам по себе не является типом массива, хотя он поддерживается массивом .
Если вы действительно хотите сделать что-то подобное тому, что вы можете сделать с Arduino на основе AVR:
for (int pin : (const int []){DIP5, DIP4, DIP3, DIP2, DIP1, DIP0}) {
pinMode(pin, INPUT_PULLUP);
}
Технически это не стандартный C++. Это использование чего-то, называемого составным литералом, который используется для создания типизированного значения массива. . Это особенность языка C (начиная с C99), а не C++. Однако компилятор и его конфигурация для Arduino позволяют использовать его как расширение языка.
Стоит ли это делать? Возможно нет, по причинам, на которые указывают Edgar, 6v6gt и jsotola. Однако многое можно сделать, если вы действительно этого хотите. Что касается эффективности, вы должны протестировать ее.
- Тот же код работает на Arduino IDE, но не в PlatformIO IDE
- Почему игнорируется параметр чувствительности (порог)
- C++ против языка Arduino?
- Как использовать SPI на Arduino?
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- Ошибка: expected unqualified-id before 'if'
- Что лучше использовать: #define или const int для констант?
- Функции со строковыми параметрами
определить массив
dip[0]
,dip[1]
...., @jsotolaЧто касается «риска» создания массива в SRAM, он в любом случае будет уничтожен при выходе из функции, в которой он определен, обычно setup(). Если вы явно определяете массив, вы все равно можете сканировать его с помощью диапазона C++11 на основе цикла for, что может улучшить внешний вид программы., @6v6gt