Il s'agit d'une solution optimisée en termes de vitesse pour la conversion de int (entier signé de 16 bits) en chaîne de caractères.
Cette mise en œuvre évite d'utiliser la division puisque l'AVR 8 bits utilisé pour l'Arduino n'a pas d'instruction DIV matérielle, le compilateur traduit la division en soustractions répétitives qui prennent du temps. La solution la plus rapide est donc d'utiliser les branches conditionnelles pour construire la chaîne.
Un tampon fixe de 7 octets préparé dès le début en RAM pour éviter l'allocation dynamique. Comme il ne s'agit que de 7 octets, le coût de l'utilisation de la RAM fixe est considéré comme minimal. Pour aider le compilateur, nous ajoutons un modificateur de registre dans la déclaration des variables 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() {}
Ce sketch est compilé en 1 082 octets de code à l'aide de 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 l'objet String qui a été compilé en 2,398 octets, cette implémentation peut réduire la taille de votre code de 1.2 Kb (en supposant que vous n'avez pas besoin d'une 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 un code assembleur approprié.
4 votes
@Pubby "printf() rend votre objet exécutable ~1000 octets plus grand, donc vous pouvez ne pas vouloir l'utiliser si la taille est un problème." playground.arduino.cc/Main/Printf
1 votes
Related ( no un duplicata) : Convertir un int ou un String en un tableau de chars sur Arduino