Forum: Mikrocontroller und Digitale Elektronik Printf Formatierung so möglich?


von Peter (Gast)


Lesenswert?

Hallo,

hätte gerne folgende Ausgabe:

"+XX°"

Wobei der Wertebereich von XX +90 bis -90 angezeigt werden soll.
Es soll immer eine führende 0 angezeigt werden wenn der Wert einstellig 
ist.
Außerdem soll das Vorzeichen + bzw. - angezeigt werden.
Also z.B. so: +05° oder z.B. -09°

Im positiven Bereich wird kein Vorzeichen angezeigt,
im negativen Bereich wird das - angezeigt, aber dafür keine 0
wenn der Wert einstellig ist.

Folgendes funktioniert nicht:
sprintf(buffer_lcd,"%02d%c",temp_signed,248);

Geht das mit printf überhaupt? Oder muss man sowas anders zusammenbauen?

von Peter II (Gast)


Lesenswert?

Peter schrieb:
> sprintf(buffer_lcd,"%02d%c",temp_signed,248);

teste mal mit
1
sprintf(buffer_lcd,"%c%02u%c",temp_signed<0?'-':'+',temp_signed,248);

von Daniel B. (dbuergin)


Lesenswert?

Hm, da werden jetzt wohl wieder ein paar gehässige Antworten folgen.

Grundsätzlich solltest Du in diesem Forum solche Fragen etwas genauer
formulieren:

- Welche Plattform (welcher Micrcontroller) ?
- Welcher Compiler ?
- Welche verwendeten Libraries.

Die ganze printf/sprintf Umgebung ist stark von der jeweiligen
Umgebung/Implementation abhängig. Je mehr Funktionen printf/sprintf
anbieten, je grösser sind die Libraries und je mehr Speicher wird
verbraucht, was (vorallem in der Vergangeheit) natürlich ein wichtiger
Punkt war/ist.

Auf einem ausgewachsenen PC wäre Deine Frage schnell beantwortet:
1
printf("%+02d %+02d",10,-10);

Was Dein printf auf deinem System anbietet, musst Du leider selbst
rausfinden.

G D

von Markus F. (mfro)


Lesenswert?

Peter schrieb:
> Folgendes funktioniert nicht:
> sprintf(buffer_lcd,"%02d%c",temp_signed,248);


Wenn Du das Vorzeichen immer mit dabei haben möchtest, möchtest Du 
drei Zeichen ausgeben, nicht zwei:
1
printf("%+03d%c", temp_signed, 248);

von Markus F. (mfro)


Lesenswert?

Daniel B. schrieb:
> - Welche Plattform (welcher Micrcontroller) ?
> - Welcher Compiler ?
> - Welche verwendeten Libraries.

für ein dem Standard entsprechend implementiertes printf() ist das alles 
unerheblich.

von dummschwaetzer (Gast)


Lesenswert?

ich werf mal %+.2d in die Runde

von Daniel B. (dbuergin)


Lesenswert?

@Markus F.
Cool, wenn Du es besser weisst:

Code:
printf("%+02d %+02d\n",12003,-12003);

Output:
+12003 -12003

Man beachte: https://en.wikipedia.org/wiki/Printf_format_string ab dem
Paragraphen "Flags field"

Wenn Du schon mit Standards um Dich schlägst, solltest Du sie auch
kennen....

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Daniel B. schrieb:
> printf("%+02d %+02d\n",12003,-12003);

Irrelevant, da die zu formatierende Zahl größer als die minimal
vorgegebene Feldbreite ist.
1
$ printf "%+02d %+02d\n" -85 5
2
-85 +5
3
$ printf "%+03d %+03d\n" -85 5
4
-85 +05

Wie oben schon angemerkt worden ist, zählt das Vorzeichen mit zur
Feldbreite dazu, sodass man diese als 3 angeben muss.  Dann sollte
es mit einem standardkonformen printf() wie gewünscht funktionieren.

von Peter (Gast)


Lesenswert?

@Markus F. (mfro)
Danke Dir!! Funktioniert!!

von Pandur S. (jetztnicht)


Lesenswert?

Hat der Poster auch schon mal nachgeschaut, wieviel Platz das 
printf()-Monstrum im Controller verbraucht ? Irgendwann sollte man sich 
davon loesen...

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Sapperlot W. schrieb:
> Irgendwann sollte man sich davon loesen...

Ja, vor allem sollte man sich von der Vorstellung lösen, dass printf()
generell böse und zu vermeiden sei, nur weil die Zielplattform ein
Controller ist. Auf einem solchen muss man natürlich zwangsweise
masochistisch arbeiten und alles, was andere schon mal vor einem
gebaut haben, ignorieren, damit man es durch eigene, neue Bugs
ersetzen kann – die dann schweinisch effizient programmiert sind.

(Wer Ironie findet, darf sie gern behalten.)

von Markus F. (mfro)


Lesenswert?

Sapperlot W. schrieb:
> Hat der Poster auch schon mal nachgeschaut, wieviel Platz das
> printf()-Monstrum im Controller verbraucht ? Irgendwann sollte man sich
> davon loesen...

Auf (m)einem Cortex M4 etwa 4k. Wüsste nicht, warum ich mich davon 
trennen sollte, nicht benutzter Flash gibt kein Geld zurück...

von Peter D. (peda)


Lesenswert?

Sapperlot W. schrieb:
> Hat der Poster auch schon mal nachgeschaut, wieviel Platz das
> printf()-Monstrum im Controller verbraucht ?

Auf dem AT90CAN128 sind das ~4kB, wen störts. Michrochip nimmt 
ungenutzten Flash nicht zurück.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.