Hallo, ich brauche eine Idee bei der Umwandlung von einem double-Wert in
einzelne Char-Zeichen. Wie Ihr im unteren Code sehen könnt, hab ich die
Funktion dtostrf schon gefunden und auch erfolgreich eingebunden.
ABER, sie tut nicht ganz genau, was ich will.
Ich will die Werte aus dem strom-Array eins zu eins ausgeben, also mit
allen Nullstellen, auch vor der eigentlichen Zahl.
Im Moment schreibt mir dtostrf bei dem strom[4] Wert: 08.08, 8.08 ins
out_buffer Array, aber ich hätte dort gerne 08.08 stehen. Ebenso ergeht
allen Werten die eine Null voran führen.
Zudem verschieben sich die Werte im temp-Array, wenn eine Null vor dem
Messwert steht nach vorn.
Bsp:
1
strom-Array:16.16
2
->Char-Werteimtemp-Array:(1,6,.,1,6,)
3
strom-Array:08.08
4
->Char-Werteimtemp-Array:(8,.,0,8,,,)
Kann mir da jemand einen Tipp geben, wie ich die Null-Stellen dort
hinein bekomme? Wenn ich mal 00.00 im strom-Array habe, wird es auch
keine Ausgabe geben, das ist unschön.
Danke Euch.
sprintf bietet mehr Möglichkeiten zur Zahlenformatierung, u.a. auch
feste Anzahl Nachkommastellen; wie es vor dem Komma ausschaut, weiß ich
jetzt net auswendig. Schau halt mal nach.
sprintf kenn ich nur in zusammenhang mit ausgaben auf der uart
schnittstelle. das man damit %2.2i machen kann, ist mir bekannt.
kann man damit etwa auch arrays füllen?
mir geht es wirklich primär darum das out_buffer array mit den
Messwerten zu füllen. später soll genau das array auf eine SD Karte
schrieben werden
Jürgen Härig wrote:
> sprintf kenn ich nur in zusammenhang mit ausgaben auf der uart> schnittstelle.
sprintf (man beachte das führende 's') hat erst mal überhaupt nichts
mit der UART zu tun.
Die Aufgabe von sprintf ist es einen Text mithilfe des Formatstrings
zu formatieren, wobei die angegebenen Argumente an die entsprechenden
Stellen eingebaut werden, und das Ergebnis in einem Character
Array (welches natürlich groß genug sein muß) als String abzulegen.
Was du dann mit dem String weiter machst ist deine Sache und
kümmert den sprintf wenig.
> das man damit %2.2i machen kann, ist mir bekannt
dann weist du mehr als der Rest der C-Welt. Die Formatspezifizierung
'i' passt nicht zur Ausgabe eines Floating Point Wertes. Der Format-
specifier dafür wäre 'f'.
2.2 kann auch nicht stimmen. Die Zahl vor dem . ist die komplette
Anzahl der auszugebenden Stellen. Inklusive Voreizeichen und
Kommapunkt
Wenn du also eine Zahl haben willst in der Gestalt xx.yyy
(also 2 Vorkomma und 3 Nachkommastellen), dann brauchst du
dafür schon mindestens eine Feldbreite von 6. Und da ist ein
Vorzeichen noch gar nicht berücksichtigt
Gut.
Ich hab euren Rat befolgt und sprintf getestet.
1
for(a=0;a<=8;a++)
2
{
3
//dtostrf(strom[a],2,2,temp); //stromwert, als char-array umwandeln
4
sprintf(temp,"%2.2f",strom[a]);
5
for(d=0;d<5;d++)
6
{
7
out_buffer[c+d]=temp[d];//einzelne char werte in out_buffer schreiben
8
}
9
out_buffer[c+b]=0x20;
10
c=c+6;
11
}
Allerdings bekomme ich nun "müll" in das temp Array geschrieben.
Besser gesagt: 0x32 an Stelle [0], und 0x63 an Stelle [1].
Das hilft mir nicht sonderlich...
Wenn ich ein Array mit einem String über %s ausgeben lasse... kein
Problem. Auch Int Zahlen, keine sache. Aber sobald ich double bzw. float
Zahlen ausgeben lassen will, landen sinnfreie Werte im temp Array.
Jürgen Härig wrote:
> Gut.>> Ich hab euren Rat befolgt und sprintf getestet.>> for(a=0;a<=8;a++)
Wenn ich so eine for Schleife sehe, läuten bei mir alle
Alarmglocken.
> {> //dtostrf(strom[a],2,2,temp); //stromwert, als char-array> umwandeln> sprintf(temp,"%2.2f",strom[a]);
Da steht ja immer noch 2.2
Wie soll den eine komplette Ausgabe in 2 Zeichen passen, wenn der
Nachkommaanteil schon 2 Stellen verbraucht.
> for(d=0;d<5;d++)> {> out_buffer[c+d] = temp[d]; //einzelne char werte in out_buffer> schreiben> }
Du weist schon, dass die sprintf die Ausgabe als ganz normalern
String formatiert. Oder anders gefragt: Woher weist du eigentlich,
dass das immer 5 Buchstaben sind?
> out_buffer[c+b] = 0x20;
Wenn du Leerzeichen meinst, dann schreibe auch Leerzeichen.
Kein Grund mit ASCII Codes um sich zu schmeissen:
out_buffer[c+b] = ' ';
Die vorhergehende for-Schleife hatte als Schleifenvariable ein
d (wie Dora). Hier kommt jetzt plötzlich ein b (wie Berta) ins
Spiel. Wie das?
Warum nicht ganz einfach:
1
charbuffer[20];
2
3
for(i=0;i<9;++i){
4
sprintf(buffer,"%5.2f",strom[i];
5
strcat(out_buffer,buffer);
6
7
if(i!=9)
8
strcat(out_buffer," ");
9
}
(out_buffer muss bei Eintritt in die Funktion einen korrekten
String enthalten. Wenn diese Ausgabe mit einem leeren String
anfangen soll, dann sicherheitshalber so:
1
charbuffer[20];
2
3
out_buffer[0]='\0';
4
5
for(i=0;i<9;++i){
6
sprintf(buffer,"%5.2f",strom[i];
7
....
(und überprüfen, ob das auch wirklich 9 Strom-Werte oder doch
korrekterweise 8 sind - wegen der for-Schleife)
Karl heinz Buchegger wrote:
>> //dtostrf(strom[a],2,2,temp); //stromwert, als char-array>> umwandeln>> sprintf(temp,"%2.2f",strom[a]);>> Da steht ja immer noch 2.2> Wie soll den eine komplette Ausgabe in 2 Zeichen passen, wenn der> Nachkommaanteil schon 2 Stellen verbraucht.
stimmt. mein fehler
>> for(d=0;d<5;d++)>> {>> out_buffer[c+d] = temp[d]; //einzelne char werte in out_buffer>> schreiben>> }>> Du weist schon, dass die sprintf die Ausgabe als ganz normalern> String formatiert. Oder anders gefragt: Woher weist du eigentlich,> dass das immer 5 Buchstaben sind?
nope, bis zu dem zeitpunkt war mir das nicht bekannt.
>> out_buffer[c+b] = 0x20;>> Wenn du Leerzeichen meinst, dann schreibe auch Leerzeichen.> Kein Grund mit ASCII Codes um sich zu schmeissen:>> out_buffer[c+b] = ' ';
schönheitsfehler :)
> Die vorhergehende for-Schleife hatte als Schleifenvariable ein> d (wie Dora). Hier kommt jetzt plötzlich ein b (wie Berta) ins> Spiel. Wie das?
ähm... das eine b (Berta) hab ich wohl übersehen, als ich alle b´s
entfernen musste, da der foren-spam-filter keine [berta] variablen haben
wollte.
die beispiele hab ich mit dem AVR Studio getestet.
aber anstatt des float (double) werts landen nicht einzelne chars im
array, sondern 0x32 (leerzeichen) an den positionen mit einem 0x63
(fragezeichen) an letzter position.
selbiges geschieht, wenn ich mit snprintf die ausgabe versuche: