dumme Frage zu printf ()

OP #4616740
#define START 0x02

printf ("\x02%02x:%u:%u\r",adr,data,crc);

mit \x02 funktioniert das ja problemlos. Es wird aber verschiedene 
Varianten geben mit verschiedenen Kennungen für das erste Byte und da 
möchte ich natürlich nicht jedesmal alle Ausgaben ändern. Gibts ne 
Möglichkeit, START einzufügen?

Im Moment mache ich es so:
putchar (START);
printf ("%02x:%u:%u\r",adr,data,crc);

Ist im Prinzip in Ordnung, hätte es trotzdem gerne direkt in printf().
Gast #4616792
> die eierlegende Wollmilchsau "printf"

Ist halt so schön praktisch. Aber jedes mal, wenn mein Programm nicht 
mehr in den Flash passt, sind dass die Stellen, die ich als erstes 
optimiere.
Gast #4616797
@Joachim
>Gerade mal probiert, pro printf() macht das 16 Byte.
>Compiler scheint das nicht zu optimieren.
Du bindest ein riesen Trumm von Funktion ein (die eierlegende 
Wollmichsau braucht sehr viel Platz) und störst Dich an ein paar 
zusätzlichen Bytes?
OP #4616840
Amateur schrieb:
> @Joachim
>>Gerade mal probiert, pro printf() macht das 16 Byte.
>>Compiler scheint das nicht zu optimieren.
> Du bindest ein riesen Trumm von Funktion ein (die eierlegende
> Wollmichsau braucht sehr viel Platz) und störst Dich an ein paar
> zusätzlichen Bytes?

Ja :-)
Es gibt ja nicht nur die eine (hier beispielhafte) Ausgabefunktion, 
sondern etliche (im Moment 17). Daten, Statusmeldungen, Fehlermeldungen 
etc.
Allen gemeinsam ist, dass sie alle mit einem Steuerzeichen beginnen. Und 
das soll je nach Einstellung eben ein anderes sein, sozusagen eine 
variable Konstante :-).

Es wäre schön, wenn sich die Diskussion ab jetzt auf die eigentliche 
Frage beziehen würde.
Wenn es sich nicht per #define machen lässt ist es auch in Ordnung, dann 
lass ich eben putchar.
(Firma: L-E-A) #4617041
Peter II schrieb:
> teste mal mit
>
1
> #define START 0x02
2
> printf ("\x" START "%02x:%u:%u\r",adr,data,crc);
3
>

Wohl eher so:
1
  #define START "0x02"
2
  printf (START "%02x:%u:%u\r",adr,data,crc);
oder so:
1
  #define START "02"
2
  printf ("0x" START "%02x:%u:%u\r",adr,data,crc);


Grüßle,
Volker.
OP #4617180
funktioniert beides nicht, aber so:

#define START "\x03"
printf (START"%02....

Und jetzt sehe ich, dass das exakt die Lösung von Mikro77 ist :-(
Was habe ich da bloss falsch getippselt?

Und was dabei gelernt - bis jetzt wusste ich nicht, dass man einfach 
mehrere Formatstrings nehmen kann.
Moderator Persönliche Seite #4617214
Volker B. schrieb:
> Peter II schrieb:
>> teste mal mit
>>> #define START 0x02
>> printf ("\x" START "%02x:%u:%u\r",adr,data,crc);
>>
> Wohl eher so:  #define START "0x02"
>   printf (START "%02x:%u:%u\r",adr,data,crc);
>   oder so:  #define START "02"
>   printf ("0x" START "%02x:%u:%u\r",adr,data,crc);

Volker B. schrieb:

> Uralter Compiler? GCC 4.8.2 "frisst" meine Codeschnipsel ohne Murren und
> erzeugt sogar das gewünschte Ergebnis.

Ach? Ziemlich frech formuliert, denn:

Dein 1. Vorschlag:

> #define START "0x02"
>   printf (START "%02x:%u:%u\r",adr,data,crc);

wird vom Compiler so zusammengebaut:

>   printf ("0x02%02x:%u:%u\r",adr,data,crc);

D.h. es wird der String "0x02" am Anfang ausgegeben. Es war aber ein 
einzelnes Startzeichen gefordert, dass dem Hex-Wert 0x02 enstpricht.

Dein 2. Vorschlag:

>   #define START "02"
>   printf ("0x" START "%02x:%u:%u\r",adr,data,crc);

wird ebenso vom Compiler so zusammengebaut:

>   printf ("0x02%02x:%u:%u\r",adr,data,crc);

Und hat natürlich auch nicht den gewünschten Effekt. Der String "0x02" 
ist nicht gewünscht.

Bitte genauer lesen, bevor man alles auf die Compilerversion schiebt und 
damit die Diskussion in eine vollkommen falsche Richtung lenkt.
Moderator Persönliche Seite #4617338
H.Joachim S. schrieb:
> Und was dabei gelernt - bis jetzt wusste ich nicht, dass man einfach
> mehrere Formatstrings nehmen kann.

Seit C89.  Nur so lässt sich nämlich das Problem lösen, dass das
syntaktische Ende einer \x-Escapefolge nicht nach irgendeiner Anzahl
von N weiteren Zeichen ist, sondern erst mit dem ersten Zeichen,
welches nicht mehr hexadezimal ist.  Sowas:

"\x0D\x0AAlles im Eimer\0x0D0x0A"

würde nämlich nicht "<CR><NL>Alles im Eimer<CR><NL>" ausgeben,
sondern "<CR>ªlles im Eimer<CR><NL>" (mal in der Annahme von
ISO8859-1).  Schreibt man es als:

"\x0D\x0A" "Alles im Eimer\x0D\x0A"

funktioniert es.

Bei den historisch älteren Oktalzahlen war es noch so, dass diese
automatisch auf maximal drei Oktalziffern limitiert waren, aber mit
C89 sollte auch die Möglichkeit für andere Zeichensätze als solche
mit nur 8 Bit geschaffen werden, daher kein „automatisches“ Ende
eines hexadezimal angegebenen Zeichens.
(Firma: L-E-A) #4617368
Frank M. schrieb:

> Dein 1. Vorschlag:
>
>> #define START "0x02"
>>   printf (START "%02x:%u:%u\r",adr,data,crc);
>
> wird vom Compiler so zusammengebaut:
>
>>   printf ("0x02%02x:%u:%u\r",adr,data,crc);
>
> D.h. es wird der String "0x02" am Anfang ausgegeben. Es war aber ein
> einzelnes Startzeichen gefordert, dass dem Hex-Wert 0x02 enstpricht.
>

Danke für Deine erhellenden Worte! Ich hatte die ausführliche Antwort 
des Fragestellers "funktioniert beides nicht" als Hinweis auf eine 
Compiler-Fehlermeldung gedeutet.

Grüßle,
Volker.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.