Hallo allezusammen,
ich habe unglaubliche Problem bei der stdio-Funktion sprintf().
Folgender Code treibt mich in den Wahnsinn.
static signed char near HlpArr[9];
byte ii;
sprintf((&HlpArr[0]), "%8.2f", X);
for(ii=0;ii<sizeof(HlpArr);ii++)
{
if(HlpArr[ii]=='.')
{
HlpArr[ii]=',';
break;
}
}
Ich will damit z.B so ein Ergebnis erreichen -1574,34
Für wieviel Zeichen habe ich insgesamt Platz reserviert? 8, oder?
Die Terminierung /0 passt auch in HlpArr.
Was mach ich falsch?
g a s t schrieb:> 8 Zeichen vorm Komma> 1 Zeichen = Komma> 2 Zeichen dahinter> 1 Zeichen = \0>> macht 12 Zeichen, reserviert sind nur 9.
ist falsch, sorry.
K&R sagt
> A number specifying a minimum field width. The converted argument will be> printed in a field at leat this wide, and wider if necessry. If the> converted argument has fewer characters than the field width it will be> padded on the left (or right, if left adjustement has been requested) to> make up the field width.
Irren ist menschlich...
@DirkB
"8.2 heißt 8 zeichen insgesamt davon ist ein . und 2 Nachkomma.
Das Vorzeichen kommt noch optional davon ab."
Um mein Ergebnis(-1574,34) zu bekommen muss ich so
formatieren
sprintf((&HlpArr[0]), "%5.2f", X);
oder
Nein.
Dein erster Ansatz ist schon richtig. Die Zahl vor dem . gibt die
Feldlänge an. Und das sind bei dir 8 Zeichen.
Martin schrieb:> 1 Zeichen Minus> 4 Zeichen Ziffern> 1 Zeichen Komma> 2 Zeichen Nachkommastellen
Ist alles richtig.
Martin schrieb:> Um mein Ergebnis(-1574,34) zu bekommen muss ich so> formatieren>> sprintf((&HlpArr[0]), "%5.2f", X);
Du musst aber sicher sein, dass er nicht über -9999.99 rausgeht, wenn du
das Array mit 8+'\0', also 9, chars definierst. Auf dem PC gibt das
segfaults, wie das "Spinnen" dann beim Controller aussieht, weiss ich
nicht.
Immer erstmal vom worst-case ausgehen und wenns klappt bytes sparen
anfangen.
sprintf hat als Rückgabewert die Anzahal der ausgegebenen Zeichen.
Die sollten kleiner als 9 sein.
Aber was funktioniert denn nicht?
Hast du auch die Fließkommabibliothek ausgewählt?
(ich meine nicht math.h)
Um unnötige Diskussionen vorwegzunehmen:
Im folgenden irre ich selbst, und zwar massiv.
Damit sich alle drüber freuen können, lasse ich den Irrtum hier stehen.
Abschließende Bemerkung hier:
Beitrag "Re: sprintf() ein Rätsel"
##############
DirkB schrieb:> 8.2 heißt 8 zeichen insgesamt davon ist ein . und 2 Nachkomma.> Das Vorzeichen kommt noch optional davon ab.
Das ist eindeutig falsch.
8.2 bedeutet mindestens 8 Zeichen vor dem Dezimalpunkt (mit führenden
Leerzeichen aufgefüllt), Dezimalpunkt und zwei Nachkommastellen.
g a s t schrieb:> ist falsch, sorry.
Auch Du liegst daneben.
> K&R sagt>>> A number specifying a minimum field width. The converted argument will be>> printed in a field at leat this wide, and wider if necessry. If the>> converted argument has fewer characters than the field width it will be>> padded on the left (or right, if left adjustement has been requested) to>> make up the field width.
Die Feldbreite, die hier beschrieben wird, bezieht sich nur auf die
Anzahl der Stellen vor dem Dezimalpunkt.
Also:
double x = 1.234;
printf("#%3.2f#", x);
ergibt
# 1.23#
printf("#%2.3f#", x);
ergibt
# 1.234#
printf("#%8.2f#", x);
ergibt
# 1.23#
Rufus Τ. Firefly schrieb:> printf("#%8.2f#", x);>> ergibt> # 1.23#
Nein, denn die 8 ist die minimale Feldlänge. Und da alles da rein pastt,
wird die nicht überschritten.
printf("<%8.2f>", x);
ergibt
< 1.23>
:12345678
Rufus Τ. Firefly schrieb:> Die Feldbreite, die hier beschrieben wird, bezieht sich nur auf die> Anzahl der Stellen vor dem Dezimalpunkt.
Nein. Es ist definitiv die Gesamtbreite.
Rufus Τ. Firefly schrieb:> Erklärungsversuch: Es ist Freitag. Nach eins. Da arbeitet doch eh'> keiner mehr, schon gar kein Hirn.
Die Ausrede habe ich heute auch schon benutzt :-)