Как сделать цикл for над встроенным анонимным массивом

c++ platformio

У меня есть куча пинов с именами в заголовке:

#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 только для одной итерации?

, 👍0

Обсуждение

определить массив dip[0], dip[1] ...., @jsotola

Что касается «риска» создания массива в SRAM, он в любом случае будет уничтожен при выходе из функции, в которой он определен, обычно setup(). Если вы явно определяете массив, вы все равно можете сканировать его с помощью диапазона C++11 на основе цикла for, что может улучшить внешний вид программы., @6v6gt


2 ответа


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

2

Я пытаюсь обогатить свои навыки C++ & будь модным

Возможно, Arduino Mega — неподходящая платформа для изучения модного C++. Среда разработки не поддерживает все современные материалы C++. В конкретно...

фатальная ошибка: initializer_list: нет такого файла или каталога

... он основан на avr-libc, библиотеке C с ограниченной поддержкой. для С++.

может я с уверенностью могу предположить, что компилятор просто развернет весь дело за кадром

Нет, нельзя. Среда разработки Arduino по умолчанию вызывает avr-gcc с параметром -Os. флаг, что означает «оптимизировать размер кода». Развертывание цикла — это своего рода компромисса между пространством и скоростью компилятор вряд ли сделает с этим настройка оптимизации. Вы можете дизассемблировать файл .elf, если хотите знаю точно.

существует ли реальный риск, что фактически будет объявлен настоящий массив в SRAM просто повторить один раз?

Я предлагаю вам последовать совету jsotola и объявить массив самостоятельно. Вы можете объявить массив PROGMEM, если хотите избежать траты оперативной памяти. Но учитывая, что он не должен занимать более 6 байт (как uint8_t[]), Лично я бы даже не заморачивался.

,

1

Эдгар Боне ответы, почему 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. Однако многое можно сделать, если вы действительно этого хотите. Что касается эффективности, вы должны протестировать ее.

,