1

我一直无法让此代码正常工作。我的目标是在 LCD 上显示放置在 PROGMEM 中的字符串。带有指向这些字符串的指针的数组也在 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'
        }
}
4

3 回答 3

3

这应该这样做:

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。

于 2013-09-25T20:42:58.473 回答
1

intempText[x]并且arrayWaveform[hex]索引的类型signed char也可以采用负值

将其更改为unsigned char

请参阅GCC 警告

Wchar-subscripts如果数组下标的类型为 char,则发出警告。这是错误的常见原因,因为程序员经常忘记这种类型是在某些机器上签名的。此警告由 -Wall 启用。

于 2013-09-25T20:36:44.810 回答
0

正如您的编译器所说,您正在使用chars 进行数组访问。通常数组下标必须是ints。

在这两行中,您应该将变量转换为ints,或者只是将它们声明为ints。

至于另一个错误,我的猜测是返回一个您尝试分配给 apgm_read_byte的 raw ,这是不可能的。您可能应该从charchar*pgm_read_byte

于 2013-09-25T20:31:44.640 回答