2014-09-10 5 views
4

я получаю эту ошибку компиляции из-за этой линией, предназначенной для увеличения указателя на 0x200 (для точки к следующему сегменту)выражение должно иметь целочисленный тип

Flash_ptr = Flash_ptr + (unsigned char *) 0x200; 

I'v видел this, но я не сделал используйте любой незаконный символ!

P.S. Инициализация указателя:

unsigned char * Flash_ptr = (unsigned char *) 0x20000; 
+4

Язык не позволяет добавлять указатели (это не имеет большого смысла). Вместо этого вы можете добавить интегральное значение. – juanchopanza

ответ

4

Вы не можете добавить два указателя. Вы можете добавить целое число в указатель, и вы можете вычесть два указателя для получения целочисленной разницы, но добавление двух указателей не имеет смысла. Для того, чтобы решить вашу проблему поэтому вам просто нужно снять гипс:

Flash_ptr = Flash_ptr + 0x200; 

Это увеличивает Flash_ptr по 0x200 элементов, но так как Flash_ptr имеет тип unsigned char *, то это просто приводит к приращению 0x200 байт.

Для того, чтобы сделать эту часть петли и проверить на верхнюю границу вы могли бы сделать что-то вроде этого:

while (Flash_ptr < (unsigned char *)0x50000) // loop until Flash_ptr >= 0x50000 
{ 
    // ... do something with Flash_ptr ... 
    Flash_ptr += 0x200; 
} 
+0

Вы правы, что ошибка исчезла, но как я могу проверить, указывает ли указатель на адрес 0x50000 или меньше? Это не работает: \t while (Flash_ptr <0x50000) –

+0

Не было бы лучше упомянуть неверный указатель * дополнение *, используемый в коде OP. –

+1

@OgeeGee: вам нужно явно преобразовать один из операндов, например. 'while ((uintptr_t) Flash_ptr <0x50000)'. – mafso

0

Вы не можете добавлять два указателя. То, что вы можете сделать, это приращение адрес, удерживаемый указателем. Удалите литье (unsigned char *).

Если вам интересно, читайте больше о pointer arithmatic here.

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