指针内存错误

时间:2009-04-18 18:44:27

标签: c embedded avr

问题

当使用返回Flash中所需模式地址的函数时,我无法从闪存中获取数据(在下面的示例中仅使用1个常量简化:PATTERN_P)。

解释前的一些代码

类型patternp定义为

typedef prog_uchar patternp[NUM_ROWS]; 

全局PATTERN_P变量是patternp类型的数组,定义为

const patternp PATTERN_P PROGMEM = {
   0b11110000 ,
   0b10010000 ,
   0b10010000 ,
   0b10010000 ,
   0b11110000 ,
   0b10000000 ,
   0b10000000 ,
   0b10000000 
};

getpattern():

const patternp * getPattern()
{
      //... 
      return &PATTERN_P;
}

主要():

const patternp *bufferPattern = getPattern();

uint8_t rowPatternData[NUMBER_ROW_PER_MATRIX];
const patternp *bufferPattern = getPattern(s[iLetter]);  
for(int iRow = 0; iRow<NUMBER_ROW_PER_MATRIX; iRow++)
{  
    rowPatternData[iRow]=pgm_read_byte( &PATTERN_P[iRow] );   // <--- WORK!
    rowPatternData[iRow]=pgm_read_byte( bufferPattern[iRow] ); // Not Working! 

}

吃茶

正如您所看到的,代码获取模式(在此示例中,它将每次返回P​​ATTERN_P ...而不是使用pgm_read_byte从闪存中获取数据。这使用AVR pgmspace(下面的链接)。它需要一个地址并返回数据。当我使用模板的直接访问时,上面的代码工作:&amp; PATTERN_P [iRow],但是当我使用bufferPattern [iRow]或&amp; bufferPattern [iRow]时将无法工作。有什么想法吗?

参考:pgm_read_byte在pgmspace

中定义

2 个答案:

答案 0 :(得分:4)

bufferPattern是一个指向数组的指针。当你编写bufferPattern [iRow]时,这不会评估指向patternp的入口iRow的指针; []操作作用于指针,而不是它指向的数组。你似乎想写的是&amp;((* bufferPattern)[iRow]。

这将解决眼前的问题。但是,代码有点令人困惑。通过直接传递数组可能会简化您的代码(C不会按值传递数组;因此它不会复制数组 - 您不需要指向数组以避免这种情况)。

答案 1 :(得分:1)

&PATTERN_P[iRow]

&(PATTERN_P[iRow])

当你的工作线给出时:

(&PATTERN_P)[iRow]