Массив символов в препроцессоре

Мне нужно определить массив, который позже будет именем класса и будет указывать на него.

Например (без препроцессора):

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);
        }
}

, 👍-1

Обсуждение

Не могли бы вы рассказать о том, чего вы пытаетесь достичь?, @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


1 ответ


0
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