因此,我试图在我的Arduino上的程序内存中存储一个多维CHAR数组,并且我很难让它正常工作。这是我拥有的..。
typedef unsigned char RGBBitmap[8][8][3];
typedef prog_uchar ProgRGBBitmap[8][8][3]; // Have to use prog_uchar for stuff stored in progmem
ProgRGBBitmap Mailbox[3] PROGMEM =
{
... // some initializing data
};根据PROGMEM文档,要获得指向char数据的指针,应该使用pgm_read_word调用。不过,当我试着用这个读出来的时候.
RGBBitmap * pMailbox0 = (RGBBitmap*)pgm_read_word( &Mailbox[0] );...all我回来就是垃圾。
如果我删除PROGMEM行,只使用RGBBitmap指针并删除pgm_read_word,它就能工作,但它在内存中工作,这是我无法使用的。
我在这里错过了什么?
发布于 2014-08-30 02:27:02
数组是一个值块。就像这样,您的代码定义了一个连续的值块:
ProgRGBBitmap Mailbox[3] PROGMEM = {...};
... removing typedef is same as ...
prog_uchar Mailbox[3][8][8][3] = {...};因此,您不能从程序内存中读取指针,因为它们没有存储在那里。街区都是布哈尔的。
您的所有值都是字节,因此您可以用以下方法读取该块中的任何值:
uc = (uchar)pgm_read_byte( someaddress );现在,4维数组的棘手部分是使地址语法正确。
uc = (uchar)pgm_read_byte( &Mailbox[i][x][y][c] );编译器将插入i.c的指针算法,这在循环中可能是浪费的。所以你可以预先计算出指针的一部分,我想这是你想要完成的。像这样的东西可以节省一些代码和时钟:
ProgRGBBitmap* ptrOneBox = &(Mailbox[i]); // this will be pointer into block
for(x ...
for(y ....
uc = (uchar)pgm_read_byte( &(ptrOneBox[x][y][c]) ); // this indexes out one byte当指针和数组不起作用时,会使你发疯。在没有调试器的平台上加入PROGMEM .
把这个问题简化为一个简单的例子,然后重新开始工作。
https://stackoverflow.com/questions/25575056
复制相似问题