printf() ....stampa codice binario?

Buongiorno,

vorrei "stampare" nel monitor seriale una stringa descrittiva alla quale agganciare un numero in formato binario; esiste una funzione tipo printf() che faccia questo?
Se non ho letto male printf() non comprende il tipo binario (%B ?).
Ne avrei necessità in quanto sto tentando di creare un convertitore da bit a gray e vice versa e avrei necessità di avere il dato convertito.

grazie

Lascia stare printf() su Arduino, usa invece:

Serial.println (x, BIN);

così "semplicemente"!?...maledetta ignoranza (la mia)...grazie!

La printf() è standard del C, ma per un C che gira su un PC dove hai un monitor/video.

Arduino non prevede un monitor :slight_smile:
In Arduino al massimo si sparano i dati via seriale (il comando indicato da Sukko) e poi dentro l'IDE li vedi con il Monitor Seriale. (questo per dire che il comando indicato NON potrai usarlo per stampare su eventuale lcd o tft che potresti collegare ad Arduino)

@nid69ita: ah ok...grazie anche per questa info.

al momento mi basta quello che vedo nel monitor seriale...quello che sto facendo è solo per esercizio...

grazie ancora

in realta’ la printf puo’ essere riscritta o adeguata anche per la seriale

c’e’ pero’ una faccenda molto piu’ delicata, ovvero la printf … e’ unsafe
andava bene prima che inventassero il C++, ma oggi e’ da evitare!

***deprecated, sconsigliata per nuovi progetti

ci sono diverse scuole di pensiero, mi sono “scontrato” con chi
tra i PRO annovera il fatto che e’ molto comoda perche’
infili diversi parametri (di fatto quanti ne vuoi) e questi
sono interpretati da una stringa

p.e.

“%lx” dice di gestire quanto segue come un uint32_t in hex format
“%ld” dice di gestire quanto segue come un sint32_t in dec format
“%lu” dice di gestire quanto segue come un uint32_t in dec format

purtroppo il formato binario non e’ annoverato dallo standard-IO
(e nemmeno il fixedpoint, a differenza del C++11 che lo prevede)
ovvero se qualche compilatore lo prevede e’ una “extra feature”
c’e’ che non essendo regolamentata, ognuno la implementa un po’
come gli pare (GNU GCC e Mikroe in primis)

non e’ un problema, ti scazzi un attimo quando devi riciclare il codice
perche’ dipende dal compilatore

ma tornando alla printf del C, cosa succede se uno sbaglia la formattazione?

p.e.
printf("%s", 0xdeadbeaf);

il format “%s” dice a printf che quanto segue e’ una stringa
e invece compare una costante a 32bit, tale 0xdeadbeaf

il risultato, visto che il C e’ a-tipizzato, che le stringe sono un array di char
con in coda un terminatore ‘\0’, e la printf su questo ci va marcia sopra
e’ che su arduino il programa va in crash (provare per credere)
su linux va in segmentation fault, che e’ una forma di crash dove l’OS
per fortuna prende in mano le redini e vi restituisce il controllo
mentre se giocate con le kprintf in kernel space ottenete un kernel panic
con tanto di macchina piantata (tocca dare un reset fisico o unplug)

in C++ il problema non si pone perche’ si sfruttano operatori tipizzati
tipicamente serial.out << number << string << stend;

e’ intrinsecamente impossibile commettere lo stesso errore :smiley:

su Arduino c’e’ la serial.print di compromesso
dovuto al fatto che usare l’overload degli operatori
costa un bel po’ di overhead

mai letto così tante stupidaggini tutte in una volta sola.

Intervengo solo per dire che la printf() non è deprecata se non nel mondo delle marmotte.
Secondo, la printf() funziona anche su Arduino, ed è tutto ben dettagliato nella avr-libc.
Molti compilatori, tra i quali gcc, permettono di controllare la formattazione della printf() quindi verrà scatenato un warning talora si passasse un int invece di un puntatore a char.
Se volete aggiungere tale feature anche alle vostre funzioni che fanno uso di tale formattazione basta aggiungere l'attributo format.

Nemmeno il C++ è immune alle cavolate che la gente può scrivere/inventare.

vbextreme:
la printf() non è deprecata se non nel mondo delle marmotte

lo dice gente tipo Kate Gregory
lei, oltre ad avere diversi anni di esperienza nell'industria
con varie collaborazioni con aziende del calibro di Microsoft
e' pure docente computer science, molto apprezza per alro

vbextreme:
Secondo, la printf() funziona anche su Arduino,
ed è tutto ben dettagliato nella avr-libc

embe? entrambi punti che non smuovono di una virgola
il fatto che sia unsafe e deprecata

vbextreme:
Molti compilatori, tra i quali gcc
permettono di controllare la formattazione della printf()
quindi verrà scatenato un warning talora si passasse

embe? dove il codice e' serio la printf e' vietata
da almeno 4 regole Misra, pertanto vietata in Avionica
in Automotive, Ferroviario, etc etc

oltre al fatto per le teorie dei linguaggi e traduttori
e' abbastanza inconsistente che debba essere un "warning" a tutelarti
(anche perche' di fatto non ti tutela)
linguaggi come Ada ti darebbero una sonora bacchettata
ogni volta che tenti di de-tipizzare

cosa che invece ti tocca fare per la printf

e puoi usare tutti i warning che ti pare
tanto la printf usa funzioni di stack, e cio' la rende unsafe

oltre al fatto che, se definisci una funzione simile alla printf
nessuno potrebbe analizzare cosa passi come parametro

difatti tocca farlo a mano, dove e quando puoi permetterti
di pagare una squadra di revisori, tutti consulenti

ergo e' del tutto sbagliato come approccio
uno spreco di risorse e di tempo
che va avanti quasi solo per inerzia e cattive abitudini

vbextreme:
Se volete aggiungere tale feature anche alle vostre funzioni
che fanno uso di tale formattazione basta aggiungere l'attributo format.

cosi' poi ognuno la definisce come gli pare (continua ad accadere)
col risultato che la portabilita' del codice e' un continuo colabrodo

vbextreme:
Nemmeno il C++ è immune alle cavolate che la gente può scrivere/inventare.

come il codice colabrodo che hai in firma?
capisco ora che e' meglio evitare di risponderti in futuro
di tempo da buttare ne ho veramente poco

una cosa pero' te la dico: impara l'educazione
e impara a programmare

detto ciò', torno ai fatti miei

Direi che la cosa si può fermare qui …
… ciascuno ha le sue idee ed è inutile far proseguire un thread che, vista l’aria che tira … mi toccherebbe forse chiudere con qualche BAN ::slight_smile:

Guglielmo

P.S.: tralasciando OGNI considerazione sull’uso della printf(), comunque, su Arduino, basta include <stdio.h> che fa parte di AVR libc (… sempre inclusa dall IDE) per averla.