Hello !
Si tu veux avancer ton pointeur tant que ce qu'il pointe est contenu dans une liste de caractères, soit traduit en expression régulière : « [0-9A-F= ]* », tu peux utiliser l'opérateur OU logique puisque tu utilises déjà le ET :
while ((RxBuffer[RxPtr]<'0' || RxBuffer[RxPtr]>'9') && (RxBuffer[RxPtr]<'A' || RxBuffer[RxPtr]>'F') && RxBuffer[RxPtr]!='=' && RxBuffer[RxPtr]!=' ') ++Rxptr;
;
Mais si l'ensemble de tes caractères est restreint (256 pour un char sur huit bits), le plus efficace est l'utilisation d'une table de traduction (ou translation, selon le point de vue) :
1 2 3 4 5 6 7 8
| unsigned char table [256] ={ 0 };
table['0']=1; table['1']=1; table['2']=1; table['3']=1; table['4']=1;
table['5']=1; table['6']=1; table['7']=1; table['8']=1; table['9']=1;
table['A']=1; table['B']=1; table['C']=1; table['D']=1; table['E']=1; table['F']=1;
table[' ']=1; table['=']=1;
while (table[RxBuffer[RxPtr]]) ++RxPtr; |
Avantages : c'est très rapide, c'est pas forcément plus gros que le code généré par la première méthode s'il y a beaucoup de conditions, la durée d'un tour de boucle est constante et garantie, et ça s'optimise très bien.
En plus, si tu veux analyser une autre liste de caractères, il te suffit de faire pointer « table » dessus. Tu n'as pas besoin de modifier ton code.
Les x86 proposent même une instruction dédiée : XLAT.
Partager