У меня есть проблема с преобразованием адрес/указательнедействительные операнды типов 'летучего 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 позволяют массивы и вычитание указателя? Есть ли простой способ не получить эту ошибку?
Вы указали, что указатель нестабилен, а не данные, на которые он указывает? Это будет 'uint8_t * volatile'. –
Кроме того, вы не должны использовать [зарезервированные имена] (http://stackoverflow.com/questions/228783), например '__usrRxIndex'. –
@MikeSeymour Хорошая добыча. Вот почему IMO вы всегда должны ставить модификаторы * за то, что вы изменяете, даже если правильно разместить его перед ним. Конечно же, для 'const'. Жаль, что большинство людей, похоже, не хотят делать это последовательно :-( – JorenHeit