mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Printf


Autor: Matze Mb (eli2006)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich habe ein Problem mit der Funktion printf.
Ich möchte ein char auf dem Terminal ausgeben
z.B. so:

char tmp=0x0c;
printf("%02X",tmp);

Die Ausgabe auf dem Terminal sieht jetzt so aus:

 0c12

Kann mir vielleicht jemand sagen, warum sich die Zahl 12 dahinter
einschleicht. Normalerweise müsste doch auf dem Terminal nur 0c
erscheinen.
Habe einen µC At89s8252 und den Keil Compiler .

Danke im Voraus

Autor: Jens Gerdes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probiere mal printf("%02x",(int)temp);

Autor: Matze Mb (eli2006)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super
Danke Jens
es Funktioniert Danke!

Kurz noch. An was liegt das?

Autor: Jens Gerdes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann ich nicht genau sagen, das liegt wohl an der Parameterübergabe für
printf. Bei anderen Compilern/Bibliotheken ist das nicht unbedingt
erforderlich. Ich konnte auch im Keil Handbuch keinen Hinweis finden.

Autor: Andreas Bombe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das liegt daran, dass %x bei printf per default erstmal unsigned int
ist.  Bei Parameterübergabe über Stack holt sich printf also wie
instruiert ein int vom Stack, formatiert es und gibt es aus.  Wenn du
nun nur ein char übergibst, liest printf eben trotzdem ein int und
damit noch ein weiteres Byte (bei 16 Bit int) vom Stack und gibt diesen
Wert aus.

Datenbreite kannst du printf mitteilen, für char:
printf("%02hhX", tmp);

Das ist zumindest in ISO C99 (hh = char, h = short, l = long).  Im
Zweifelsfall gilt natürlich die Doku der lib, die dein printf zur
Verfügung stellt.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sieht nach einem Bug (oder Feature?) des Compilers aus. Nach C-Norm ist
der Cast nicht notwendig, da bei Übergabe variabler Argumentlisten char
vor der Übergabe automatisch in int konvertiert werden müßte.

Autor: Andreas Bombe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nach ISO C99 (bzw. nach dem aktuellen Working Paper) endet die
automatische Argument-Konvertierung mit dem '...' und damit ist das
kein Bug, sondern korrekte Implementierung.

Eine alternative "Lösung" des Problems wäre gewesen, die Header-Datei
für printf zu "vergessen".  Bei aufgerufenen Funktionen ohne Prototyp
wird alles was nicht int (oder double) ist nach int (außer floats: nach
double) konvertiert.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Nach ISO C99 (bzw. nach dem aktuellen Working Paper) endet die
>  automatische Argument-Konvertierung mit dem '...'

Das stimmt zwar, aber das sind nicht die Konvertierungen, die ich
meine.

"The ellipsis notation in a function prototype declarator causes
argument type conversion to stop after the last declared parameter.
The default argument promotions are performed on trailing arguments."


Mit anderen Worten: Wenn die Funktion einen anderen Typ erwartet, als
ihr übergeben wird, wird keine automatische Konvertierung durchgeführt.
Das ist auch logisch, denn der Compiler weiß ja gar nicht, was die
Funktion erwartet. (Beispiel: Wenn ich einen float a printf übergebe,
aber im Formatstring ein %d für int habe, wird keine automatische
Konverierung float->int durchgeführt).
Die "promotions" hingegen werden bei variablen Argumentlisten
ausgeführt, und dazu gehört auch, daß alle Integers, die in einen int
passen würden, in diesen konvertiert werden.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ... daß alle Integers, die in einen int passen würden, in diesen
> konvertiert werden.

Ist etwas unglücklich formuliert. Ich meinte "... daß Werte eines
Integertypen, dessen Bereich komplett von int abgedeckt wird, nach int
konvertiert werden".

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.