首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数组在Progmem错误下标?

数组在Progmem错误下标?
EN

Stack Overflow用户
提问于 2013-09-25 20:28:18
回答 3查看 406关注 0票数 1

我一直很难让这段代码正常工作。我的目标是显示字符串,这是放置在PROGMEM液晶显示器。带有指向这些字符串的指针的数组也在PROGMEM中。该函数使用一个变量调用,该变量反过来被转换为一个索引号,用于读取数组。当然,pgmspace.h包含在代码中。

我一直遇到的错误是:数组下标的类型为'char‘-Wchar-下标-初始化使指针从整数生成,而默认情况下不启用强制转换。

有人能指出我在这里错过了什么吗?

正在为AVR GCC编写代码,我的IDE是Eclipse。

代码语言:javascript
复制
    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'
        }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-09-25 20:42:58

这应该可以做到:

代码语言:javascript
复制
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,也有闪存语法,允许摆脱所有的pgm_read_*和*_P机器。我从来没测试过所以YMMV。

票数 3
EN

Stack Overflow用户

发布于 2013-09-25 20:36:44

tempText[x]arrayWaveform[hex]中,索引是signed char类型的,它也可以占用负值。

将其更改为unsigned char

请参见GCC警告

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

票数 1
EN

Stack Overflow用户

发布于 2013-09-25 20:31:44

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

在这两行中,您都应该将变量转换为int,或者首先将它们声明为int

至于另一个错误,我猜pgm_read_byte返回一个原始char,您尝试将它分配给char*,这是不可能的。您可能应该从pgm_read_byte返回一个指针

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19014592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档