c++ - memcpy_p问题,如何解决?

标签 c++ arrays avr

我对自己的代码感到困惑 :-) 我正在尝试从 PROGMEM 中读取数据。当我在 PROGMEM 中只有这个数组时,这工作正常。在 PROGMEM 中添加额外的单独数组时出错。也就是说,当它在不同的代码段中定义并#included 时。放在 1 个代码中就可以了。但我希望这些数组在不同的代码段中分开。

我相信我在此处包含的最后一个函数中有错误 (callMenuItemParaName)。 这与我读出 PROGMEM 的方式有关。我认为最好使用 memcpy_P,但找不到任何关于如何准确使用它的在线解释。

我现在的代码可以工作,但只要我不在 PROGMEM 中放入另一个数组。 (此例程使用 memcpy_P 函数正常工作。但是如何在函数 callMenuItemParaName 中实现 memcpy_P?

感谢您提供的任何建议! (当然包括 pgmspace.h)

在 AVR GCC 上工作,IDE 是 Eclipse,mcu = atmega644 @ 20MHz

unsigned char (*adresParaName);

const uint8_t TEXT0[] PROGMEM = "TEXT0";
const uint8_t paraNameAtk[] PROGMEM = "Atk  ";
const uint8_t paraNameDcy[] PROGMEM = "Dcy  ";
...
const uint8_t paraNameTru[] PROGMEM = "Tru  ";
const uint8_t paraNameLight[] PROGMEM = "Light";

typedef void (*pMenu)(void);

typedef struct
{
    void (*pointer2MenuNumber)(void);
    char  VALUE;
    const unsigned char *adresParaName;
} sel_item;

const sel_item menuNumber2ItemDbase[] PROGMEM=
{
    { itemA , 0x00 , TEXT0 },
    { itemB , 0x01 , paraNameAtk },
    { itemC , 0x02 , paraNameDcy },
        ...
    { itemM , 0x05 , paraNameTru },
    { itemN , 0x05 , paraNameLight }
};

//prototypes
void callMenuItem(const sel_item *item); 
void callMenuItemValue(const sel_item *item);
void callMenuItemParaName(const sel_item *item);

// *************************************************
// callMenu
// Description:
//
// *************************************************

void callMenuItem(const sel_item *item)
{
    pMenu function = (pMenu)pgm_read_word(&item->pointer2MenuNumber);
    function();
}

void callMenuItemValue(const sel_item *item)
{
    setCursor(1,4);
    char VAL = (char)pgm_read_byte(&item->VALUE);
    char2LCD('0'+VAL);
}

void callMenuItemParaName(const sel_item *item)
{
    char tempText[5];
    char *data = (char*)pgm_read_word(&item->adresParaName);

    strcpy_P (tempText, data);
    for (uint8_t x=0;x<5;x++)
        {
        char2LCD(tempText[x]);
        }
}

我试过添加这个:

char* pstr = 0;
memcpy_P (&pstr, data, sizeof(char*));

但运气不好。 (也找不到关于 memcpy_P 的好教程,顺便说一句)

最佳答案

您的字符串有 6 个字节长(记住终止符 0),这意味着当您将 strcpy_P 放入其中时,您将溢出 tempText。请改用 memcpy_P

memcpy_P(tempText, data, sizeof tempText);

您使用 pgm_read_word 的方式就很好。

关于c++ - memcpy_p问题,如何解决?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19065968/

相关文章:

c++ - 适用于 Linux 的免费并行 (MPI) 调试器?

c - 当 scanf() 稍后输入索引 "int arr[n];"时,为什么 "n"会导致我的程序挂起?

javascript - 根据另一个数组的值对数组进行排序

python - 用 nan 替换 NumPy 整数数组中的零

compiler-errors - Arduino MEGA 中的错误状态 1

c - 尝试读取 eeprom 缓冲区,但出现此错误 - 'void value not ignored as it ought to be'

c++ - 我的 pop 函数应该采用什么参数?

c++ - glTexSubImage 会导致黑色纹理,而 glTexImage 效果很好

c - pgm_read_ 和 PROGMEM - 意外行为

c++ - 函数如何访问类对象的私有(private)数据成员?