www.mikrocontroller.net

Forum: Compiler & IDEs sprintf mit mehreren parametern


Autor: Chriss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute

hab zu sprintf folgende hilfe gefunden:
http://www.cplusplus.com/reference/clibrary/cstdio...

Mir is leider nicht ganz klar, wie ich die anderen parameter wie
[width][.precision][length]
angebe...?

So sieht mein Code bis jetzt aus:
sprintf(OutBuff, "%X", data);

Die parameter die ich noch angeben möchte sind:
1.) left-justify within the given field width
2.) field width

Hab auch schon gegoogelt, leider nichts hilfreiches gefunden:

Des weitern wollte ich fragen, ob es eine Möglichkeit gibt, die 
Null-Terminierung von sprintf auszuschalten?

schöne Grüße

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beispiele:

data = 0x1234;

sprintf(OutBuff, "%07X", data);

-> "0001234"


sprintf(OutBuff, "%7X", data);

-> "   1234" (drei Leerzeichen davor)


sprintf(OutBuff, "%-7X", data);

-> "1234   " (drei Leerzeichen dahinter)


Wie genau möchtest Du Deinen Wert formatiert ausgeben?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Chriss wrote:
> Hallo Leute
>
> hab zu sprintf folgende hilfe gefunden:
> http://www.cplusplus.com/reference/clibrary/cstdio...
>
> Mir is leider nicht ganz klar, wie ich die anderen parameter wie
> [width][.precision][length]
> angebe...?

Einfach in den Format String reinschreiben.
>
> So sieht mein Code bis jetzt aus:
> sprintf(OutBuff, "%X", data);
sprintf( OutBuff, "%3X", data);

spezifiziert eine Feldbreite von 3 Zeichen

sprintf( OutBuff, "%03X", data);

Feldbreite von 3 Zeichen. Mit 0-en auffüllen.
Wie jetzt left-justify im Formatstring angegeben
wird, weiss ich nicht auswendig. Ich nehme mal an
durch ein '-'
also
sprintf( OutBuff, "%-03X", data );

also einfach alles was du haben willst zwischen % und
dem Datentyp-Spezifizierer in der Richtigen Reihenfolge
hineinpacken.

Die Welt kann manchmal so einfach sein :-)

> Des weitern wollte ich fragen, ob es eine Möglichkeit gibt, die
> Null-Terminierung von sprintf auszuschalten?

Nein. Wozu willst du das?
sprintf erzeugt einen C-String. Und ein C-String ist immer
mit '\0' terminiert. Ansonsten wäre es kein C-String.

Autor: Chriss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> Des weitern wollte ich fragen, ob es eine Möglichkeit gibt, die
>> Null-Terminierung von sprintf auszuschalten?

> Nein. Wozu willst du das?
> sprintf erzeugt einen C-String. Und ein C-String ist *immer*
> mit '\0' terminiert. Ansonsten wäre es kein C-String.

Ich habe eine funktion, die mir, aus mehreren parametern einen frame zum 
übertragen über den uart zusammenstöpselt:

generate_send_frame(u8 source, u8 destination, u16 command,...)

so etwa in der art...
diese funktion generiert mir dann mit den daten die ich übergebe mein 
frame in einem byte array das dann über den uart gesendet werden kann.
Und genau hier verwende ich eben das sprintf, da ich zwischen start und 
endzeichen nur ascii zeichen übertrage.

schöne Grüße

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Chriss wrote:
> so etwa in der art...
> diese funktion generiert mir dann mit den daten die ich übergebe mein
> frame in einem byte array das dann über den uart gesendet werden kann.
> Und genau hier verwende ich eben das sprintf, da ich zwischen start und
> endzeichen nur ascii zeichen übertrage.

Wenn du sowieso eigene Ende-Zeichen benutzt, dann stört doch
das terminierende '\0' nicht weiter.
Es hilft allerdings sehr, wenn du auf den String Funktionen
wie strlen, strcpy, strcat, etc... anwenden willst .-)

Autor: Chriss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger:
Danke
Auf jeden Fall ein großes Lob an dich, hast mir schon mehrmals 
geholfen...

Mach weiter so!

schöne Grüße

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Folgender Code funktioniert bei mir nicht richtig:
#include <stdio.h>
uint8_t i;
const uint32_t Device_Serial2 = 0x00;
i = sprintf( signatureString, "%08X", Device_Serial2 );

Compiler ARM GCC von CrossWorks.
In signatureString steht 8X
Ich erwarte eigentlich 00000000 da ich den String gerne als 
hexadezimalen String mit fester Länge von 8 Zeichen hätte - egal wie 
groß Device_Serial2 tatsächlich ist.
Was stimmt bei den Formatierungsparametern nicht?
Mit "%X" bekomme ich ein hex Ergebnis, aber leider ohne führende 
Nullen...
Unterstützt sprintf die Optionen nicht?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das 0 in %08X muß eine Null sein, kein goßes Ohhh.
Was ist es bei dir? Ich kann das auf meine alten Tage schlecht 
unterscheiden.

Ansonsten kann es auch sein, daß du ein abgemagertes sprintf hast, das 
nciht alle Formatoptionen kennt. Mal die eigene Doku lesen könnte 
helfen.

Autor: DirkB (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian schrieb:
> Unterstützt sprintf die Optionen nicht?

Im ARM CrossWorks Version 2.1 PDF Reference Manual  gefunden:

Some CrossWorks library variants do not support width and precision 
specifiers in order to reduce code and
data space requirements; please ensure that you have selected the 
correct library in the Printf Width/Precision
Support property of the project if you use these.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus Wachtler schrieb:
> Das 0 in %08X muß eine Null sein, kein goßes Ohhh.
> Was ist es bei dir?

Es ist die korrekte Null.

> Ich kann das auf meine alten Tage schlecht unterscheiden.

Tip: Richtige Schriftart verwenden. Die mit neueren Windows-Versionen 
mitgelieferte "Consolas" zeigt bei beliebigen Schriftgrößen immer klar 
unterscheidbare Glyphen für 0O, I1l und die Satzzeichen.

Alternativ wäre auch "Andale Mono" oder deren ältere Variante 
"Monotype.com" zu verwenden.

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, das war der entscheidende Tipp !!!
Printf Width Precision Supported in den Project Properties auf Yes 
setzen und dann geht es!

Autor: Klaus Wachtler (mfgkw)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Rufus Τ. Firefly schrieb:
> Tip: Richtige Schriftart verwenden.

Danke, stimmt im Prinzip.
Eigentlich schaffe ich das meistens noch ganz gut, zumindest mit Brille.
Aber tückischerweise nimmt das Board bei Quelltext mehrere Schriftarten; 
siehe Bild.
Im 0x00 in der Initialisierung ist definitiv eine andere Null zu sehen 
als im Formatstring; deshalb hatte ich den Verdacht.
Kann man das nicht geschickter machen?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Klaus Wachtler schrieb:
> Aber tückischerweise nimmt das Board bei Quelltext mehrere Schriftarten;
> siehe Bild.

Hmm. Bei Dir verwendet das Board anscheinend die Courier und nutzt für 
das Syntax-Highlighting auch noch unterschiedliche Schriftschnitte 
(Fett/normal).

Das sieht bei mir nicht so aus.

Beiliegender Screenshot zeigt Safari unter OS X 10.6, aber mit Firefox 5 
unter XP sieht das bei mir nicht anders aus.

(Wichtig: Da der Screenshot kleiner ist als das Vorschaubildchen, wird 
er hier leicht vergrößert dargestellt, was ihn zu Matsch macht. 
Draufklicken, dann wird er etwas kleiner)

Die Schriftart lässt sich unter FF einstellen:

Im Einstellungsdialog die Seite "Inhalt" aufmachen, dort im Abschnitt 
"Schriftarten & Farben" auf den "Erweitert"-Knopf klicken und unter 
"Feste Breite" die gewünschte andere Schriftart einstellen.

Mein Screenshot zeigt die oben schon erwähnte "Consolas".

Autor: Uwe S. (de0508)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn man etwas weniger Speicher verwenden will, dann geht auch diesen 
Libs von ChAN:

"Embedded printf module for AVR"
http://elm-chan.org/docs/avrlib/xitoa.zip

Geschrieben hat er auch noch diese hier:

"Embedded String Functions"
http://elm-chan.org/fsw/strf/xprintf.html

Man beachte die DEFINES, damit lässt sich viel CODE einsparen !

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.