Массив символов в препроцессоре
Мне нужно определить массив, который позже будет именем класса и будет указывать на него.
Например (без препроцессора):
const char *button_names[4]={"b0","b1","b2","b3"};
и позже (когда он будет определен в препроцессоре), в функции он будет вызываться как :
статическая кнопка Button2 button_names[i]
Как определить, что массив должен находиться в препроцессоре?
ОБНОВЛЕНИЕ2:
Button2 *Buttons[8] = {nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr}; // Здесь я использую до 8 дополнительных кнопок.
и позже, после чтения файла параметров: я получаю numSW
/* Пример ниже предназначен только для проверки того, могу ли я использовать такую технику — я знаю, что это не очень хороший код. Пример здесь только для 4 кнопок*/
void init_buttons()
{
for (uint8_t i = 0; i < numSW; i++)
{
if (i == 0)
{
static Button2 bt1;
Buttons[i] = &bt1;
}
else if (i == 1)
{
static Button2 bt2;
Buttons[i] = &bt2;
}
else if (i == 2)
{
static Button2 bt3;
Buttons[i] = &bt3;
}
else if (i == 3)
{
static Button2 bt4;
Buttons[i] = &bt4;
}
Buttons[i]->begin(buttonPins[i]);
if (buttonTypes[i] == 0) /* Переключатель включения-выключения */
{
Buttons[i]->setPressedHandler(OnOffSW_ON_handler);
Buttons[i]->setReleasedHandler(OnOffSW_OFF_handler);
}
else if (buttonTypes[i] == 1) /* Моментальное нажатие */
{
Buttons[i]->setPressedHandler(toggle_handle);
}
Buttons[i]->setID(i);
}
}
@Guy . D, 👍-1
Обсуждение1 ответ
void init_buttons()
{
for (uint8_t i = 0; i < numSW; i++)
{
Buttons[i] = new Button2; // <--- **Спасибо Юраю**!!!
Buttons[i]->begin(buttonPins[i]);
if (buttonTypes[i] == 0) /* Переключатель включения-выключения */
{
Buttons[i]->setPressedHandler(OnOffSW_ON_handler);
Buttons[i]->setReleasedHandler(OnOffSW_OFF_handler);
}
else if (buttonTypes[i] == 1) /* Моментальное нажатие */
{
Buttons[i]->setPressedHandler(toggle_handle);
}
Buttons[i]->setID(i);
}
}
почему бы не Button2* buttons = new Button2[numSW];
? тогда вы можете сделать buttons[i].begin()
, @Juraj
Мне нужно, чтобы Buttons[]
были определены в начале кода, что означает «глобальный» (чтобы иметь доступ к экземплярам). Я определяю его внутри функции, так как я могу использовать nunSW
, который был прочитан из файла параметров во флэш-памяти., @Guy . D
извините, да, в setup() buttons = new Button2[numSW];
, а Button2* buttons;
является глобальным, @Juraj
- Список препроцессоров платы Arduino #defines
- Зачем использовать переменную int для вывода, когда const int, enum или #define имеют гораздо больше смысла
- Определить, определены ли Serial1 и Serial2, во время компиляции
- Считается ли #ifdef __SD_H__ плохой практикой?
- Синтаксис двоичных констант
- #define выше static const int?
- Удалить функцию во время препроцессора
- Странное поведение defines - специфично ли это для Arduino и как оно работает?
Не могли бы вы рассказать о том, чего вы пытаетесь достичь?, @Edgar Bonet
@EdgarBonet - Ну, это сложно ... Я не хочу жестко кодировать количество кнопок / реле, которые есть на каждой плате. это может быть двойное реле и, возможно, до 16 реле на плате. Количество кнопок/реле хранится в файле параметров, который, очевидно, читается после определения и создания всех классов. Итак .... см. редактирование 2 в сек., @Guy . D
Я не вижу пользы от этих макросов препроцессора. Пожалуйста, объясните, **чего** вы пытаетесь достичь, а не **как** (например, с помощью препроцессора), по вашему мнению, вы можете этого достичь. Пока это выглядит как [вопрос XY] (https://xyproblem.info/)., @Edgar Bonet
@EdgarBonet Я надеюсь, что Edit 2 прояснит это, @Guy . D
Моя основная цель - определить не в коде, а читая из файла параметров, количество экземпляров
Button2
, которое мне нужно, поскольку я хочу использовать тот же код для платы 2, 4, 8, 16 реле., @Guy . Dиспользовать динамическое размещение с
new
, @Juraj@Juraj Надеюсь, я правильно объяснил себя :( .... вы поняли мою главную цель? - Можете ли вы объяснить на примере, как
new
решает ее? ?, @Guy . D@Juraj Спасибо, это было так просто., @Guy . D