dumme Frage zu printf ()

OP #4616740
Lesenswert?
• ▲
▼
#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 #4616797
Lesenswert?
• ▲
▼
@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
Lesenswert?
• ▲
▼
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.
Moderator Persönliche Seite #4617214
Lesenswert?
• ▲
▼
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
Lesenswert?
• ▲
▼
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
Lesenswert?
• ▲
▼
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren