Hallo,
ich möchte gerne die Formatierung der sprintf-Funktion über die Variable
digits steuern
zB:
statt
sprintf(string,"%3d",value);
sprintf(string,"%"+digits+"d,value);
klappt nicht!
Wie mache ich es, dass "digits" in diesem Zusammenhang al0s Variable
gesehen wird und den Zahlenwert ersetzt?
Sorry, versteh ich nicht ganz.
Ich möchte halt das der Wert der Variable digits an der Stelle
eingesetzt wird, wie hier die 3 :
sprintf(string,"%3d",value);
Klaus Wachtler schrieb:> @Jörg G.:>> wenigstens einer, der auch mal die man-page zu Formatstrings gelesen hat> :-)
:-)
Und ehe es diese Möglichkeit gab, hat man sich halt daran erinnert, dass
der Formatstring auch nur ein String ist. Es spricht also nichts
dagegen, sich diesen ebenfalls mittels Programm generieren zu lassen
1
charFormatString[10];
2
3
sprintf(FormatString,"%%%dd",digits);
4
sprintf(string,FormatString,value);
Aber mit dem * ist es natürlich eleganter, solange man nur eine Zahl
ersetzen lassen will. Will man noch zusätzliche 'Optionen' in den
Formatstring bei Bedarf einbauen (führende 0-en, Vorzeichen, etc.) dann
ist die Generiermethode immer noch kein schlechter Weg.
Bekomme vom Compiler aber leider folgende Fehlermeldung:
function argument #2 of type 'flash unsigned char[10]' is incompatible
with required parameter of type 'flash unsigned char*'
Der komische Compiler pacht automatisch String-Literale ins Flash und
erwartet sie dort auch für *printf*-Funktionen?
Unterstützt der keine nicht-konstanten Format-Strings?
Dort steht folgendes:
int sprintf(char *str, char flash *fmtstr [ , arg1, arg2, ...])
this function is identical to printf except that the formatted
text is placed in the null terminated character string str.
The function returns the number of outputed characters.
OK, hier ist sie
int printf(char flash *fmtstr [ , arg1, arg2, ...])
outputs formatted text, using putchar, according to the format
specifiers in the fmtstr string.
The format specifier string fmtstr is constant and must be located in
FLASH memory.
The implementation of printf is a reduced version of the standard C
function.
This was necessary due to the specific needs of an embedded system and
because the full implementation would require a large amount of FLASH
memory space.
The function returns the number of outputed characters.
...
Du musst, wie schon geschrieben, die Doku von printf anschauen. Die
besteht nicht nur aus dem von Dir geposteten Text sondern auch aus der
Beschreibung des Formatstrings.
Es ist zu prüfen ob dies hier:
>The implementation of printf is a reduced version of the standard C>function.
evtl. auch bedeutet, das '*' nicht unterstützt wird.
Wenn '*' nicht unterstützt wird, dann musst Du eine eigene
Ausgabefunktion bzw. Stringerstellungsfunktion basteln, die eine
variable Anzahl Stellen ausgibt.
Irgendwie kommt mir das auch komisch vor.
>ich hab nun folgendes getestet:> char FormatString[10];> sprintf( FormatString, "%%%dd", digits );> sprintf( string, FormatString, value );>Bekomme vom Compiler aber leider folgende Fehlermeldung:>function argument #2 of type 'flash unsigned char[10]' is incompatible>with required parameter of type 'flash unsigned char*'
Auf welche Zeile genau bezieht sich die Fehlermeldung? Das einzige wo Du
ein unsigned char[10] übergibst ist das erste printf. FormatString hat
aber gar keinen Type-Modifier "flash". Ist das wirklich der
Originaltext?
>Gibt's wo ein fertiges Beispiel für int und float-Ausgabe?
Häh? Das sind absolute Grundlagen. Dafür gibts höchstens in einem
Lehrbuch Beispiele.
Klär doch erstmal die Punkte die offen sind.
>In der Doku steht doch eindeutig, daß der Format-String im Flash sein>muss. Also werden keine dynamisch erzeugten Formatstrings unterstützt.
Hm. Das erklärt aber nicht, warum das hier:
Guru schrieb:>>In der Doku steht doch eindeutig, daß der Format-String im Flash sein>>muss. Also werden keine dynamisch erzeugten Formatstrings unterstützt.>> Hm. Das erklärt aber nicht, warum das hier:>>
1
>sprintf(string,"%*d",digits,value);
2
>
>> nicht geht.
Ak, ok. Das fällt im Zweifelsfalle fällt's unter "reduced version of the
standard C function". ;-)
OK, dann programmier ich mir die Funktion selbst..
Hier erst mal der Code für die Integer-Ausgabe:
Die Übergabeparamter sind (int value, unsigned char digits)
[c]
unsigned char string[StringBufferSize];
unsigned char string_temp[StringBufferSize];
unsigned int digits_temp;
unsigned int i;
itoa(value, string_temp);
digits_temp = strlen(string_temp);
if(digits_temp < digits)
{
for(i=0; i<((unsigned int)digits-digits_temp); i++)
{
strcat(string," ");
}
}
strcat(string, string_temp);
[\c]
Dies funktioniert die meiste Zeit ganz gut, nur wenn manchmal stehen am
Anfang des Strings noch alte Ergebnisse oder andere Zeichen.
Wie kann ich die beiden Arrays:
unsigned char string[StringBufferSize];
unsigned char string_temp[StringBufferSize];
bei der Deklaration initialisieren?
Seht ihr sonst im dem Code noch einen Fehler oder habt einen
Verbesserungsvorschlag?
An einer kompletten Funktion könnte man vielleicht Fehler sehen ....
Abgesehen davon, daß strcat() da vielleicht nicht besonders effizient
ist.
Willst du die Leerzeichen links oder rechts angefügt haben?
Ggf. wäre es vielleicht sinnvoller, das Schreiben des Werts in einen
String und das Auffüllen mit Leerzeichen auf eine gewünschte Länge
(links oder rechts auffüllen) zu trrennen, sonst musst du das Auffüllen
für int, unsigned int, short, float... jedesmal neu machen.
PS:
Wenn es dann nur noch darum geht, eine int irgendwie in Textform zu
bringen (12 -> "12"), dann ist sprintf() nicht das Mittel der Wahl. Denn
sprintf() ist eine Monsterfunktion, die viel Code hat und nicht
besonders schnell ist.
Besser nimmt man dann etwas wie itoa().