C : Как динамически добавлять суффикс к строке текста в цикле ‘for’ для создания ранее объявленной переменной

#c #for-loop

#c #цикл for

Вопрос:

Кто-нибудь знает, как можно добавить значение переменной к строке текста в цикле for, чтобы проверить наличие этой переменной?

 for (int i = 0; i < 16; i  )
{
    rendTarX = BUTTONCOLOR(i); //
    rendTarY = BUTTONCOLOR(i);
    writeUserInterfaceToBuffer(consoleBuffer, BUTTONCOLOR(i).chars, 
                               BUTTONCOLO(i)0.colors, BUTTONCOLOR(i).nWidth, 
                               BUTTONCOLOR(i).nHeight, rendTarX, rendTarY, 
                               userColor);
}
  

Всего у меня 16 кнопок, и я хочу записать их в экранный буфер

Все их имена начинаются с ‘BUTTONCOLOR’ и заканчиваются числом от ‘0’ до ’15’.

Заранее спасибо за любые ответы.

Комментарии:

1. «Все их имена начинаются с ‘BUTTONCOLOR’ и заканчиваются числом от ‘0’ до ’15′». Почему бы просто не использовать вместо этого массив?

2. Можете ли вы привести пример ожидаемых результатов? Неясно, спрашиваете ли вы, как использовать массив или как объединить имя и индекс.

3. Привет. Я пробовал это несколько раз, но столкнулся с проблемой, что цикл не будет использовать значение, связанное с ‘BUTTONCOLORSX00’. Он пытался втиснуть символы в rendTarX, который является int.

4. @Clonk Я бы ожидал, что цикл изменит имя используемой в данный момент переменной, добавив к ней значение ‘i’. Итак, на первой итерации это будет делать: rendTarX = BUTTONCOLOR0; На следующей итерации это будет делать: rendTarX = BUTTONCOLOR1; И так далее.

5. Вы не можете этого сделать. Имена переменных доступны только программисту, они не попадают в исполняемый файл программы. Таким образом, программа не может динамически сопоставлять имена переменных, чтобы найти правильную переменную, похоже, вместо этого вам нужно использовать массив.

Ответ №1:

Вероятно, лучший способ сделать это — использовать массив и получить к нему доступ по индексу :

 std::array<int, 16> BUTTONCOLORS = {BUTTONCOLORSX00, BUTTONCOLORSX01, ..., BUTTONCOLORSX15};
  

BUTTONCOLORS[i] предоставит вам нужную переменную.

Если вы ДЕЙСТВИТЕЛЬНО хотите объединить переменные, вы можете использовать макрос :

 #define _BUTTONCOLORS(n) BUTTONCOLORSX##n
#define BUTTONCOLORS(n) _BUTTONCOLORS(n)
  

BUTTONCOLORS(1) будет разрешен в препроцессоре как BUTTONCOLORSX1 и
BUTTONCOLORS(2) будет разрешен в препроцессоре как BUTTONCOLORSX2 .

Для разрешения макросов вам понадобится цикл компиляции, поэтому вы не можете использовать цикл for. Вы должны также выполнить цикл в макросе (потому что все решается на этапе препроцессора).

При этом я настоятельно рекомендую использовать массив, а не макрос, потому что это безопаснее и читабельнее. Использование макросов редко является хорошей идеей.

Комментарии:

1. Большое вам спасибо за это решение. Идеально!

Ответ №2:

Вместо объявления 16 переменных с похожими именами, объявите один массив.

 std::array<Color, 16> ButtonColors;
  

Если у вас есть начальные значения, укажите их все за один раз

 std::array<Color, 16> ButtonColors = { 1, 4, 9, 16, 25, ... }; // or whatever initialises Colors
  

Комментарии:

1. Спасибо за ответ. Я сделал именно это для 4-разрядных значений цвета. Собираюсь завтра переписать всю программу в объектно-ориентированном стиле.