Sprintf() e valori float

Come è ben noto, per limitare le dimensioni del codice generato, il "core" di Arduino è predisposto per NON includere il supporto dei float/double nelle funzioni tipo sprintf() che fanno parte di <stdio.h>.

Se difatti prendete questo banale programma:

double f = 12.5;
char sf[10];

void setup() {
   delay ( 500 );
   Serial.begin ( 115200 );
   sprintf ( sf, "%f", f );
   Serial.print ( "Valore di f: " );
   Serial.println ( sf );
}

void loop() {
   delay ( 500 );
}

... vedrete che stamperà sul monitor seriale "Valore di f: ?" ovvero, NON effettuerà la conversione in stringa del float.

Ora, se siete disposti a sacrificare circa 1.5 KBytes in più di memoria programma (flash) allora e abbastanza facile attivare il supporto dei float/double nel IDE classico.

Quello che dovrete fare è create un file di testo (mi raccomando, NON deve contenere caratteri speciali o formattazioni, solo testo) di nome "platform.local.txt" ed al suo interno ci dovete mettere questa stringa:

compiler.c.elf.extra_flags=-Wl,-u,vfprintf -lprintf_flt -lm

... salvato il file lo dovete copiare nella cartella relativa alla piattaforma AVR di Arduino, quella dove si trovano anche i files "board.txt", "platform.txt", "programmers.txt" e varie cartelle.

ATTENZIONE, se usate la versione "portable" del IDE, dovete andare dentro "portable" >> "packages" >> "arduino" >> "hardware" >> "avr" >> "1.8.5" (l'attuale versione del "core", in futuro questa cartella potrebbe cambiare nome).

Fatto questo rilanciate l'IDE, compilate, eseguite e ... "Valore di f: 12.5" :smiley:

Spero possa essere utile ... :wink:

Guglielmo

No :joy:

Scherzi a parte, io di solito aggiro il problema quando necessario in questo modo e se ho bisogno di più cifre decimali faccio %100, %1000 etc etc

double f = 12.5;
char sf[20];

void setup() {
   Serial.begin ( 115200 );
   sprintf (sf, "Valore di f: %d.%d", (int) f, (int) (f * 10) % 10);
   Serial.println ( sf );
}
1 Like

Si, certo, è un'altrenativa che viene sempre consigliata ... ma per chi vuole usare il %f, ora sa come poter fare :grin:

Guglielmo

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.