C++ Символ из массива char

Исключительно для себя недавно начал изучать c++. Столкнулся с тем, что (не) совсем (не) понимаю, как работают массивы char. Суть проблемы:

//uint8_t = insigned int 8 bit (arduino)
//font_index = массив с предустановками шрифта для символа, индекс = байт

char* test= "RRE";                           //Создаю "строку"
for (uint8_t i = 0; i < strlen(test); i++)
{
  char c = test[i];                            //Успешно получаю символ
  uint8_t charIndex = font_index[(uint8_t)c];  //Трагически фейлюсь
}

Однако если я пропишу char c = 'R', или любой другой символ, все работает. Так же, если вместо i прописать к примеру 1, то все так же работает. У меня не осталось версий.

Прошу помощи разобраться, как правильно выдрать символ из массива char. Так же буду рад статьям на эту тему, чтобы закрыть этот вопрос для себя навсегда.

Уточнение: Полный код будет выглядеть так:

char* test= "RRE";
for (uint8_t i = 0; i < strlen(test); i++)
{
  char c = test[i];символ
  uint8_t charIndex = font_index[(uint8_t)c];
}

//из этого массива мне нужно получить число, которому соответствует байт символа
const int16_t PROGMEM font_index[] = {
-1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, 
0, 1, 2, 3, 4, 5, 6, 7, 
8, 9, -1, -1, -1, -1, -1, -1, 
-1, 10, 11, 12, 13, 14, 15, 16, 
17, 18, 19, 20, 21, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 
33, 34, 35, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, 
};

Ответы (1 шт):

Автор решения: matMoteX

Разобрался с проблемой. Суть в том, что модификатор PROGMEM говорит компилятору прописать данные не в ОЗУ, а во флеш память. Отсюда изменяется способ доступа к ней. Для этого необходимо использовать следующие функции:

pgm_read_byte(data); – для 1-го байта (char, byte, int8_t, uint8_t)
pgm_read_word(data); – для 2-х байт (int, word, unsigned int, int16_t, int16_t)
pgm_read_dword(data); – для 4-х байт (long, unsigned long, int32_t, int32_t)
pgm_read_float(data); – для чисел с плавающей точкой

Источник: https://alexgyver.ru/lessons/progmem/

В моем случае это было:

//uint8_t charIndex = font_index[(uint8_t)c];
uint8_t charIndex = pgm_read_word(&font_index[(uint8_t)c]);
→ Ссылка