gpt4 book ai didi

c++ - Progmem 中的数组下标错误?

转载 作者:行者123 更新时间:2023-11-30 01:57:12 24 4
gpt4 key购买 nike

我一直无法让这段代码正常工作。我的目标是在 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'
}
}

最佳答案

应该这样做:

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 可以写入数组末尾)。

您可能需要仔细阅读 docs关于 PROGMEM,以充分了解发生了什么。请注意,如果您有 AVR-GCC 的最新拷贝,还有 new __flash syntax这允许摆脱所有 pgm_read_* 和 *_P 机制。我从未测试过它,所以 YMMV。

关于c++ - Progmem 中的数组下标错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19014592/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com