Dans la série LES PIEGES à IONS ...
Une fois n'est pas coutume, j'ai voulu utiliser une variable unsigned char , un byte quoi .
dans une boucle for
Code : Tout sélectionner
char CRam1[20];
void CRLF(void); //just a CR LF printout
unsigned char Ratio;
....
for (Ratio=0;Ratio<255;Ratio++)
{
ByteToStr(Ratio,CRam1);
UART1_Write_Text(CRam1);
CRLF1();
}
CRLF1();
while(1);
imprime les valeurs de 0 à 254 .. NORMAL
et avec cec i
Code : Tout sélectionner
for (Ratio=0;Ratio<256;Ratio++)
{
ByteToStr(Ratio,CRam1);
UART1_Write_Text(CRam1);
CRLF1();
}
CRLF1();
while(1);
Ratio pouvant prendre les valeurs de 0 à 255 .. reste donc inferieur à 256
on pourrait s'attendre à imprimer les valeurs de 0 à 255 !
Mais Non, c'est pas fini !
Tester le ..
part en boucle sans fin et donc plante le programme !
j'ai posé la question sur MikroC Forum
ils proposent cette solution compréhensive (avec le turn over 8 bits 255+1 =0) MAIS assez dérangeante
la notion du passage au maximum 255 étant abstraite.
Code : Tout sélectionner
Ratio = 0;
do {
...
Ratio++;
} while (Ratio>0);
Habituellement je travaille toujours avec unsigned int dans les boucles for ou while ..
donc I faudra s'attendre à ce qu'un jour ,une boucle comme celle ci
Code : Tout sélectionner
unsigned int IRatio;
for (IRatio=0;Iratio<65536;IRatio++)
{
.. blablabla
} parte en sucette aussi !
on en conclura qu'il ne faut pas s'approcher trop près des frontières ,
même si on est dans la Convention de Schengen !

