Да хоть листинг, хоть строчку..... как я понял компилятор (пользуюсь AVRStudio4) в подобных случаях чего то не понимает..... толи нескольких указателей в сравнении, толи префиксы ++/-- к указателям, толи еще чего.....
Вот простенький пример (свой код не стал показывать, т.к. сложнее разобраться будет)
Код: Выделить всё
char massiv [10];
int main (void)
{
char* pMassiv = massiv;
for (char i=0; i<10; i++)
*pMassiv++ = i;
if (*(--pMassiv) == *(--pMassiv))
PORTB = 0xff;
else
PORTB = 0x00;
while (1){}
}
Сравниваем последние 2 элемента массива, и хотя там у нас разные данные, компиль просто (молча) вырезает сравнение, и выполняет действие PORTB = 0xff, как будто у нас положительный результат сравнения.....
Код: Выделить всё
6: {
+00000024: E6E0 LDI R30,0x60 Load immediate
+00000025: E0F0 LDI R31,0x00 Load immediate
+00000026: E080 LDI R24,0x00 Load immediate
10: *pMassiv++ = i;
+00000027: 9381 ST Z+,R24 Store indirect and postincrement
9: for (char i=0; i<10; i++)
+00000028: 5F8F SUBI R24,0xFF Subtract immediate
+00000029: 308A CPI R24,0x0A Compare with immediate
+0000002A: F7E1 BRNE PC-0x03 Branch if not equal
13: PORTB = 0xff;
+0000002B: EF8F SER R24 Set Register
+0000002C: BB88 OUT 0x18,R24 Out to I/O location
+0000002D: CFFF RJMP PC-0x0000 Relative jump
13: PORTB = 0xff;
+0000002E: 94F8 CLI Global Interrupt Disable
+0000002F: CFFF RJMP PC-0x0000 Relative jump