Массив в Progmem неверный индекс?

У меня постоянно возникают проблемы с корректной работой этого кода.
Моя цель — показать строки, которые помещены в PROGMEM, на LCD.
Массив с указателями на эти строки также находится в PROGMEM.
Функция вызывается с переменной, которая, в свою очередь, переводится в индекс для чтения массива.
Конечно, pgmspace.h включен в код.

Ошибки, которые я продолжаю получать:
индекс массива имеет тип ‘char’ [-Wchar-subscripts] — инициализация делает указатель из целого числа без приведения [включено по умолчанию]

Кто-то может указать, что я здесь скучаю?

Работая над кодом для AVR GCC, моя IDE — Eclipse.

    const char wf0[] PROGMEM= "OFF ";
const char wf1[] PROGMEM= "SIN ";
const char wf2[] PROGMEM= "TRI ";
const char wf3[] PROGMEM= "S+T ";
const char wf4[] PROGMEM= "PUL ";
const char wf5[] PROGMEM= "P+S ";
const char wf6[] PROGMEM= "P+T ";
const char wf7[] PROGMEM= "P+ST";
const char wf8[] PROGMEM= "NOI ";
const char wf9[] PROGMEM= "N+S ";
const char wf10[] PROGMEM= "N+T ";
const char wf11[] PROGMEM= "NST ";
const char wf12[] PROGMEM= "N+P ";
const char wf13[] PROGMEM= "NPS ";
const char wf14[] PROGMEM= "NPT ";
const char wf15[] PROGMEM= "NPTS";

const char * const arrayWaveform[] PROGMEM= {wf0,wf1,wf2,wf3,wf4,wf5,wf6,wf7,wf8,wf9,wf10,wf11,wf12,wf13,wf14,wf15};

...

void showWaveform (char ctrlValue)
{
char hex = (ctrlValue & 0xf0)>>4;

char tempText[4];
char* data = pgm_read_byte(&arrayWaveform[hex]); // <<shows up both errors here
strcpy_P (tempText, data);
for (char x=0;x<4;x++)
{
char2LCD(tempText[x]);  // <<shows up error: array subscript has type 'char'
}
}

1

Решение

Это должно сделать:

void showWaveform (char ctrlValue)
{
char hex = (ctrlValue & 0xf0)>>4;
char *pstr, tempText[5];
memcpy_P(&pstr, arrayWaveform+hex, sizeof(char*));
strncpy_P(tempText, pstr, sizeof(tempText));
for (int x=0; x<4 && tempText[x] != 0; x++)
{
char2LCD(tempText[x]);
}
}

Было несколько проблем с вашим кодом. В первую очередь arrayWaveform сам хранится в PROGMEM, поэтому вы не можете просто получить к нему доступ, используя квадратные скобки. Во-вторых, tempText должно быть не менее 5 элементов (в противном случае strcpy_P может написать за концом массива).

Вы можете внимательно прочитать документы о PROGMEM, чтобы полностью понять, что происходит. Обратите внимание, что если у вас есть последняя копия AVR-GCC, есть также новый синтаксис __flash это позволяет избавиться от всего механизма pgm_read_ * и * _P. Я никогда не проверял это, поэтому YMMV.

2

Другие решения

В tempText[x] а также arrayWaveform[hex] индекс имеет тип signed char которые могут принимать отрицательные значения тоже

Измените это на unsigned char

Увидеть GCC Warnings :

WChar-подстрочные Предупреждать, если индекс массива имеет тип char. Это
частая причина ошибки, так как программисты часто забывают, что этот тип
подписано на некоторых машинах. Это предупреждение включено -Wall.

1

Точно так же, как говорит ваш компилятор, вы используете chars для доступа к массиву. Обычно индексы массива должны быть ints.

В обеих строках вы должны привести ваши переменные к intили просто объявить их intс начала.

Что касается другой ошибки, я думаю, что pgm_read_byte возвращает сырье char который вы пытаетесь присвоить char*, что невозможно. Вы, вероятно, должны вернуть указатель из pgm_read_byte

0