的类型的无效操作数的挥发性uint8_t *和'uint8_t(*)(invalid ope

2019-10-22 06:59发布

我有一个地址/指针转换问题

我曾跟随与开箱即用的recive(uint8_t * BUF,uint32_t的* LEN)代码; 功能,当数据中断recived正在拼命地跑异步

uint8_t UserRxBufferFS[APP_RX_DATA_SIZE]; //static buffer 

volatile uint8_t * __usrRxIndex = UserRxBufferFS; //volatile pointer to data end


static int8_t recive (uint8_t* Buf, uint32_t *Len)
{
    uint8_t result = USBD_OK;
    //copy *Len number of data from Buf to UserRxBufferFS 
    memcpy(UserRxBufferFS+__usrRxIndex, Buf, *Len);

    if( (uint32_t)( (__usrRxIndex )- UserRxBufferFS) + *Len > 0xff){ //calculate buffer overflow
        __usrRxIndex = UserRxBufferFS; //buffer
    } else {
        __usrRxIndex += *Len;
    }
} 

然后我试图通过挥发__usrRxIndex,即每次更新数据时捕获赶上数据结束。

但是,当我试图编译这个使用G ++ compilator我得到错误:

error: invalid operands of types 'volatile uint8_t* {aka volatile unsigned char*}' and 'uint8_t (*)[512] {aka unsigned char (*)[512]}' to binary 'operator-'

我做了一些变通方法和计算每个地址号码,然后做减法,但我的问题是,为什么G ++ compilator不要让数组和指针减法? 一些简单的方法来没有得到这个错误?

Answer 1:

memcpy(UserRxBufferFS+__usrRxIndex, Buf, *Len);

这除了不应该将其编译并没有什么意义。 你可能想:

memcpy(__usrRxIndex, Buf, *Len);

另一件事是,你发现缓冲区溢出后memcpy已经损坏的内存。 它需要之前检测缓冲区溢出memcpy



文章来源: invalid operands of types 'volatile uint8_t* and 'uint8_t (*)