我一直无法让这段代码正常运行。 我的目标是在LCD上显示放置在PROGMEM中的字符串。 带有指向这些字符串的指针的数组也在PROGMEM中。 使用变量调用该函数,该变量又转换为索引号以读出数组。 Ofcourse 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'
}
}
答案 0 :(得分: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的docs,以充分了解正在发生的事情。请注意,如果您有AVR-GCC的最新副本,还有new __flash syntax允许删除所有pgm_read_ *和* _P机制。我从未测试过,所以YMMV。
答案 1 :(得分:1)
在tempText[x]
和arrayWaveform[hex]
中,索引的类型为signed char
,也可能会占用否定值
将其更改为unsigned char
请参阅GCC Warnings:
Wchar-subscripts 如果数组下标的类型为char,则发出警告。这是一个 常见的错误原因,因为程序员经常忘记这种类型 在一些机器上签名。 -Wall。
启用此警告
答案 2 :(得分:0)
正如您的编译器所说,您正在使用char
进行数组访问。通常,数组下标必须为int
s。
在这两行中,您应该将变量转换为int
s,或者只是将它们声明为int
s。
至于其他错误,我的猜测是pgm_read_byte
会返回您尝试分配给char
的原始char*
,这是不可能的。你可能应该从pgm_read_byte