Durante una sessione di debug, ho scoperto che snprintf non funziona come previsto quando si comilla il codice con avr-gcc. Il codice di esempio dovrebbe semplicemente convertire il valore in virgola mobile 3999.9f nella sua rappresentazione di carattere.snprintf non funziona come previsto con avr-gcc
Qui è un banco di prova minima:
int TestSnprintf(void)
{
const float inputValue = 3999.9f;
/* Print with a fixed width of 6 characters (5 numbers and 1 dot).
The buffer must have a length of 7, because snprintf appends a '\0' at the end. */
char buf[7U] = {0, 0, 0, 0, 0, 0, 0};
const uint8_t bufferSize = 7U;
if(6 != snprintf(buf, bufferSize, "%06.1f", inputValue))
{
return -1;
}
if(buf[0] != '3'
|| buf[1] != '9'
|| buf[2] != '9'
|| buf[3] != '9'
|| buf[4] != '.'
|| buf[5] != '9'
|| buf[6] != '\0')
{
return -2;
}
return 0;
}
int main(void)
{
int retVal = TestSnprintf();
return 0;
}
compling questo codice di esempio con avr-gcc e funzionante con Atmel Studio 7 dà un valore di ritorno di -2. Ciò significa che snprintf non funziona.
E se avessi provato fino ad ora?
- Ho testato il codice su 32 e 64 Linux e funziona come previsto (TestSnprintf restituisce il valore 0).
- Ho testato il codice con Visual Studio 2015 e ha funzionato come previsto (TestSnprintf restituisce il valore 0).
Il contenuto di buf è
buf[0] = 32; buf[1] = 32; buf[2] = 32; buf[3] = 32; buf[4] = 32; buf[5] = 63; buf[6] = 0;
La prova viene eseguita sul dispositivo tramite l'interfaccia JTAG. Ho provato anche il simulatore, con lo stesso risultato.
- Non è attivata l'ottimizzazione del compilatore. Il codice è compilato e sottoposto a debug con -O0.
Ecco uno screenshot della sessione di debug, che dimostra che il valore di ritorno è -2.
Ciò dimostra che buf è portata durante il debug:
Domanda
quello che sto facendo di sbagliato?
SOLUZIONE
Prima di tutto grazie a tutti molto per il vostro aiuto! Come ha sottolineato @manilo le seguenti opzioni di linker mancavano:
-Wl,-u,vfprintf -lprintf_flt -lm
E la libreria C standard non fa parte di gcc! Quale libreria usi? – Olaf
Dovresti scoprire cosa contiene effettivamente "buf". –
Ti sei collegato con 'libm'? ('-lm') – fukanchik