Il s'agit d'une solution à vitesse optimisée pour convertir un entier (entier 16 bits signé) en chaîne.
Cette implémentation évite d'utiliser la division car l'AVR 8 bits utilisé pour Arduino n'a pas d'instruction DIV matérielle, le compilateur traduit la division en soustractions répétitives chronophages. Ainsi, la solution la plus rapide consiste à utiliser des branches conditionnelles pour créer la chaîne.
Un tampon fixe de 7 octets préparé depuis le début dans la RAM pour éviter une allocation dynamique. Comme il ne fait que 7 octets, le coût d'utilisation fixe de la RAM est considéré comme minimum. Pour aider le compilateur, nous ajoutons un modificateur de registre dans la déclaration de variable pour accélérer l'exécution.
char _int2str[7];
char* int2str( register int i ) {
register unsigned char L = 1;
register char c;
register boolean m = false;
register char b; // lower-byte of i
// negative
if ( i < 0 ) {
_int2str[ 0 ] = '-';
i = -i;
}
else L = 0;
// ten-thousands
if( i > 9999 ) {
c = i < 20000 ? 1
: i < 30000 ? 2
: 3;
_int2str[ L++ ] = c + 48;
i -= c * 10000;
m = true;
}
// thousands
if( i > 999 ) {
c = i < 5000
? ( i < 3000
? ( i < 2000 ? 1 : 2 )
: i < 4000 ? 3 : 4
)
: i < 8000
? ( i < 6000
? 5
: i < 7000 ? 6 : 7
)
: i < 9000 ? 8 : 9;
_int2str[ L++ ] = c + 48;
i -= c * 1000;
m = true;
}
else if( m ) _int2str[ L++ ] = '0';
// hundreds
if( i > 99 ) {
c = i < 500
? ( i < 300
? ( i < 200 ? 1 : 2 )
: i < 400 ? 3 : 4
)
: i < 800
? ( i < 600
? 5
: i < 700 ? 6 : 7
)
: i < 900 ? 8 : 9;
_int2str[ L++ ] = c + 48;
i -= c * 100;
m = true;
}
else if( m ) _int2str[ L++ ] = '0';
// decades (check on lower byte to optimize code)
b = char( i );
if( b > 9 ) {
c = b < 50
? ( b < 30
? ( b < 20 ? 1 : 2 )
: b < 40 ? 3 : 4
)
: b < 80
? ( i < 60
? 5
: i < 70 ? 6 : 7
)
: i < 90 ? 8 : 9;
_int2str[ L++ ] = c + 48;
b -= c * 10;
m = true;
}
else if( m ) _int2str[ L++ ] = '0';
// last digit
_int2str[ L++ ] = b + 48;
// null terminator
_int2str[ L ] = 0;
return _int2str;
}
// Usage example:
int i = -12345;
char* s;
void setup() {
s = int2str( i );
}
void loop() {}
Cette esquisse est compilée à 1082 octets de code en utilisant avr-gcc qui est fourni avec Arduino v1.0.5 (la taille de la fonction int2str elle-même est de 594 octets). Par rapport à la solution utilisant un objet String compilé en 2398 octets, cette implémentation peut réduire la taille de votre code de 1,2 Ko (en supposant que vous n'avez besoin d'aucune autre méthode d'objet String et que votre nombre est strict au type int signé).
Cette fonction peut être optimisée davantage en l'écrivant dans le code assembleur approprié.