Witam! Parê dni temu mia³em g³upi problem z niechcian¹ (i niepotrzebn¹) konwersj¹ niejawn¹ w if-ie. Pomog³o wprowadzenie zmiennej tymczasowej. Teraz walczê z podobnym problemem w switch-u i nie pomaga zupe³nie nic... Instrukcja switch (zmienna) generuje mi kilkanaœcie porównañ szesnastobitowych (zmienna jest typu unsigned char, promuje j¹ do inta i zaczyna porównywaæ z kolejnymi wartoœciami przy case-ach). Drgawek dosta³em jak zobaczy³em kod assemblerowy (zmienna jest w rejestrze r24):
1145 028c 9927 clr r25 //promuje mi moja zmienna do inta
1146 028e 8530 cpi r24,5
1147 0290 9105 cpc r25,__zero_reg__ //sprawdza r25 z zerem (a dopiero co sam go wyzerowal)
1148 0292 09F4 brne .+2
1149 0294 65C0 rjmp .L77
1150 0296 8630 cpi r24,6
1151 0298 9105 cpc r25,__zero_reg__ //znowu sprawdza r25
1152 029a A4F4 brge .L88
1153 029c 8230 cpi r24,2
1154 029e 9105 cpc r25,__zero_reg__ //i znowu...
1155 02a0 09F4 brne .+2
1156 02a2 43C0 rjmp .L72
1157 02a4 8330 cpi r24,3
1158 02a6 9105 cpc r25,__zero_reg__ //i znowu...
1159 02a8 2CF4 brge .L89
i tak jeszcze wiele razy (tu jest tylko próbka twórczoœci kompilatora). Co ja mam z tym zrobiæ? Nie pomaga zupe³nie nic, ani dodatkowa jawna konwersja na unsigned char, ani zmienne tyczasowe... czy w tym kompilatorze w ogóle _da_siê_ zrobiæ switcha na oœmiu bitach?