A proposito di sprintf

Ciao a tutti

In seguito a una discussione di alcuni giorni fa sono andato a documentarmi su sprintf, ma mi sembra che in alcuni casi nascano problemi se voglio usare una variabile a 8 bit... Che cosa succede se per dei valori numerici uso una variabile int8_t pippo?
Ci sono differenze se nella variabile pippo scrivo 'a' oppure 49?

In generale dipende da come si passa il parametro

quando scrivi 'a' è un char
quando scrivi 49 è un int
quindi il type viene eventualmente promosso a seconda di ciò che la destinazione si aspetta.

  • se scrivi
    char x = 'a';
    quindi mantieni il type di carattere, non è necessaria alcuna modifica.

  • se scrivi
    char x = 49;
    l'int viene troncato per mantenere solo il byte meno significativo (LSB) in modo che rientri in 1 byte. Dal momento che 49 si adatta all'LSB, funzionerà anche.

  • se scrivi function(49), allora 49 inizia come un int e il compilatore lo promuove a ciò che la function() si aspetta (firma della funzione)

  • se chiami function(x) allora x è un carattere che verrà promosso alla firma del parametro della function()

Bella domanda
In effetti con arduino non lo so
In C (non C++) dubito ci siano differenze
Una costante carattere come 'a' è di tipo intero, non char, si tratta di un "peccato originale" di Dennis e Brian
E quindi in C per usare 'a' come carattere serve sempre passare per un casting o per una variabile char (casting implicito) o per una specifica di formato

In C++ hanno corretto questa anomalia
E quindi dovrebbe esserci differenza

Tu hai trovato anomalie?
Quali?

Hai ragione per C, ma un carattere letterale è di tipo char in C++. Bjarne Stroustrup ha risolto il peccato originale :slight_smile:

Character literal - cppreference.com

1) Ordinary character literal, e.g. 'a' or '\n' or '\13'. Such literal has type char and the value equal to the representation of c-char in the execution character set (until C++23)the corresponding code point from ordinary literal encoding (since C++23).

l'IDE Arduino utilizza un compilatore C++, quindi 'a' è un char

In questo periodo non sto scrivendo codice, però stavo considerando l'uso futuro di sprintf, eventualmente anche per compattare un po' il mio "Geigerino" (Il contatore Geiger) che, tra una funzione e l'altra (compreso l'Easter Egg :slight_smile: ) ha riempito la memoria e ogni volta che vado a fare una modifica aggiungendo qualcosa devo inventarmi qualcosa per rubare una manciata di byte qua e là!

P.s.: l'Easter Egg è una musichetta con il testo che appare: "Radio activity is in the air for you and me".

Ah

I kraftwerk

Anni che non ci pensavo

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