2015-03-18 6 views
1

У меня есть проблема с преобразованием адрес/указательнедействительные операнды типов 'летучего uint8_t * и' uint8_t (*)

Я следовал код с OOTB Recive (uint8_t * Buf, uint32_t * Лен); функция, которая при запущенной асинхронно прерывают данные 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, который обновляется каждый раз, когда данные захватываются.

Но когда я пытаюсь скомпилировать это с помощью г ++ составителя я получил сообщение об ошибке:

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

Я сделал некоторые обходной путь и рассчитать каждый адрес, как число, а затем сделать вычитание, но мой вопрос, почему г ++ составитель Dont позволяют массивы и вычитание указателя? Есть ли простой способ не получить эту ошибку?

+1

Вы указали, что указатель нестабилен, а не данные, на которые он указывает? Это будет 'uint8_t * volatile'. –

+1

Кроме того, вы не должны использовать [зарезервированные имена] (http://stackoverflow.com/questions/228783), например '__usrRxIndex'. –

+0

@MikeSeymour Хорошая добыча. Вот почему IMO вы всегда должны ставить модификаторы * за то, что вы изменяете, даже если правильно разместить его перед ним. Конечно же, для 'const'. Жаль, что большинство людей, похоже, не хотят делать это последовательно :-( – JorenHeit

ответ

1

В

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

Это дополнение не следует обобщать и это не имеет смысла. Вы, вероятно, хотите:

memcpy(__usrRxIndex, Buf, *Len); 

Другое дело, что вы обнаружили переполнение буфера после memcpy уже испорченного памяти. Он должен обнаружить переполнение буфера до memcpy.

+0

Я только положил memcpy, чтобы начать показывать свое намерение, в реальном коде я проверяю два случая и заполняю его до APP_RX_DATA_SIZE, а затем начиная с 0. –

+0

Но дело было: memcpy (UserRxBufferFS + __ usrRxIndex, .. я пропустил, что два указателя не могут быть добавленной –

Смежные вопросы